Crie um Simon Clone! [fechadas]

18

Cenário: durante a programação, você sente uma súbita necessidade nostálgica dos anos 80 e de jogos bregas.

Requisitos: Crie um programa GUI (o texto provavelmente não funcionará) para o jogo Simon. A entrada pode estar clicando ou pressionando uma tecla. Você deve dividir a tela em 4 regiões: amarelo, azul, vermelho, verde. Quando o jogo começa, uma cor aleatória acende e você a ativa. Então, duas luzes acendem, uma após a outra, e você precisa ativá-las em ordem, etc. O jogo termina quando você pressiona a cor errada.

Bônus:

-100 se você incluir som (uma nota diferente é tocada ao pressionar cada região e quando o jogo mostra as cores)

-25 se você incluir um contador de pontuação.

qwr
fonte
13
GUI e código-golfe geralmente não funcionam juntos.
user80551
3
Isso deve ser possível no Minecraft. Não me surpreenderia se alguém já o tivesse. Não sei como alguém enviaria isso aqui ...
Kninnug 29/03
@Kninnug a quantidade de blocos * bytes por bloco;)
Liam McInroy
@Liam McInroy AFAIK um bloco tem 2 bytes para o ID do bloco e 4 bytes para armazenar sua posição no mundo.
Pavel

Respostas:

12

Bash 318 297 281 273 268 244 240-125 115 =

Isso é principalmente uma resposta para "O texto provavelmente não funcionará"; o seguinte script bash baseado em texto funciona bem Konsole, gnome-terminaletc. na minha máquina Ubuntu 14.04. Para criar as regiões de cores, ele define a cor do plano de fundo do texto. De fato, adicionar texto torna o jogo mais acessível para jogadores daltônicos. Para tornar o jogo ainda mais acessível, ele lê os personagens que o jogador precisa pressionar (assume que espeakestá instalado). Ele também pressupõe que a única correspondência de arquivo /d*/ur*/seja /dev/urandom. Para que as regiões de cores sejam de tamanho não trivial, você provavelmente deseja definir um tamanho de texto bastante grande. Além disso, se você deseja que as regiões de cores sejam quadrantes, é necessário executá-las em um terminal com dois caracteres de largura.

Para reproduzir, pressione y, r, g ou b, conforme apropriado.

cat <<"EOF"|sed s/E/`echo -e '\E'`/>simon_golf.sh;bash simon_golf.sh;wc simon_golf.sh
d(){ echo Ecx1r09mRx2g10mGx3y11mYx4b14mBx0m$s|sed s/.$1"//
s/[rgyb]..//g
s/x/E[48;5;/g";};x(){ d $c;espeak $c;d j;};l(){
for c in $o;{ eval $1;x;};};f(){ o=$o\ `tr -dc yrgb</d*/ur*|head -c1`
l;l 'read -n1 i;[ $c = $i ]||exit;let s++';f;};f
EOF

Esta solução contém dois caracteres ESC não imprimíveis. Embora esses caracteres ESC apareçam na visualização, eles parecem ser excluídos após o envio, portanto, o código acima é um invólucro que gera e executa os campos de golfe simon_golf.sh.

Veja também a versão original não destruída , e a versão um pouco mais jogável de 256 bytes .

As capturas de tela abaixo são quando a luz amarela está acesa e a pontuação do jogador é 7. A captura de tela à direita foi dessaturada para simular daltonismo.

captura de telaPreto e branco

gmatht
fonte
Demasiado grande para um campo de golfe código ...
John Dvorak
3
Verdade. Estou aqui mais pelos "Puzzles de programação" do que pelo "Code Golf".
gmatht
Eu joguei um pouco agora.
gmatht
24

Arranhão, 1604 - 125 = 1479

Estou aqui por diversão, não por golfe.

Editar: método de pontuação atualizado com base no consenso da comunidade .

Programa principal:

a Principal

Sprites individuais:

sprite

Este é o sprite com número 0. Os outros sprites têm o mesmo script, exceto o número.

Jogue com ele online .

Código usado para contagem de bytes: (usando o snippet para ocultar o código)

Nota: Código gerado automaticamente usando o gerador de scratchblocks , modificado porque, de alguma forma, o gerador não manipula corretamente números decimais (tratando 0,3 como 0).

Captura de tela:

captura de tela

Nota: Não pressione dois botões dentro de 0,3 segundos.

user12205
fonte
Ah, isso é legal. Uma pausa após uma resposta correta seria boa ou um som de congratulações. Parece que meu último passo faz parte do padrão. Além disso, eu tocava os sons mais lentamente do que o limite de entrada, já que a combinação de ritmos e tons é como as pessoas (eu, pelo menos) tocam ... ainda assim, eu gosto. 1
krs013
1
Coçar, arranhão? Srs? Além disso, a contagem de bytes imo deve ser o tamanho total do SB2.
Cjfaure 29/03
1
@ Trimsty Então seriam 126833 bytes (incluindo os arquivos de som wav etc.), e foi por isso que eu disse: "Estou aqui por diversão, não por golfe".
user12205
De acordo com a pontuação sugerida aqui , a pontuação é 60 (27 blocos, 20 caracteres / dígitos em constantes, 8 operadores, 5 usos variáveis). Com bônus, você recebe -65.
Ugoren
@ugoren Esta é realmente apenas uma resposta parcial. Existem 4 sprites, e apenas o script de um é mostrado, pois os outros sprites têm scripts quase idênticos, exceto o número. Vou atualizar a resposta com base na sua pontuação. Obrigado.
user12205
3

Mathematica, 409 - 125 = 284

k = 2;
p = Tuples[{0, 1}, 2];
f[c_, p_] := 
 EventHandler[{c, Rectangle[p]}, 
  "MouseClicked" :> (AppendTo[x, p]; Beep[]; g)]
h[R_] := (i = 1; 
  RunScheduledTask[
   H = If[OddQ@i, 
     Beep[]; {EdgeForm[{Thickness[0.02], Black}], FaceForm[], 
      Rectangle@R[[Ceiling[i/2]]]}, {}]; i++, {.3, 2 Length@R}])
s := (m = 0; x = {}; h[R = RandomChoice[p, k]];)
g := (m++; If[Take[R, m] != x, k = 2; s, If[m == k, k++; s]])
Dynamic@Graphics[{MapThread[f, {{Yellow, Red, Blue, Green}, p}], H}, 
  PlotLabel -> k]
s

insira a descrição da imagem aqui

swish
fonte
2

Windows PowerShell (CLI), 272 - 100 - 25 = 147

$d={param($c)cls;sleep -m 99;'R','Y','Blu','Gre'|
%{Write-Host '#' -N -F "$(if($i%4-ne $c){'Dark'})$_";
$i++}};$b={param($c)&$d $c;[console]::Beep(($c+1)*99,700);&$d};
$m=@();$s=0;for(){$m+=0..3|Get-Random;$m|%{&$b $_};$m|%{
if((read-host)-ne $_){$s;exit}&$b $_};$s++;sleep 1}

Adicionei novas linhas aqui para evitar a rolagem lateral, mas funciona como uma linha para que a contagem de caracteres seja sem novas linhas.

Captura de tela: Captura de tela do jogo

Jogar:

  • Abra o PowerShell ISE (v3), cole o script no editor de texto e pressione F5 para executar.
  • O jogo acende uma cor, toca um som e aguarda a entrada
  • Pressione um número (0 = vermelho, 1 = amarelo, 2 = azul, 3 = verde) e pressione Enter.
  • Se você estiver errado, ele imprime a pontuação e sai. (Nota: pode sair do console).
  • Se você estiver certo, isso vale para duas notas.
  • Você deve pressionar Enter entre cada nota ao reproduzir a sequência.

Comentários:

  • "divida a tela em 4 regiões" - você não disse que eles precisavam ser quartos, portanto não são.
  • É difícil ver o azul acender no fundo azul, mas é verdade.
  • Execute no PowerShell ISE - no prompt normal "DarkYellow" aparece em branco.
  • É possível argumentar que você pode jogar com outros 28 caracteres removendo parte do tempo (ainda tornando o jogo jogável) e interpretando a regra "som (uma nota tocada ao pressionar e quando o jogo mostra as cores)" para significar "eles podem todos são o mesmo som - erro padrão DING ", mas acho que isso é muito longe do espírito dela.
TessellatingHeckler
fonte
0

ZXBasic: 422 - 100 - 25 = 297

Definitivamente, isso conta como um desejo nostálgico dos anos 80 ...

O ZXBasic usa uma combinação de comandos do tipo FreeBASIC e o ZX Spectrum BASIC para permitir loops e repetições que depois se transformam no formato TZX para serem carregados em um emulador Spectrum.

Esta versão altera a borda (embora uma legenda na tela diga qual tecla pressionar). Ele toca as mesmas notas que o jogo original do Simon ( http://en.wikipedia.org/wiki/Simon_%28game%29 ).

d=0.5:s=0:l=1:t=1:n$="4261":dim m(4)=>{-8,9,1,4}
border 7
while l>0
 cls:a$="":print at 1,1;"Level: ";t;at 2,1;"Score:";s::for i=1 to 4:print at 0,i;paper val(n$(i));ink 0;i:next
 for i=1 to t
  c=1+int(rnd*4)
  border val(n$(c)):beep d,m(c):border 7
  a$=a$+str(c)
 next
 print at 10,1;"your turn"
 p$="":i=1
 do
  pause 100:k$=inkey:print at 6,i;k$
  if k$=a$(i) then s=s+1:print at 2,7;s:beep d,m(val(k$)):i=i+1
  else l=l-1:i=t+1:print "bad luck!"
  end if
 loop until i>t 
 t=t+1:pause 25
end while

Melhor pontuação Jogando

Brian
fonte
0

HTML5 e Javascript, 1118-100-25 = 993 bytes

insira a descrição da imagem aqui

Versão HTML + Js muito inchada.

Reproduz sons através da API de áudio da Web .

As frequências das notas devem ser as originais de Simon, as cores e o posicionamento das cores também.

Há uma demonstração online aqui: http://www.dantonag.it/miniSimon.html . Funciona em navegadores compatíveis com Web Audio (pelo menos Chrome e Firefox, o IE não suporta, AFAIK).

<html><script>
var hc=["#0f0","red","#ff3","blue"],lc=["#090","#930","#cc0","#33c"],nt=[391,329,261,195],ln=[],qpos=0,pm=0,x,ct=new AudioContext;function ps(a,d){var b=ct.createOscillator();b.frequency.value=d;b.connect(ct.destination);var c=ct.createGain();b.connect(c);c.connect(ct.destination);c.gain.value=-.5;x[a].style.backgroundColor=hc[a];b.start(0);setTimeout(function(a,b){a.stop(0);x[b].style.backgroundColor=lc[b]},500,b,a)}
function w(a){2==pm&&(a!=ln[qpos]?(pm=3,document.getElementsByTagName("span")[0].innerHTML="game over!",ps(a,156)):(qpos++,ps(a,nt[a]),qpos>=ln.length&&(pm=qpos=0)))}function ml(){if(0==pm)document.getElementsByTagName("div")[0].innerHTML=ln.length,ln.push(Math.floor(4*Math.random())),pm=1;else if(1==pm){var a=ln[qpos];qpos<ln.length?(ps(a,nt[a]),qpos++):(qpos=0,pm=2)}setTimeout(ml,500)}window.onload=function(){setTimeout(ml,1);x=document.getElementsByTagName("td")};</script><div>0</div><table cellpadding=40><tr><td bgcolor=#090 onmousedown=w(0)><td bgcolor=#930 onmousedown=w(1)><tr><td bgcolor=#cc0 onmousedown=w(2)><td bgcolor=#33c onmousedown=w(3)></table><span></span>

Meu recorde é 15 (sou muito ruim nesse jogo). O que é seu?

Gabriele D'Antona
fonte