Erstelle einen Simon-Klon! [geschlossen]

18

Szenario: Während Sie programmieren, verspüren Sie einen plötzlichen nostalgischen Drang nach den 80ern und kitschigen Spielen.

Anforderungen: Erstellen Sie ein GUI-Programm (Text wird wahrscheinlich nicht funktionieren) für Simon, das Spiel. Die Eingabe kann durch Klicken oder Drücken einer Taste erfolgen. Sie sollten den Bildschirm in 4 Bereiche unterteilen: Gelb, Blau, Rot, Grün. Wenn das Spiel startet, leuchtet eine zufällige Farbe auf und du aktivierst sie. Dann leuchten nacheinander zwei Lichter auf und Sie müssen diese in der richtigen Reihenfolge aktivieren. Das Spiel endet, wenn Sie die falsche Farbe drücken.

Boni:

-100, wenn Sie Sound einschließen (eine andere Note wird gespielt, wenn Sie auf die einzelnen Regionen drücken und wenn das Spiel die Farben anzeigt)

-25, wenn Sie einen Punktezähler einschließen.

qwr
quelle
13
GUI und Code-Golf funktionieren im Allgemeinen nicht zusammen.
user80551
3
Dies sollte in Minecraft möglich sein. Würde mich nicht wundern wenn jemand schon hat. Ich weiß nicht, wie man das hier einreichen würde ...
Kninnug
@ Kninnug die Anzahl der Blöcke * Bytes pro Block;)
Liam McInroy
@Liam McInroy AFAIK Ein Block besteht aus 2 Bytes für die Block-ID und 4 Bytes zum Speichern seiner Position in der Welt.
Pavel

Antworten:

12

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

Dies ist in erster Linie eine Antwort auf "Text wird wahrscheinlich nicht funktionieren". der folgende Text-basierte Bash - Skript läuft gut in Konsole, gnome-terminalusw. auf meinem Ubuntu 14.04 Maschine. Zum Erstellen der Farbbereiche wird die Texthintergrundfarbe festgelegt. Tatsächlich macht das Hinzufügen von Text das Spiel farbenblinden Spielern zugänglicher. Um das Spiel noch zugänglicher zu machen, werden die Zeichen gelesen, die der Spieler drücken muss (es wird davon ausgegangen, dass dies espeakinstalliert ist). Es geht auch davon aus, dass die einzige Datei Anpassung /d*/ur*/ist /dev/urandom. Damit die Farbbereiche eine nicht triviale Größe haben, möchten Sie die Textgröße wahrscheinlich auf eine ziemlich große Größe einstellen. Auch wenn die Farbbereiche Quadranten sein sollen, müssen Sie sie in einem Terminal ausführen, das zwei Zeichen breit ist.

Zum Abspielen drücken Sie y, r, g oder b.

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

Diese Lösung enthält zwei nicht druckbare ESC-Zeichen. Obwohl diese ESC-Zeichen in der Vorschau angezeigt werden, scheinen sie nach der Übermittlung gelöscht zu werden, sodass der obige Code ein Wrapper ist, der den Golfspieler generiert und ausführt simon_golf.sh.

Siehe auch die ursprüngliche ungolfed-Version und die etwas besser spielbare 256-Byte-Version .

Die folgenden Screenshots sind, wenn das gelbe Licht leuchtet und der Punktestand des Spielers 7 beträgt. Der Screenshot rechts wurde entsättigt, um Farbenblindheit zu simulieren.

BildschirmfotoSchwarz und weiß

gmatht
quelle
Viel zu groß für einen Code Golf ...
John Dvorak
3
Wahr. Ich bin hier mehr für die "Programmierpuzzles" als für den "Code Golf".
29.
Ich habe es jetzt leicht golfen.
29.
24

Kratzer, 1604 - 125 = 1479

Ich bin hier zum Spaß, nicht zum Golfen.

Bearbeiten: Aktualisierte Bewertungsmethode basierend auf dem Konsens der Community .

Hauptprogramm:

Main

Einzelne Sprites:

Sprite

Dies ist das Sprite mit der Nummer 0. Die anderen Sprites haben bis auf die Nummer dasselbe Skript.

Spielen Sie mit ihrem Online .

Für die Bytezählung verwendeter Code: (Codeausschnitt zum Ausblenden des Codes verwenden)

Hinweis: Code, der automatisch mithilfe des Scratchblock-Generators generiert wird , wurde geändert, da der Generator Dezimalzahlen nicht korrekt verarbeitet (wobei 0,3 als 0 behandelt wird).

Bildschirmfoto:

Bildschirmfoto

Hinweis: Bitte drücken Sie nicht innerhalb von 0,3 Sekunden zwei Tasten.

user12205
quelle
Ha, das ist cool. Eine Pause nach einer korrekten Antwort wäre jedoch gut oder ein Glückwunschton. Es hört sich so an, als ob mein letzter Zug Teil des Musters ist. Außerdem würde ich die Sounds langsamer spielen als die Eingabekappe, da Rhythmus- und Tonanpassung so ist, wie die Leute (zumindest ich selbst) spielen ... trotzdem gefällt es mir. +1
krs013
1
Kratzen? Srs? Außerdem sollte die Anzahl der Bytes der Gesamtgröße des SB2 entsprechen.
cjfaure
1
@Trimsty Dann wären es 126833 Bytes (einschließlich der WAV-Sounddateien usw.), weshalb ich sagte "Ich bin hier zum Spaß, nicht zum Golfen."
user12205
Entsprechend der hier vorgeschlagenen Punktzahl beträgt die Punktzahl 60 (27 Blöcke, 20 Zeichen / Ziffern in Konstanten, 8 Operatoren, 5 variable Verwendungen). Mit Boni bekommst du -65.
Ugoren
@ugoren Dies ist eigentlich nur eine Teilantwort. Es gibt 4 Sprites und nur das Skript für eines wird angezeigt, da die anderen Sprites mit Ausnahme der Nummer fast identische Skripte haben. Ich werde die Antwort basierend auf Ihrer Wertung aktualisieren. Vielen Dank.
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

Bildbeschreibung hier eingeben

Swish
quelle
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}

Ich habe hier Zeilenumbrüche hinzugefügt, um ein seitliches Scrollen zu vermeiden, aber es funktioniert als eine Zeile, sodass die Anzahl der Zeichen ohne Zeilenumbrüche ist.

Bildschirmfoto: Screenshot des Spiels

Spielen:

  • Öffnen Sie PowerShell ISE (v3), fügen Sie das Skript in den Texteditor ein und drücken Sie F5, um es auszuführen.
  • Das Spiel wird eine Farbe aufleuchten lassen, einen Ton abspielen und dann auf die Eingabe warten
  • Drücken Sie eine Zahl (0 = rot, 1 = gelb, 2 = blau, 3 = grün) und dann die Eingabetaste.
  • Wenn Sie sich irren, wird die Partitur gedruckt und beendet. (NB. Es könnte Ihre Konsole verlassen).
  • Wenn du recht hast, gibt es zwei Noten.
  • Sie müssen beim Abspielen der Sequenz zwischen den einzelnen Noten die Eingabetaste drücken.

Bemerkungen:

  • "Teilen Sie den Bildschirm in 4 Regionen" - Sie haben nicht gesagt, dass es sich um Viertel handeln muss, also sind sie es nicht.
  • Es ist schwer, blaues Licht auf dem blauen Hintergrund zu sehen, aber es tut es.
  • Bitte führen Sie PowerShell ISE aus - in der normalen Eingabeaufforderung wird "DarkYellow" als weiß angezeigt.
  • Sie könnten wohl weitere 28 Charaktere abwerfen, indem Sie einen Teil des Timings entfernen (um das Spiel noch spielbar zu machen) und die Regel "Ton (eine Note, die beim Drücken von und wenn das Spiel die Farben anzeigt)" dahingehend interpretieren, dass sie dies können alle werden gleich klingen - default error ding ", aber ich denke das ist zu weit gegen den geist davon.
TessellatingHeckler
quelle
0

ZXBasic: 422 - 100 - 25 = 297

Dies gilt definitiv als nostalgischer Drang für die 80er ...

ZXBasic verwendet eine Kombination aus Befehlen vom Typ FreeBASIC und ZX Spectrum BASIC, um Schleifen und Wiederholungen zuzulassen, die dann in das TZX-Format umgewandelt werden, um in einen Spectrum-Emulator geladen zu werden.

Diese Version ändert den Rand (obwohl eine Legende auf dem Bildschirm angibt, welche Taste gedrückt werden muss). Es spielt die gleichen Noten wie das ursprüngliche Simon-Spiel ( 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

Bestes Ergebnis Im Spiel

Brian
quelle
0

HTML5 und Javascript, 1118-100-25 = 993 Bytes

Bildbeschreibung hier eingeben

Viel zu aufgeblähte HTML + Js-Version.

Spielt Sounds über die Web-Audio-API ab .

Die Frequenzen der Noten sollten denen des Originals entsprechen, auch die Farben und die Farbplatzierung.

Eine Online-Demo finden Sie hier: http://www.dantonag.it/miniSimon.html . Funktioniert in Web-Audio-kompatiblen Browsern (mindestens Chrome und Firefox, IE unterstützt es nicht, 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>

Mein Rekord liegt bei 15 (ich bin ziemlich schlecht in diesem Spiel). Welches ist deines?

Gabriele D'Antona
quelle