Crea un clone di Simon! [chiuso]


18

Scenario: durante la programmazione hai un improvviso bisogno nostalgico per gli anni '80 e giochi di cattivo gusto.

Requisiti: crea un programma GUI (il testo probabilmente non funzionerà) per Simon, il gioco. È possibile fare clic sull'input o premere un tasto. Dovresti dividere lo schermo in 4 regioni: giallo, blu, rosso, verde. All'inizio del gioco, un colore casuale si illumina e lo si attiva. Quindi, si accendono due luci, una dopo l'altra, e devi attivarle in ordine, ecc. Il gioco termina quando premi il colore sbagliato.

bonus:

-100 se includi il suono (viene suonata una nota diversa quando si preme ciascuna regione e quando il gioco mostra i colori)

-25 se includi un contatore di punteggio.


13
La GUI e il code-golf generalmente non funzionano insieme.
user80551

3
Questo dovrebbe essere fattibile in Minecraft. Non mi sorprenderebbe se qualcuno lo avesse già fatto. Non so come si potrebbe presentare questo qui ...
Kninnug,

@Kninnug la quantità di blocchi * byte per blocco;)
Liam McInroy

@Liam McInroy AFAIK un blocco è di 2 byte per l'ID blocco e 4 byte per memorizzare la sua posizione nel mondo.
Pavel,

Risposte:


12

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

Questa è principalmente una risposta a "Il testo probabilmente non funzionerà"; il seguente script bash basato su testo funziona perfettamente Konsole, gnome-terminalecc. sul mio computer Ubuntu 14.04. Per creare le regioni di colore imposta il colore di sfondo del testo. In effetti, l'aggiunta di testo rende il gioco più accessibile ai giocatori daltonici. Per rendere il gioco ancora più accessibile, legge i personaggi che il giocatore deve premere (presuppone che espeaksia installato). Presuppone inoltre che l'unica corrispondenza del file /d*/ur*/sia /dev/urandom. Per le regioni di colore di dimensioni non banali, probabilmente si desidera impostare le dimensioni del testo su dimensioni piuttosto grandi. Inoltre, se si desidera che le regioni di colore siano quadranti, è necessario eseguirlo in un terminale di due caratteri di larghezza.

Per giocare premere y, r, g o b come appropriato.

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

Questa soluzione contiene due caratteri ESC non stampabili. Sebbene questi caratteri ESC vengano visualizzati nell'anteprima, sembrano essere eliminati dopo l'invio, quindi il codice sopra è un wrapper che genera e gestisce il golf simon_golf.sh.

Vedi anche la versione originale non modificata e la versione leggermente più giocabile a 256 byte .

Le schermate seguenti sono quando la luce gialla è accesa e il punteggio del giocatore è 7. Lo screenshot a destra è stato desaturato per simulare il daltonismo.

immagine dello schermoBianco e nero


Troppo grande per un golf di codice ...
John Dvorak,

3
Vero. Sono qui più per i "Puzzle di programmazione" che per il "Codice Golf".
Gmatht

L'ho leggermente golfato ora.
gmatht

24

Scratch, 1604-125 = 1479

Sono qui per divertimento, non per il golf.

Modifica: metodo di punteggio aggiornato basato sul consenso della comunità .

Programma principale:

principale

Sprite individuali:

folletto

Questo è lo sprite con il numero 0. Gli altri sprite hanno lo stesso script, tranne il numero.

Gioca online .

Codice utilizzato per il conteggio dei byte: (Utilizzo dello snippet per nascondere il codice)

Nota: codice generato automaticamente utilizzando il generatore di scratchblock , modificato in qualche modo il generatore non gestisce correttamente i numeri decimali (trattando 0,3 come 0).

Immagine dello schermo:

immagine dello schermo

Nota: non premere due pulsanti entro 0,3 secondi.


Ah, va bene. Una pausa dopo una risposta corretta sarebbe buona, comunque, o qualche suono di congratulazioni. Sembra che la mia ultima mossa sia parte del modello. Inoltre, suonerei i suoni più lentamente del limite di input, poiché la corrispondenza di ritmo e tono è il modo in cui le persone (me stesso, almeno) suonano ... comunque, mi piace. +1
krs013

1
Graffiare? Srs? Inoltre, il conteggio dei byte imo dovrebbe essere la dimensione totale dell'SB2.
cjfaure,

1
@Trimsty Quindi sarebbero 126833 byte (compresi i file audio wav ecc.), Motivo per cui ho detto "Sono qui per divertimento, non per il golf".
user12205

Secondo il punteggio che ho suggerito qui , il punteggio è 60 (27 blocchi, 20 caratteri / cifre nelle costanti, 8 operatori, 5 usi variabili). Con i bonus ottieni -65.
ugoren,

@ugoren Questa è in realtà solo una risposta parziale. Ci sono 4 sprite e viene mostrato solo lo script per uno, poiché gli altri sprite hanno script quasi identici tranne il numero. Aggiornerò la risposta in base al tuo punteggio. Grazie.
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

inserisci qui la descrizione dell'immagine


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}

Ho aggiunto nuove righe qui per evitare lo scorrimento laterale, ma funziona come una riga, quindi il conteggio dei personaggi è senza nuove righe.

Immagine dello schermo: Schermata di gioco

Giocare:

  • Apri PowerShell ISE (v3), incolla lo script nell'editor di testo, premi F5 per eseguirlo.
  • Il gioco illuminerà un colore, riprodurrà un suono, quindi attenderà l'input
  • Premere un numero (0 = rosso, 1 = giallo, 2 = blu, 3 = verde), quindi Invio.
  • Se sbagli, stampa il punteggio ed esce. (NB. Potrebbe uscire dalla console).
  • Se hai ragione, vale per due note.
  • È necessario premere Invio tra ciascuna nota durante la riproduzione della sequenza.

Commenti:

  • "dividi lo schermo in 4 regioni" - non hai detto che dovevano essere quarti, quindi non lo sono.
  • È difficile vedere il blu illuminarsi sullo sfondo blu, ma lo fa.
  • Eseguire in PowerShell ISE - nel prompt normale "DarkYellow" viene visualizzato in bianco.
  • Si può presumibilmente giocare a golf con altri 28 caratteri rimuovendo alcuni dei tempi (rendendo ancora il gioco giocabile) e interpretando la regola "suono (una nota suonata quando si preme e quando il gioco mostra i colori)" significa che "possono hanno tutti lo stesso suono - errore predefinito DING ", ma penso che sia troppo lontano dallo spirito di esso.

0

ZXBasic: 422-100-25 = 297

Questo conta sicuramente come un bisogno nostalgico per gli anni '80 ...

ZXBasic utilizza una combinazione di comandi di tipo FreeBASIC e ZX Spectrum BASIC per consentire loop e ripetizioni che poi si trasformano in formato TZX per essere caricati in un emulatore Spectrum.

Questa versione cambia il bordo (sebbene una legenda sullo schermo indichi quale tasto premere). Suona le stesse note del gioco originale di 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

Miglior punteggio In gioco


0

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

inserisci qui la descrizione dell'immagine

Versione HTML + Js troppo gonfia.

Riproduce suoni tramite l' API Web Audio .

Le frequenze delle note dovrebbero essere quelle originali di Simon, anche i colori e la posizione dei colori.

C'è una demo online qui: http://www.dantonag.it/miniSimon.html . Funziona con browser compatibili con Web Audio (almeno Chrome e Firefox, IE non lo supporta, 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>

Il mio record è di 15 (sono piuttosto cattivo in questo gioco). Qual è il tuo?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.