El desafío es crear el clásico juego Snake usando la menor cantidad de bytes posible.
Aquí están los requisitos:
- El juego debe implementarse en un diseño bidimensional típico. La serpiente debería poder crecer significativamente dentro de los límites del mapa (esto realmente significa, no haga su mapa demasiado pequeño, use su discreción aquí).
- Un usuario puede mover la serpiente usando las teclas que elija, sin embargo, la serpiente no puede doblarse sobre sí misma (por ejemplo, si va hacia el oeste, no puede ir hacia el este sin ir primero hacia el norte o hacia el sur). Una serpiente debería poder viajar en las 4 direcciones: arriba, abajo, izquierda, derecha (norte, sur, oeste, este).
- La serpiente comienza como longitud 1, cada vez que come un objeto "comida" crece +1 en longitud
- Los objetos de comida se colocan al azar en lugares distintos de los ocupados por la serpiente
- Si la serpiente se golpea a sí misma o a una pared, el juego termina
- Cuando finaliza el juego, se muestra el literal "Puntaje: [puntaje]" donde [puntaje] es el número de alimentos consumidos durante el juego. Entonces, por ejemplo, si la serpiente ha comido 4 "alimentos" (y por lo tanto tiene una longitud de 5) cuando termina el juego, se imprimirá "Puntuación: 4".
- No hay algoritmos de compresión a menos que estén explícitamente definidos en su código.
Aquí está mi solución, 908 Bytes, 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