Wyzwanie polega na stworzeniu klasycznej gry Snake przy użyciu jak najmniejszej liczby bajtów.
Oto wymagania:
- Gra musi być zaimplementowana w typowym dwuwymiarowym układzie. Wąż powinien być zdolny do znacznego wzrostu w granicach mapy (to naprawdę oznacza, nie zmniejszaj mapy za bardzo, skorzystaj z własnego uznania tutaj).
- Użytkownik może przesunąć węża za pomocą wybranych przez ciebie klawiszy, jednak wąż nie może się podwoić (np. Jeśli jedzie na zachód, nie może lecieć na wschód bez uprzedniej podróży na północ lub południe). Wąż powinien być w stanie podróżować we wszystkich 4 kierunkach: w górę, w dół, w lewo, w prawo (północ, południe, zachód, wschód).
- Wąż zaczyna się od długości 1, za każdym razem, gdy zjada obiekt „jedzenia”, rośnie o +1
- Przedmioty żywnościowe są losowo umieszczane w miejscach innych niż te zajmowane przez węża
- Jeśli Wąż uderzy o siebie lub o ścianę, gra się kończy
- Po zakończeniu gry wyświetlany jest dosłowny „Wynik: [wynik]”, gdzie [wynik] to liczba artykułów spożywczych zjedzonych podczas gry. Na przykład, jeśli wąż zjadł 4 „pokarmy” (a zatem ma długość 5) po zakończeniu gry, zostanie wydrukowany „Wynik: 4”.
- Brak algorytmów kompresji, chyba że są one wyraźnie zdefiniowane w kodzie.
Oto moje rozwiązanie, 908 bajtów, Python 2.7
import random as r
import curses as c
def g(s,w,l):
while 1:
p=[r.randrange(0,w),r.randrange(0,l)]
for l in s:
if l==p:continue
return p
s=[]
d=[0,1]
p=k=n=0
e=100
v={65:[-1,0],66:[1,0],68:[0,-1],67:[0,1]}
z=c.initscr()
w,l=z.getmaxyx()[0],z.getmaxyx()[1]
c.noecho()
z.clear()
x=g(s,w,l)
s.append([w/2,l/2])
z.nodelay(1)
q=lambda h,i:range(h,len(i))
while k!=101:
k=z.getch()
if k in v and not (d[0]==(v[k][0]*-1) and d[1]==(v[k][1]*-1)):d=v[k]
f=[0,0]
for i in q(0,s):
if i == 0:
f=[s[i][0],s[i][1]]
s[i][0]+=d[0]
s[i][1]+=d[1]
else:s[i],f=f,s[i]
if s[0]==x:
n+=1
s.append(f)
x=g(s,w,l)
z.clear()
if s[0][0]>=w or s[0][1]>=l or s[0][0]<0 or s[0][1]<0:break
for i in q(1,s):
if s[0] == s[i]: k = 101
for i in q(0,s):z.addch(s[i][0],s[i][1],"X")
z.addch(x[0],x[1],"O")
z.move(0,0)
z.refresh()
if d[1]!=0:c.napms(e/2)
else:c.napms(e)
c.endwin()
print 'Score: %s'%n