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
Respuestas:
Ruby 1.9 + SDL (
341324316)Aquí hay un primer intento de una versión de Ruby usando la biblioteca SDL. Puedo guardar 6 caracteres si se me permite cargar la biblioteca SDL usando
-rsdl
en la línea de comando en lugar de la instrucción require.Los segmentos de serpiente y las piezas de comida se representan con píxeles negros, el tamaño de la cuadrícula es actualmente de 32 * 32. Puede controlar con las teclas de flecha (o cualquier tecla realmente, el mod 4 del código de tecla indexa la matriz de dirección [IZQUIERDA, ARRIBA, ABAJO, DERECHA]). Creo que definitivamente hay margen de mejora aquí, especialmente en la declaración IF de verificación de muerte.
Lo he mejorado enormemente con respecto a la versión anterior, espero que ahora coincida más con el espíritu de la pregunta.
Hay una cosa que necesito arreglar para cumplir con la especificación, que es que la comida actualmente puede engendrar dentro de la cola.¡Fijo!Imprime el puntaje en stdout después de completar el juego.
fuente
Java,
23432239No es exactamente conciso, pero creo que sigue todos los requisitos.
Clase de serpiente
Clase de la junta
Captura de pantalla
Comentario
Hace un tiempo visité un sitio web llamado zetcode que proporcionaba algunos tutoriales para crear juegos 2D clásicos en Java. El código proporcionado está fuertemente influenciado por el tutorial que se proporcionó para el juego Snake ... Creo que en este momento recién comencé a codificar juegos clásicos y seguí el tutorial hasta una 'T'.
Haré una edición más tarde y agregaré un enlace a un ejecutable para que las personas puedan jugar el juego.
EDICIONES
fuente
Bash:
537533507 caracteresYa que utiliza los
$COLUMNS
y$LINES
las variables de shell, debe ejecutarse de origen:. snake.sh
. La serpiente se puede controlar con las teclas w/ a/ s/ d.Lo sé, se puede reducir fácilmente a 493 caracteres usando
clear
para limpiar la pantalla, pero prefiero mantenerlo purobash
, sin usar ninguna herramienta externa.fuente
Python 2.7:
869816818817816 CaracteresPirateé esto juntos en las últimas horas. Debe cumplir los requisitos y tiene unos pocos caracteres más cortos que la solución de mjgpy3 (Intenté mucho, pero no pude hacerlo mucho más corto. Ahora estoy cansado). Sorprendentemente, el uso de una biblioteca de desarrollo de juegos como pygame no hizo que la serpiente pitón fuera mucho más corta. Sugerencias y consejos sobre cómo acortarlo son muy apreciados. Espero que no sea demasiado críptico.
Este es el resultado:
EDITAR: ¡Podría reducirlo a 816 Bytes, yay! :) Se corrigió el puntaje
EDIT2: pegó la versión incorrecta accidentalmente
Aquí hay una versión comentada:
fuente