Odtwórz grę „Wąż” na konsoli / terminalu

25

Gry są fajne

ten codegolf był tak zabawny, że musiałem stworzyć wersję dla innych klasycznych gier o podobnej złożoności. Najkrótszy sposób na stworzenie podstawowej gry Space Invaders w Pythonie

Tym razem jednak spróbuj odtworzyć klasyczną grę „Snake”, w której zaczynasz jako mały kształt, nieustannie przechodząc do zbierania elementów, aby zwiększyć swój wynik. Po zebraniu pionu rośnie „ogon”, który podąża wyznaczoną ścieżką. Celem jest przetrwanie jak najdłużej bez uderzenia we własny ogon lub w ściany

Kwalifikacje:

  • Wy, postacie, które składają się na ogon, ściany i zebrane elementy, powinniście być różnymi postaciami
  • pokaż HUD z wynikiem. Wynik wzrasta o 1 punkt za każdy zebrany kawałek
  • Gracz przegrywa, gdy zderzy się z własnym ogonem lub ścianą
  • element odradza się w losowym obszarze natychmiast po zebraniu elementu, nie wspominając już o tym na początku gry
  • Szybkość gry nie ma znaczenia, o ile jest spójna
  • „Komórki” powinny mieć 2x1 znaków, ponieważ wysokość znaków blokowych jest ~ dwa razy większa niż szerokość Może wynosić 1x1, ponieważ 2x1 jest po prostu brzydka i tak naprawdę o tym nie myślałem
  • Klawisze zmiany kierunku powinny być odpowiednio awsd: w lewo, w górę, w dół, w prawo
  • kierunek początkowy powinien być zawsze w górę
  • Musisz pokazać krawędzie ściany. Wynik może nachodzić na ścianę

Wygrywa najkrótszy kod spełniający powyższe kryteria. Wyimaginowane punkty bonusowe za kreatywność

Blezer
źródło
Wąż nie powinien rosnąć podczas jedzenia?
przestał się obracać w lewo
hm? „Kiedy zbierzesz kawałek, Twój„ ogon ”rośnie, podążając wyznaczoną ścieżką.” Tak więc, wąż rośnie.
Blazer
2
Bez awsdi starting direction should always be up, M-x snakezadziałałoby
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))zrobiłby wtedy lewę.
Jonathan Leech-Pepin
Powiązane: Nibbles Nostalgia
sergiol

Odpowiedzi:

32

JavaScript ( 553 512 bajtów)

Link do wersji do gry

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}

Na początku próbowałem wyprowadzić go na prawdziwą konsolę (za pomocą console.logi console.clear), ale zbyt mocno migotał, więc umieściłem go w HTML-u podobnym do konsoli. Będzie działać z tym:

<pre id=x>

Zaimplementowałem go najpierw z komórkami 2x1, ale wyglądało to gorzej niż 1x1. To byłaby niewielka zmiana.

Używa awsdklawiszy na klawiaturze.

Aktualizacja:

Udało mi się zmniejszyć go do 512 (dokładnie 0x200) bajtów, poprawiając wyszukiwanie ogona i wykonując trochę więcej magii.

Teraz dostajesz 2 punkty, gdy element odradza się na twoim ogonie (jest to cecha). Naprawiłem również nakładanie się, gdy wąż gryzie się.

Kopiuj
źródło
1
piękny! i masz rację, wygląda lepiej jako 1x1 niż 2x1. jedynym zmartwieniem, które tak naprawdę miałem, było poruszanie się w górę i w dół o wiele szybciej niż w lewo i prawo, ale jest to wykonalne biorąc pod uwagę ograniczenia. Flashowanie w konsoli Nie przeszkadza mi tak bardzo (patrz mój program najeźdźców kosmicznych, jego dość migotanie), ale przypuszczam, że działa również zwykła strona tekstowa! jeden problem… czy jest jakiś sposób na ponowne uruchomienie bez potrzeby odświeżania? :(
Blazer
Nie działa zawsd
Neal
@ Blazer To zajmie więcej 13 znaków: - / ... a ty i tak masz klawisz F5.
skopiuj
@Neal Tak, użyłem klawiszy strzałek, ale naprawiłem to teraz.
skopiuj
@ kopiuj Chyba nie uczyniłem tego wymaganiem
Blazer
21

Kod maszynowy x86 (128 bajtów)

Podobnie jak moje zgłoszenie do generowania fraktala Mandlebrota , napisałem prop dla gry w węża w 128 bajtach. Nie w pełni spełnia wymagania wyzwania (zaczyna się poruszać w prawo, nie wszystkie ściany są narysowane), ale publikuję je, ponieważ uważam, że jest to interesujące i kreatywne rozwiązanie. Wynik wyświetlany jest dwójkowo po prawej stronie, klawisze strzałek kontrolują kierunek ruchu, „jedzenie” jest losowo upuszczane i kończy się, jeśli uderzysz siebie, ścianę lub krawędź ekranu.

Link do pliku wykonywalnego i kodu źródłowego

Screenshot

Również w odniesieniu do wcześniejszego komentarza na temat tego, czy dosbox oszukuje, myślę, że jest całkowicie akceptowalny, o ile działa w trybie wyświetlania tekstowego, ponieważ jest to tylko terminal dos.

Sir_Lagsalot
źródło
Dlaczego DOSBox byłby kiedykolwiek uważany za oszustwo? To całkowicie legalna platforma.
dfeuer
9

16 bitów 8086

526 bajtów / 390 bajtów

Dekoduj to za pomocą dekodera Base64 i nazwij go „snake.com”, a następnie uruchom z wiersza poleceń systemu Windows. Testowany na WinXP, może być konieczne użycie DosBox, aby uzyskać odpowiedni tryb wideo. Klawisze sterujące to „wasd” i spacja do wyjścia. Naciśnij „w”, aby rozpocząć.

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==

Oto wersja trybu znakowego o długości 390 bajtów:

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

Ten tryb postaci jest o trzy bajty dłuższy (ale wąż jest lepszy):

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA
Skizz
źródło
punktów za kreatywność, ale myślę, że używanie dosbox to oszustwo, ponieważ wyzwaniem jest sprawienie, aby gra działała w konsoli lub terminalu ASCI, a nie w dosbox. czy kod golf nie powinien być kodem źródłowym, a nie binarnym?
Blazer
7
@ Blazer: To jest kod źródłowy - wpisałem kod maszynowy za pomocą edytora szesnastkowego - taki jestem l337! ;-) Sprawa DosBox jest potrzebna tylko wtedy, gdy sterowniki wideo mają problemy z grafiką w trybie 13 (karta moja jest w porządku). Wykonanie wersji ascii (prawdopodobnie także mniejszej) nie byłoby trudne
Skizz
Wersja „390-bajtowa” dekoduje do 388 bajtów i zawiesza się, gdy działa pod dosbox. Wygląda na to, że coś mogło zostać utracone w transmisji. :( Pozostałe dwie wersje są jednak bardzo fajne!
Ilmari Karonen
Czy istnieje wersja kodu niepoddana golfowi? (Nie znam tego języka)
AL
1
@ n.1: Program ma kod maszynowy 8086, można go załadować do debuggera (D86) i przeglądać kod jako napisany, choć bez nazw etykiet.
Skizz
6

shell / sh, 578 znaków

Próbowałem być zgodny z POSIX (będąc tak przenośnym, jak to możliwe i unikaj bashizmów, nawet generator liczb losowych nie potrzebuje / proc). Możesz np. Zagrać w natywny terminal lub sesję SSH: uruchomić z 'dash -c ./snake' Istnieje również niesprawdzony / czytelny wariant ~ 2800 bajtów, który można zobaczyć tutaj .

Kilka uwag: skrypty powłoki nie są odpowiednie do kodowania gier 8-)

  • aby być uczciwym, użyliśmy tylko tak zwanych „wbudowanych”, co oznacza:
    • brak zewnętrznych wywołań programów takich jak „clear”, „stty” lub „tput”
    • z tego powodu przerysowujemy cały ekran przy każdym ruchu
    • jedynymi używanymi wbudowanymi funkcjami (znanymi również jako polecenia rodzime) są:
      • echo, eval, while-loop, let, break, read, case, test, set, shift, alias, source
  • nie ma generatora liczb losowych (PRNG), więc musimy zbudować własny
  • otrzymujemy bloki klawiszy, więc musimy odrodzić kolejny wątek
    • do uzyskania zdarzenia w zadaniu nadrzędnym używamy pliku tymczasowego (brzydkie!)
  • sam wąż jest listą, która jest tania:
    • każdy element ma postać (x, y)
    • utrata ogona oznacza: przesunięcie listy o 1
    • dodanie (nowej) głowy oznacza: dołącz ciąg
  • siatka jest wewnętrznie tablicą, ale shell / sh nie wie o tym:
    • „emulowaliśmy” tablicę (x, y) poprzez brzydkie wywołanie eval z globalnymi zmiennymi
  • i na koniec: dobrze się bawiliśmy!
#!/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

enter image description here

Bastian Bittorf
źródło
Czy to naprawdę działa ? jeśli wąż idzie w prawo i naciśniesz a, zatrzyma się. Dziwne.
gniourf_gniourf
Tak, ponieważ gryziesz siebie - tak musi być IMHO. Rozmawialiśmy o tym wewnętrznie i wszyscy się z tym zgadzają.
Bastian Bittorf,
echo -nzdecydowanie nie jest przenośny. Jeśli pierwszym operandem jest -n lub jeśli którykolwiek z operandów zawiera znak ukośnika odwrotnego ('\'), wyniki są zdefiniowane w implementacji. Używanie echa do wszystkiego innego niż dosłowny tekst bez żadnych przełączników nie jest przenośne. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h
nyuszika7h: jakiś pomysł, jak to zrobić?
Bastian Bittorf,
nyuszika7h: znalazłem sposób na usunięcie głównego wywołania „echo -n” - więc zostało tylko jedno połączenie. nazywa sekwencję ucieczki dla „idź do pozycji
wyjściowej
4

Ruby 1.9 / tylko Windows / ( 354 337 355 346 bajtów)

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

Gra na płycie 20x40 w konsoli Windows. Wynik wyświetlany jest pod tablicą. Użyj, WASDaby kontrolować węża, dowolny inny klawisz, aby wyjść (na siłę!). Edytuj czas snu na końcu linii 5, aby kontrolować prędkość. (Lub uratuj 10 postaci i spraw, że prawie nie da się go odtworzyć, całkowicie usuwając sen!)

Funkcja bonusowa: losowo nie uruchamia się (gdy początkowy element jest generowany w lokalizacji węża).

Potrzebowałem ~ 100 znaków, aby obejść brak nieblokującego getchara. Najwyraźniej Ruby 1.9.3 zawiera bibliotekę „io / console”, która zaoszczędziłaby mniej więcej połowę z nich. To rozwiązanie jest specyficzne dla systemu Windows. Istnieją opublikowane rozwiązania pozwalające robić to samo w systemach * nix, ale nie testowałem ich w celu porównania liczby znaków.

Edytować:

Musiałem dodać 18 bajtów, gdy zdałem sobie sprawę, że ogon rośnie tylko po jedzeniu, a nie po każdym kroku.

Edycja 2: (Prawdopodobnie) naprawiono problem awarii, zapisywano 9 bajtów, ograniczając się do jednego elementu żywności.

AShelly
źródło
Podobał mi się pomysł wielokrotnego jedzenia na raz, jednak jest duży problem: ogon powinien poruszać się wraz z graczem, rosnąc tylko o jedną postać na każdą zebraną żywność.
Blazer
Dodałeś komentarz, gdy pracowałem nad jego naprawieniem ... Jeśli ma być tylko jeden element, mogę go usunąć 9.times{}, oszczędzając 9 znaków.
AShelly,
jedynym wymaganiem jest, aby była 1 lub więcej sztuk jedzenia na raz, więc tak, możesz po prostu zrobić 1 sztukę na raz, oszczędzając niektóre postacie
Blazer
gra losowo spadła na mnie przy ~ 140 punktach, nie jestem pewien dlaczego. ale poza tym bardzo miło
Blazer
Naprawiono awarię, tak myślę. Jeśli ponownie się zawiesi, daj mi znać komunikat o błędzie ruby.
AShelly
4

Applesoft Basic - 478 (462)

To był mój pierwszy kod golfowy, ale został napisany w 1989 roku i głównie implementuje grę w węża zgodnie z żądaniami (ale bez jedzenia, węże ciągle rosną, i to właściwie dwóch graczy, a nie jeden), używając tylko dwóch linii Applesoft Basic.

W tym czasie odbyło się wiele dwuliniowych konkursów programowych, na przykład w czasopiśmie dr Dobbs. Spędziłem 6 miesięcy, zastanawiając się, jak dopasować to do dwóch linii, które mają limit 255 znaków (i tylko jedną gałąź)

Więcej informacji: http://davesource.com/Projects/SpeedWaller/

Wpisany program ma dokładnie dwie linie:

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

Lista po sformatowaniu wygląda następująco:

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

Ta gra jest naprawdę dwóch graczy i zawiera „instrukcje” u dołu strony przedstawiające klucze, a także licznik, dzięki czemu można zobaczyć, ile kroków przeżyłeś. Ma 478 znaków, 16 z nich to instrukcje i dane wyjściowe licznika, więc 462, jeśli chcesz je ogolić.

David Ljung Madison Stellar
źródło
4

C # .NET Framework 4.7.2 Konsola ( 2456 2440 2424 2408 2052 1973 1747 1686 bajtów)

To było zabawne, ale naprawdę musiałem pomyśleć, jakie zmienne są, ponieważ są one tylko jedną literą.

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();}

Niektóre zrzuty ekranu:

Snake z wynikiem 10 Snake rozbił się z wynikiem 4

Dwójkowy: https://github.com/wooden-utensil/snakeCodeGolf/releases/tag/v1.0.0.0

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

Dziennik zmian: https://github.com/wooden-utensil/snakeCodeGolf/releases

facepalm42
źródło
1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
Stephen
1
Próbowałeś krotek jak w (int X,int Y)d; ...; d=(0,-1)? To może zaoszczędzić bajty. Nie rozumiem też, dlaczego robisz Vector2 d;Vector2 c;Vector2 a;zamiast Vector2 d,c,a. Myślę, że możesz również przechowywać funkcję Console.SetCursorPosition jako Action<...>zmienną jednoliterową. Możesz odjąć DateTime za pomocą operatora -. Możesz także deklarować zmienne pętlowe globalnie i po prostu je wyzerować w razie potrzeby, bez deklarowania.
mój zaimek to monicareinstate
1
[sugestie ciąg dalszy] Możesz użyć 1>0lub zapisać truew zmiennej zamiast słowa kluczowego. Możesz być w stanie użyć chwalebnego operatora -> w pętlach. W DateTime b = DateTime.Nowczęści bmoże być var. Możesz lub możesz nie być w stanie zapisać niektórych bajtów dynamic(często pozwala łączyć deklaracje o różnych typach).
mój zaimek to monicareinstate
1
Pociągnięcie m.write(String)do niego własny jedna litera długo funkcja prawdopodobnie zaoszczędzić mnóstwo
Veskah
1
Jest też kilka bloków, z których wiele się korzysta, b.widthi b.heightwiele z nich można prawdopodobnie zapisać w innym lokalnym var o nazwie 1 litera
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)

Nie rezygnuje czysto. Kawałek może zniknąć, jeśli odrodzi się na wężu.

Trang Oul
źródło
1

Bash (zbyt wiele znaków: ok. 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

Zrzut ekranu

gniourf_gniourf
źródło