Erstellen Sie ein "Snake" -Spiel in einer Konsole / einem Terminal neu

25

Spiele machen Spaß

Dieser Codegolf hier hat so viel Spaß gemacht, dass ich eine Version für andere klassische Spiele mit ähnlicher Komplexität erstellen musste. Der kürzeste Weg, ein einfaches Space Invaders-Spiel in Python zu erstellen

Versuchen Sie diesmal jedoch, das klassische "Snake" -Spiel nachzubilden, in dem Sie als kleine Figur beginnen und sich ständig dem Sammeln von Stücken widmen, um Ihre Punktzahl zu erhöhen. Wenn du ein Stück sammelst, wächst dein Schwanz, der dem Weg folgt, den du gemacht hast. Das Ziel ist es, möglichst lange zu halten, ohne in deinen eigenen Schwanz oder in die Wände zu krachen

Qualifikationen:

  • Du, die Charaktere, aus denen der Schwanz besteht, die Wände und die Teile, die du sammelst, sollten alle unterschiedliche Charaktere sein
  • Zeigen Sie ein HUD mit der Partitur. Die Punktzahl erhöht sich um 1 Punkt für jedes Stück, das Sie sammeln
  • Der Spieler verliert, wenn er mit seinem eigenen Schwanz oder der Mauer kollidiert
  • Unmittelbar nach dem Einsammeln einer Figur erscheint eine Figur in einem zufälligen Bereich, ganz zu schweigen vom Beginn des Spiels
  • Die Geschwindigkeit des Spiels spielt keine Rolle, solange es konsistent ist
  • Die 'Zellen' sollten 2x1 Zeichen sein, da die Höhe der Blockzeichen ~ das Doppelte der Breite beträgt. Kann 1x1 sein, weil 2x1 einfach hässlich ist und ich nicht wirklich daran gedacht habe
  • Die Tasten zum Ändern der Richtung sollten awsdlinks, oben, unten bzw. rechts sein
  • Die Startrichtung sollte immer oben sein
  • Sie müssen die Ränder der Wand zeigen. Die Partitur kann die Wand überlappen

Der kürzeste Code, der die oben genannten Kriterien erfüllt, gewinnt. Imaginäre Bonuspunkte für Kreativität

Blazer
quelle
Die Schlange soll beim Essen nicht wachsen?
hörte am
Hm? "Wenn du ein Stück sammelst, wächst dein 'Schwanz', der dem Weg folgt, den du gemacht hast.", Also ja, die Schlange wächst.
Blazer
2
Ohne die awsdund die starting direction should always be upAnforderungen M-x snakewürde funktionieren
scrblnrd3
1
@ scrblnrd3 M-: (progn(define-key snake-mode-map"a"'snake-move-left)...(setq snake-initial-velocity-x 0 snake-initial-velocity-y 1)(snake))würde dann den Trick machen.
Jonathan Leech-Pepin
Siehe auch

Antworten:

32

JavaScript ( 553 512 Byte)

Link zur spielbaren Version

c=0;a=b=d=-1;e=[f=[20,7],[20,8]];i=Math.random;~function n(){if(c&&(87==a||83==a
))c=0,d=87==a?-1:1;if(d&&(65==a||68==a))d=0,c=65==a?-1:1;p([j=e[0][0]+c,k=e[0][1
]+d])||!j||39==j||!k||10==k?b+=" | GAME OVER":(e.unshift([j,k]),p(f)?(f=[1+38*i(
)|0,1+9*i()|0],b++):e.pop());for(m=h="";11>h;h++){for(g=0;40>g;g++)l=g+","+h,m+=
!g||39==g||!h||10==h?"X":e[0]==l?"O":p(l)?"*":f==l?"%":" ";m+="\n"}x.innerHTML=m
+b;!b.sup&&setTimeout(n,99)}();onkeydown=function(o){a=o.keyCode};function p(o){
return e.join(p).indexOf(p+o)+1}

Ich habe zuerst versucht, die Ausgabe auf die echte Konsole zu übertragen (mit console.logund console.clear), aber sie flackerte zu stark, sodass ich sie in konsolenähnliches HTML umwandelte. Damit wird es funktionieren:

<pre id=x>

Ich habe es auch zuerst mit 2x1-Zellen implementiert, aber es sah nur schlechter aus als 1x1. Das wäre allerdings eine kleine Änderung.

Verwendet awsdTasten auf der Tastatur.

Aktualisieren:

Ich konnte es auf 512 (genau 0x200) Bytes reduzieren, indem ich die Schwanzsuche verbesserte und etwas mehr Magie ausübte.

Sie erhalten jetzt 2 Punkte, wenn ein Teil in Ihrem Schwanz erscheint (ein Feature). Ich habe auch die Überlappung behoben, wenn sich die Schlange selbst beißt.

Kopieren
quelle
1
schön! und du hast recht, es sieht besser aus als 1x1 als 2x1. Die einzige Sorge, die ich wirklich hatte, war, dass es auf und ab viel schneller ging als links und rechts, aber es ist machbar, wenn man die Einschränkungen berücksichtigt. Das Blinken in der Konsole macht mir nicht so viel aus (siehe mein Space Invaders-Programm, es flackert ziemlich), aber ich nehme an, dass eine Webseite mit einfachem Text auch funktioniert! Ein Problem ... gibt es eine Möglichkeit, einen Neustart durchzuführen, ohne dass eine Aktualisierung erforderlich ist? :(
Blazer
Funktioniert nicht mitawsd
Neal
@Blazer Das würde mehr als 13 Zeichen dauern: - / ... und du hast trotzdem die Taste F5.
Kopieren
@Neal Ja, ich habe die Pfeiltasten benutzt, aber jetzt behoben.
Kopieren
@copy Ich nehme an, ich habe es nicht zu einer Anforderung gemacht
Blazer
21

x86-Maschinencode (128 Byte)

Ähnlich wie bei meinem Beitrag zur Erstellung eines Mandlebrot-Fraktals habe ich ein Produkt für das Schlangenspiel in 128 Bytes geschrieben. Es wird den Anforderungen der Herausforderung nicht vollständig gerecht (es bewegt sich nach rechts, es werden nicht alle Wände gezeichnet), aber ich poste es, weil ich es für eine interessante und kreative Lösung halte. Die Punktzahl wird binär rechts angezeigt, die Pfeiltasten steuern die Bewegungsrichtung, das „Essen“ wird nach dem Zufallsprinzip abgelegt und endet, wenn Sie sich selbst, die Wand oder den Bildschirmrand treffen.

Link für ausführbare Dateien und Quellcode

Bildschirmfoto

Auch in Bezug auf den früheren Kommentar, ob Dosbox betrügt, halte ich es für völlig akzeptabel, solange es sich in einem textbasierten Anzeigemodus befindet, da es sich dann nur um ein Dos-Terminal handelt.

Sir_Lagsalot
quelle
Warum sollte DOSBox jemals als Betrug betrachtet werden? Es ist eine absolut legitime Plattform.
9.
9

16 Bit 8086

526 Bytes / 390 Bytes

Dekodieren Sie dies mit einem Base64-Dekoder und nennen Sie es "snake.com", dann führen Sie es an der Windows-Eingabeaufforderung aus. Getestet unter WinXP müssen Sie möglicherweise DosBox verwenden, um den richtigen Videomodus zu erhalten. Steuertasten sind "wasd" und Leerzeichen zum Verlassen. Drücke 'w' um zu starten.

uBMAzRC5AD+2AOipAb1AAbgAoI7Auf//v4sMsAHzqrgAtLksAfOqg8cU/sx19OgsAYs+8gKwAuj4
ALQAzRpCiRYOA4kWEAPouAC0C80hCsB0IbQIzSG+ygKDxgOAPAB0EjgEdfSLRAGzAP/Qo1cBiB7w
AulqAIEGdAGu/7P+uNECgMMEw7MCuNsCgMMGw4s+8gKLHvACisPolwADv+YCJoo16I0AiT7yAoD+
A775AnREiz70AiaKHbAA6HUAA7/mAok+9AKA/gB0FscGVwHNAoEudAGu/zPJtj/o2QDofQC0AM0a
OxYOA3X2/wYOA+lZ/8YEAE7+BIA8CnT16F4AaOAB6EQAM9K5LQD38YvCweACBQoA9+WL+OguALlL
ADPS9/HB4gKDwgsD+iaAPQB10rADiMRXq4HHPQGrq4HHPAGrq4HHPQGrX8OhEAO62wD34rntf/fx
iRYQA4vCw772Ar8K9bUEshCstACL2AHDi4f6ArMDtwXR+LEAwNEC/smA4Q8miA0p7/7PdevoIQA6
xHQE/st13ugKAP7NdcroAwB1+8O3BSbGBQEp7/7PdfaBx0EG/srDuBAQM9uAwwLNEID7CnX2w7gD
AM0QzSB3dgEgxgIAYYcBZIUBIMYCAHd8AXN+ASDGAgAA+wAF/P8EAAIAH4ofigAAAADRxeD/TJlO
gQPvQrVA4++BVdVjgQ==

Hier ist eine Zeichenmodus-Version, die 390 Byte lang ist:

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq7LdfCxUPOr6BgBiz5+AqF8Aqu0AM0aQ
okWhgKJFogC6MUAtAvNIQrAdCG0CM0hvlYCg8YDgDwAdBI4BHX0i0QBswD/0KNSAYgefALpdgCBB
m8Bov+z/rhdAoDDBMOzArhnAoDDBsOLPn4Cix58AiaJHQOclgmijUmiR2JPn4CgP4DvoUCdFOLPo
ACJoodJscFAAADv3JYiT6AAoD+AHQkxwZSAVkCgS5vAaL/vwEAudAHJoA9qnUEJsYFzIPHAuLx6F
4AtADNGjsWhgJ19oMGhgIC6Uz/xgQATv4EgDwKdPXoPgBo5wHoIgC5FwD38Wn6oADoFgC5TgD38U
ID0gP6JoA9AHXhJscFA93DoYgCutsA9+K57X/38YkWiAKLwjPSw76CAr8CALkEALSfrAQwq+L6w8
0gd3EBIFcCAGGCAWSAASBXAgB3dwFzeQEgVwIAYP+gAP7/AgACqtAH0AcAAAAA

Dieser Charaktermodus ist drei Bytes länger (aber die Schlange ist besser):

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA
Skizz
quelle
punkte für kreativität, aber ich denke, dosbox zu verwenden ist schummeln, weil die herausforderung darin besteht, das spiel auf einer ascii-konsole oder einem terminal laufen zu lassen, nicht auf einer dosbox. sollte code golf nicht quellcode sein, nicht binär?
Blazer
7
@Blazer: Das ist der Quellcode - ich habe den Maschinencode mit einem Hex-Editor eingegeben - so bin ich l337! ;-) Das DosBox-Ding wird nur benötigt, wenn Ihre Grafiktreiber Probleme mit Grafikmodus 13 haben (meine Karte ist damit in Ordnung). Es wäre nicht schwierig, eine ASCII-Version (wahrscheinlich auch kleiner) zu machen
Skizz
Die "390-Byte" -Version dekodiert auf nur 388 Byte und bleibt hängen, wenn sie unter dosbox ausgeführt wird. Es sieht so aus, als wäre bei der Übertragung etwas verloren gegangen. :( Trotzdem sind die beiden anderen Versionen extrem cool!
Ilmari Karonen
Gibt es eine unbenutzte Version des Codes? (Ich kenne diese Sprache nicht)
AL
1
@ n.1: Das Programm ist 8086-Maschinencode. Sie können ihn in einen Debugger (D86) laden und den Code als geschrieben anzeigen, allerdings ohne Labelnamen.
Skizz
6

Shell / sh, 578 Zeichen

Ich habe versucht, POSIX-konform zu sein (so viel wie möglich portabel zu sein und Bashismen zu vermeiden, auch der Zufallsgenerator benötigt / proc nicht). Sie können es z. B. in Ihrem nativen Terminal oder über eine SSH-Sitzung abspielen: mit 'dash -c ./snake' ausführen. Es gibt auch eine nicht fehlerbehaftete / lesbare Variante in ~ 2800 Bytes, die hier zu sehen ist .

Einige Anmerkungen: Shell-Scripting ist nicht zum Codieren von Spielen geeignet. 8-)

  • um fair zu sein, haben wir nur sogenannte "builtins" verwendet, was bedeutet:
    • Keine externen Aufrufe von Programmen wie 'clear', 'stty' oder 'tput'
    • Aus diesem Grund zeichnen wir den gesamten Bildschirm bei jeder Bewegung neu
    • Die einzigen verwendeten Builtins (auch native Befehle genannt) sind:
      • echo, eval, while-loop, let, break, read, case, test, set, shift, alias, quelle
  • Es gibt keinen Zufallsgenerator (PRNG), daher müssen wir unseren eigenen bauen
  • Ein Tastendruck blockiert, also müssen wir einen anderen Thread erzeugen
    • Um das Ereignis in die übergeordnete Aufgabe zu bekommen, verwenden wir ein tempfile (hässlich!)
  • Die Schlange selbst ist eine Liste, die billig ist:
    • Jedes Element ist ein (x, y) -Tupel
    • den Schwanz zu verlieren bedeutet: die Liste um 1 verschieben
    • Hinzufügen eines (neuen) Kopfes bedeutet: Anhängen einer Zeichenkette
  • Das Gitter ist intern ein Array, aber shell / sh weiß das nicht:
    • Wir "emulierten" Array (x, y) über einen hässlichen Auswertungsaufruf mit globalen Variablen
  • und zum schluss: wir hatten viel spaß!
#!/bin/sh
alias J=do T=let E=echo D=done W=while\ let
p(){ eval A$1x$2=${3:-#};}
g(){ eval F="\${A$1x$2:- }";}
r(){
E $((1+(99*I)%$1))
}
X=9
Y=8
L="8 8 $X $Y"
I=41
W I-=1
J
p $I 1
p $I 21
p 1 $I
p 41 $I
D
p 3 3 :
>L
W I+=1
J
E -ne \\033[H
y=22
W y-=1
J
Z=
x=42
W x-=1
J
g $x $y
Z=$Z$F
D
E "$Z"
D
E $B
. ./L
case $D in
a)T X+=1;;d)T X-=1;;s)T Y-=1;;*)T Y+=1;;esac
g $X $Y
case $F in
\ |:)p $X $Y O
L="$L $X $Y"
case $F in
:)W I+=1
J
x=`r 39`
y=`r 19`
g $x $y
[ "$F" = \  ]&&{
p $x $y :
break
}
D
T B+=1;;*)set $L
p $1 $2 \ 
shift 2
L=$@;;esac;;*).;;
esac
D&
while read -sn1 K
J
E D=$K>L
D

Bildbeschreibung hier eingeben

Bastian Bittorf
quelle
Ist dies tatsächlich funktioniert ? Wenn die Schlange nach rechts geht und Sie drücken a, stoppt sie. Seltsam.
gniourf_gniourf
Ja, weil du dich beißt - so muss es meiner Meinung nach sein. Wir haben das intern besprochen und alle sind sich einig.
Bastian Bittorf
echo -nist definitiv nicht tragbar. Wenn der erste Operand -n ist oder wenn einer der Operanden einen Backslash ('\') enthält, sind die Ergebnisse implementierungsdefiniert. Die Verwendung von Echo für andere als wörtliche Texte ohne Schalter ist nicht übertragbar. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h
nyuszika7h: irgendeine idee wie man das umgeht?
Bastian Bittorf
nyuszika7h: ich habe eine möglichkeit gefunden, den hauptaufruf 'echo -n' zu entfernen - es ist also nur noch ein aufruf übrig. Es ruft die Escape-Sequenz für "Go to Home-Position (0,0)"
Bastian Bittorf
4

Ruby 1.9 / Nur Windows / ( 354 337 355 346 Byte)

require'Win32API';G=(W=Win32API).new g="crtdll","_getch",t=[],?I
B=(c=?#*39+h="#
#")+((S=' ')*38+h)*20+c;n=proc{c while B[c=rand(800)]!=S;B[c]=?*;S}
n[h=760];k={97=>-1,100=>1,119=>d=-41,115=>41}
(B[h]=?O;system'cls';$><<B<<$.;sleep 0.1
d=k[G.call]if W.new(g,"_kbhit",[],?I).call>0
t<<h;B[h]=?o;B[h+=d]==?*?B[h]=n[$.+=1]:B[t.shift]=S)while B[h]==S

Spielt in einer 20x40-Tafel in der Windows-Konsole. Die Punktzahl wird unter der Tafel angezeigt. Verwenden Sie WASD, um die Schlange zu steuern, oder eine andere Taste, um sie zu verlassen (mit Gewalt!). Bearbeiten Sie die Ruhezeit am Ende von Zeile 5, um die Geschwindigkeit zu steuern. (Oder speichere 10 Zeichen und mache es fast unspielbar, indem du den Schlaf komplett entfernst!)

Bonus-Funktion: Start versagt nach dem Zufallsprinzip (wenn das erste Teil an der Position der Schlange generiert wird).

Ich brauchte ~ 100 Zeichen, um das Fehlen eines nicht blockierenden Getchar zu umgehen. Anscheinend enthält Ruby 1.9.3 eine "io / console" -Bibliothek, die ungefähr die Hälfte davon gespeichert hätte. Und diese Lösung ist Windows-spezifisch. Es gibt veröffentlichte Lösungen für die gleichen Aufgaben in * nix-Systemen, aber ich habe sie nicht getestet, um die Anzahl der Zeichen zu vergleichen.

Bearbeiten:

Musste 18 Bytes hinzufügen, nachdem mir klar wurde, dass der Schwanz erst nach dem Essen wächst, nicht nach jedem Schritt.

Edit 2: (Möglicherweise) Absturzproblem behoben, die 9 Bytes durch Beschränkung auf ein Lebensmittelelement gespeichert.

Ahelly
quelle
Ich mag die Idee, mehrere Lebensmittel gleichzeitig zu essen, aber es gibt ein großes Problem: Der Schwanz sollte sich mit dem Spieler bewegen und für jedes eingesammelte Lebensmittelstück nur um einen Charakter wachsen.
Blazer
Sie haben den Kommentar hinzugefügt, während ich daran gearbeitet habe, ihn zu reparieren ... Wenn es nur ein Stück geben soll, kann ich das entfernen 9.times{}und 9 Zeichen sparen.
AShelly
Die einzige Voraussetzung ist, dass es 1 oder mehr Lebensmittel auf einmal gibt. Sie können also auch nur 1 Stück auf einmal herstellen und einige Charaktere speichern
Blazer
das Spiel stürzte zufällig bei ~ 140 Punkten auf mich ab, nicht sicher warum. aber sonst sehr schön
Blazer
Ich denke, der Absturz wurde behoben. Wenn es erneut abstürzt, teilen Sie mir bitte die Ruby-Fehlermeldung mit.
AShelly
4

Applesoft Basic - 478 (462)

Dies war mein allererster Code Golf, aber er wurde 1989 geschrieben und implementiert meistens das gewünschte Schlangenspiel (aber ohne Futter wachsen die Schlangen einfach kontinuierlich und es sind eigentlich zwei Spieler, nicht einer) mit nur zwei Zeilen Applesoft Basic.

Zu dieser Zeit gab es eine Reihe von zweizeiligen Programmwettbewerben, wie zum Beispiel in der Zeitschrift Dr. Dobbs. Ich verbrachte 6 Monate damit, herauszufinden, wie dies in zwei Zeilen mit einer Begrenzung von 255 Zeichen (und nur einer Verzweigung) eingepasst werden kann.

Weitere Informationen unter: http://davesource.com/Projects/SpeedWaller/

Das eingegebene Programm besteht aus genau zwei Zeilen:

1ONSCRN(X,Y)<>7ANDB<>0ANDSCRN(U,V)<>7GOTO2:HOME:GR:X=10:Y=20:U=30:V=Y:I=201:J=202:K=203:M=205:W=215:A=193:S=211:Z=218:O=1:Q=-1:P=49152:COLOR=7:HLIN0,39AT0:HLIN0,39AT39:VLIN0,39AT0:VLIN0,39AT39:VTAB22: ?"WASZ IJKM  "C:ONB=0GOTO2:CALL-678:RUN
2PLOTX,Y:PLOTU,V:B=PEEK(P):G=B<>ZANDB<>W:H=B<>AANDB<>S:O=G*(O*H+(B=S)-(B=A)):L=H*(L*G+(B=Z)-(B=W)):G=B<>IANDB<>M:H=B<>JANDB<>K:Q=G*(Q*H+(B=K)-(B=J)):R=H*(R*G+(B=M)-(B=I)):X=X+O:Y=Y+L:U=U+Q:V=V+R:FORN=1TO99:NEXT:C=C+1:VTAB22:HTAB12:?C:GOTO1

Wenn die Liste formatiert ist, sieht sie folgendermaßen aus:

1 ONSCRN(X,Y)<>7 AND B<>0 AND SCRN(U,V) <> 7 GOTO 2: HOME : GR :
  X=10 : Y=20 : U=30 : V=Y : I=201 : J=202 : K=203 : M=205 : W=215 :
  A=193 : S=211 : Z=218 : O=1 : Q=-1 : P=49152 : COLOR=7 : HLIN 0,39
  AT 0 : HLIN 0,39 AT 39 : VLIN 0,39 AT 0 : VLIN 0,39 AT 39 : VTAB 22 :
  ? "WASZ IJKM  "C : ON B=0 GOTO 2 : CALL -678 : RUN
2 PLOT X,Y : PLOT U,V : B=PEEK(P) : G= B<>Z AND B<>W: H=B<>A AND B<>S :
  O=G*(O*H+(B=S)-(B=A)) : L=H*(L*G+(B=Z)-(B=W)) : G=B<>I AND B<>M :
  H=B<>J AND B<>K : Q=G*(Q*H+(B=K)-(B=J)) : R=H*(R*G+(B=M)-(B=I)) :
  X=X+O : Y=Y+L : U=U+Q : V=V+R : FOR N=1 TO 99 : NEXT : C=C+1 :
  VTAB 22 : HTAB 12 : ? C : GOTO 1

Das Spiel besteht eigentlich aus zwei Spielern und enthält "Anweisungen" am unteren Rand der Seite mit den Schlüsseln sowie einen Zähler, damit Sie sehen können, wie viele Schritte Sie überlebt haben. Es sind 478 Zeichen, davon sind 16 die Anweisungen und die Zählerausgabe, also 462, wenn Sie diese abschneiden möchten.

David Ljung Madison Stellar
quelle
4

C # .NET Framework 4.7.2 Console ( 2.456 2.440 2.424 2.408 2.052 1.973 1.747 1.686 Byte)

Das hat Spaß gemacht, aber ich musste mir wirklich überlegen, welche Variablen was sind, denn sie sind nur ein Buchstabe.

using m=System.Console;using System;using System.Collections.Generic;using System.Threading;class s{static void Main(){m.CursorVisible=0>1;new s()._();}int l;Action<string> w=(x)=>m.Write(x);Action<int,int>n=(x,y)=>m.SetCursorPosition(x,y);(int x,int y)d,c,a;int h,u;List<(int x,int y)>p;void _(){while(1>0){f();h=25;u=25;p=new List<(int x,int y)>();l=0;d=(0,-1);c=(u/2,h/2);e();m.SetWindowSize(u+4,h+4);m.SetBufferSize(u+4,h+4);while(1>0){k();if(t())break;g();r();}f();m.SetWindowSize(u+4,h+6);m.SetBufferSize(u+4,h+6);n(1,h+3);w("        Game over,\n   press any key to retry.");f();m.ReadKey(1>0);m.Clear();}}private bool t(){if(c.x<0||c.y<0||c.x>=u||c.y>=h){r();n(c.x+2,c.y+2);w("X");return 1>0;}for(i=0;i<p.Count;i++){for(int j=0;j<i;j++){if(p[i].x==p[j].x&&p[i].y==p[j].y){r();n(c.x+2,c.y+2);w("X");return 1>0;}}}return 0>1;}private void e(){a=(z.Next(u),z.Next(h));l++;}void f(){while(m.KeyAvailable)m.ReadKey(1>0);}int i;void k(){var b=DateTime.Now;while((DateTime.Now-b).TotalMilliseconds<230)Thread.Sleep(10);if(!m.KeyAvailable)return;var a=m.ReadKey(1>0).Key;switch(a){case ConsoleKey.A:if(d.x==0)d=(-1,0);break;case ConsoleKey.W:if(d.y==0)d=(0,-1);break;case ConsoleKey.S:if(d.y==0)d=(0,1);break;case ConsoleKey.D:if(d.x==0)d=(1,0);break;}f();}void g(){c.x+=d.x;c.y+=d.y;p.Add((c.x,c.y));while(p.Count>l)p.RemoveAt(0);if(c.x==a.x&&c.y==a.y)e();}void r(){n(1,1);w("/");w(new string('-',u));w("\\");n(1,h+2);w("\\");w(new string('-',u));w("/");for(i=0;i<h;i++){n(1,i+2);w("|");n(u+2,i+2);w("|");}for(i=0;i<h;i++){for(int j=0;j<u;j++){n(i+2,j+2);w(" ");}}n(a.x+2,a.y+2);w("@");for(i=0;i<p.Count;i++){n(p[i].x+2,p[i].y+2);w("#");}n(2,0);w("Score:"+l);}Random z=new Random();}

Einige Screenshots:

Schlange mit einer Punktzahl von 10 Snake stürzte mit 4 Punkten ab

Binär: https://github.com/wooden-utensil/snakeCodeGolf/releases/tag/v1.0.0.0

GitHub-Repository: https://github.com/wooden-utensil/snakeCodeGolf

Änderungsprotokoll: https://github.com/wooden-utensil/snakeCodeGolf/releases

facepalm42
quelle
1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
Stephen
1
Haben Sie Tupel wie in versucht (int X,int Y)d; ...; d=(0,-1)? Das könnte Bytes sparen. Ich kann auch nicht sehen, warum Sie Vector2 d;Vector2 c;Vector2 a;stattdessen tun Vector2 d,c,a. Ich denke, Sie können die Console.SetCursorPosition-Funktion auch als Action<...>Variable mit einem Buchstaben speichern . Sie können DateTime mit dem Operator - subtrahieren. Sie können Schleifenvariablen auch global deklarieren und sie bei Bedarf einfach auf Null setzen, ohne sie zu deklarieren.
Mein Pronomen ist monicareinstate
1
[Vorschläge werden fortgesetzt] Sie können anstelle des Schlüsselworts eine Variable verwenden 1>0oder in dieser speichern true. Möglicherweise können Sie den glorreichen Operator -> in den Schleifen verwenden. In dem DateTime b = DateTime.NowTeil bkann sein var. Möglicherweise können dynamicSie mithilfe von einige Bytes speichern oder nicht (häufig können Sie Deklarationen mit anderen Typen zusammenführen).
Mein Pronomen ist monicareinstate
1
Wenn m.write(String)Sie die Ein-Buchstaben-
Langfunktion aktivieren,
1
Es gibt auch ein paar Blöcke, die verwendet werden, b.widthund b.heighteine Menge, die wahrscheinlich auf einem anderen lokalen var mit dem Namen 1 gespeichert werden könnten
Veskah,
3

Python 3 - 644

from curses import *
import time
from collections import deque
from random import randrange as R
N,W,S,E=z=119,97,115,100
t=tuple
u=0,0
def m(s):
 a=lambda o,y,x:y.addch(o[0],o[1],x);q=lambda:(R(L-2),R(C-2));L,C=s.getmaxyx();curs_set(0);s.nodelay(1);s.border();s.refresh();r=newwin(L-2,C-2,1,1);n=deque();y,x=[L-2,0];d=N;n.append(u);c=N;p=q();a(p,r,N);a(u,s,48)
 while 1:
  if c in z:d=c
  if d==N:y-=1
  if d==S:y+=1
  if d==W:x-=1
  if d==E:x+=1
  l=n.pop()
  if (y,x) in n:return
  if (y,x)==p:p=q();a(p,r,N);n.append(l);s.addstr(0,0,str(len(n)))
  n.appendleft((y,x));a((y,x),r,S);a(l,r,32);r.refresh();time.sleep(.2);c=s.getch()
wrapper(m)

Beendet sich nicht sauber. Das Teil könnte verschwinden, wenn es auf der Schlange erscheint.

Trang Oul
quelle
1

Bash (zu viele Zeichen: ca. 1522)

t=tput
tc="$t cup"
tr="$t rev"
ts="$t sgr0"
ox=5
oy=5
((w=$($t cols)-2-2*ox))
((h=$($t lines)-2-2*oy))
trap "$t rmcup
stty echo
echo 'Thanks for playing snake!'
" EXIT
$t smcup
$t civis
stty -echo
clear
printf -v hs %$((w+2))s
printf -v v "|%${w}s|"
$tc $oy $ox
printf %s ${hs// /_}
for((i=1;i<=h+1;++i)); do
$tc $((oy+i)) $ox
printf %s "$v"
done
$tc $((oy+h+2)) $ox
printf %s ${hs// /¯}
dx=0
dy=-1
hx=$((w/2))
hy=$((h-2))
l=2
xa=($hx $hx)
ya=($hy $((hy+1)))
$tr
for((i=0;i<${#xa[@]};++i)); do
$tc $((ya[i]+1+oy)) $((xa[i]+1+ox))
printf \ 
done
$ts
print_food() {
$tc $((fy+1+oy)) $((fx+1+ox))
printf "*"
}
nf() {
rf=1
while((rf))
do
rf=0
((fx=RANDOM%w))
((fy=RANDOM%h))
for ((i=0;i<${#ya[@]};++i))
do
if((ya[i]==fy&&xa[i]==fx))
then
rf=1
break
fi
done
done
print_food
}
nf
ps() {
s="SCORE: $l"
$tc $((oy-1)) $((ox+(w-${#s})/2))
printf "$s"
}
ps
while :
do
read -t 0.2 -s -n1 k
if (($?==0))
then
case $k in
w|W)((dy==0))&&{ dx=0;dy=-1;};;
a|A)((dx==0))&&{ dx=-1;dy=0;};;
s|S)((dy==0))&&{ dx=0;dy=1;};;
d|D)((dx==0))&&{ dx=1; dy=0;};;
q|Q)break;;
esac
fi
((hx=${xa[0]}+dx))
((hy=${ya[0]}+dy))
if((hx<0||hy<0||hx>w||hy>h))
then
go=1
break
fi
for((i=1;i<${#ya[@]}-1;++i))
do
if((hx==xa[i]&&hy==ya[i]))
then
go=1
break 2
fi
done
$tc $((ya[-1]+1+oy)) $((xa[-1]+1+ox))
printf \ 
$tr
$tc $((hy+1+oy)) $((hx+1+ox))
printf \ 
$ts
if((hx==fx&&hy==fy))
then
((++l))
ps
nf
else
ya=(${ya[@]::${#ya[@]}-1})
xa=(${xa[@]::${#xa[@]}-1})
fi
ya=($hy ${ya[@]})
xa=($hx ${xa[@]})
done
if((go))
then
$tc 3 3
echo GAME OVER
read -t 3 -s -n1
fi

Bildschirmfoto

gniourf_gniourf
quelle