O desafio é criar o clássico jogo de cobra usando o mínimo de bytes possível.
Aqui estão os requisitos:
- O jogo deve ser implementado em um layout bidimensional típico. A cobra deve ser capaz de crescer significativamente dentro dos limites do mapa (isso realmente significa, não faça seu mapa muito pequeno, use sua discrição aqui).
- Um usuário pode mover a cobra usando as chaves de sua escolha; no entanto, a cobra não pode se dobrar (por exemplo, se estiver indo para o oeste, não poderá ir para o leste sem primeiro ir para o norte ou sul). Uma cobra deve poder viajar em todas as 4 direções: cima, baixo, esquerda, direita (norte, sul, oeste, leste).
- A cobra começa com o comprimento 1, cada vez que come um objeto de "comida" cresce +1 em comprimento
- Os objetos alimentares são colocados aleatoriamente em locais que não sejam os ocupados pela cobra
- Se a Cobra bater em si mesma ou em uma parede, o jogo termina
- Quando o jogo termina, o literal "Score: [score]" é exibido onde [score] é o número de itens alimentares consumidos durante o jogo. Por exemplo, se a cobra comer 4 "comidas" (e, portanto, tiver 5) quando o jogo terminar, "Pontuação: 4" será impressa.
- Não há algoritmos de compactação, a menos que estejam explicitamente definidos no seu código.
Aqui está a minha solução, 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
Respostas:
Ruby 1.9 + SDL (
341324316)Aqui está uma primeira tentativa de uma versão Ruby usando a biblioteca SDL. Posso salvar 6 caracteres se for permitido carregar a biblioteca SDL usando
-rsdl
na linha de comando, em vez da instrução require.Os segmentos de cobra e pedaços de comida são representados usando pixels pretos, o tamanho da grade é atualmente 32 * 32. Você pode controlar com as teclas de seta (ou qualquer outra tecla, o código de chave mod 4 indexa a matriz de direção [ESQUERDA, CIMA, BAIXO, DIREITA]). Eu acho que definitivamente há espaço para melhorias aqui, especialmente na declaração SE da verificação da morte.
Eu melhorei bastante isso em relação à versão anterior, e espero que ela se aproxime mais do espírito da questão agora.
Há uma coisa que preciso corrigir para cumprir as especificações, que é a de que alimentos podem aparecer no interior da cauda.Fixo!Imprime a pontuação em stdout após o término do jogo.
fonte
Java,
23432239Não é exatamente conciso, mas acredito que segue todos os requisitos.
Classe cobra
Classe de diretoria
Captura de tela
Comentário
Há algum tempo, visitei um site chamado zetcode, que fornecia alguns tutoriais para a criação de jogos 2D clássicos em Java. O código fornecido é fortemente influenciado pelo tutorial que foi fornecido para o jogo Snake ... Acho que, nesse momento, comecei a codificar jogos clássicos e segui o tutorial para um 'T'.
Farei uma edição mais tarde e adicionarei um link a um executável para que as pessoas possam jogar.
EDITAR% S
fonte
Bash:
537533507 caracteresComo ele usa os
$COLUMNS
e$LINES
variáveis do shell, ele deve ser executado de origem:. snake.sh
. A cobra pode ser controlada com os w/ a/ s/ dchaves.Eu sei, ele pode ser facilmente reduzido para 493 caracteres usando
clear
para limpar a tela, mas eu prefiro mantê-lo purobash
, sem usar nenhuma ferramenta externa.fonte
Python 2.7:
869816818817816 caracteresEu cortei isso juntos nas últimas horas. Ele deve atender aos requisitos e é alguns caracteres menor que a solução de mjgpy3 (tentei muito, mas não consegui obtê-lo muito mais curto. Agora estou cansado). Surpreendentemente, o uso de uma biblioteca de desenvolvimento de jogos como o pygame não reduziu muito a python-snake. Sugestões e dicas sobre como reduzi-lo são muito apreciadas. Espero que não seja muito enigmático.
Este é o resultado:
EDIT: Eu poderia reduzi-lo para 816 bytes, yay! :) Corrigido o placar
EDIT2: colou a versão errada acidentalmente
Aqui está uma versão comentada:
fonte