Recrie um jogo 'Snake' em um console / terminal


25

Jogos são divertidos

esse codegolf aqui foi tão divertido que tive que criar uma versão para outros jogos clássicos com complexidade semelhante. Maneira mais curta de criar um jogo básico de Space Invaders em Python

Desta vez, no entanto, tente recriar o clássico jogo 'Snake', no qual você começa como uma forma pequena, movendo-se constantemente para coletar peças para aumentar sua pontuação. Quando você recolhe uma peça, sua 'cauda' cresce, seguindo o caminho que você fez. O objetivo é durar mais tempo sem colidir com seu próprio rabo ou contra as paredes

Qualificações:

  • Você, os personagens que compõem a cauda, ​​as paredes e as peças que você coleciona, devem ser todos diferentes
  • mostre um HUD com a pontuação. A pontuação aumenta em 1 ponto para cada peça que você coletar
  • O jogador perde quando colide com o próprio rabo ou na parede
  • uma peça aparece em uma área aleatória imediatamente após a peça ser coletada, sem mencionar no início do jogo
  • A velocidade do jogo não importa, desde que seja consistente
  • As 'células' devem ter caracteres 2x1, já que a altura dos caracteres do bloco é ~ duas vezes a largura. Pode ser 1x1, porque 2x1 é apenas feio e eu realmente não pensei nisso.
  • As teclas para alterar a direção devem ser awsd, esquerda, cima, baixo, direita, respectivamente
  • a direção inicial deve sempre estar acima
  • Você deve mostrar as bordas da parede. A pontuação pode se sobrepor à parede

O código mais curto que atenda aos critérios acima vence. Pontos de bônus imaginários para criatividade


A cobra não deve crescer ao comer?
deixou de girar contra-relógiowis

hm? "Quando você recolhe uma peça, seu 'rabo' cresce, seguindo o caminho que você fez.", Então sim, a cobra cresce.
Blazer

2
Sem os awsde os starting direction should always be uprequisitos, M-x snakeiria trabalhar
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))faria o truque então.
Jonathan Leech-Pepin

Relacionados: Nibbles Nostalgia
sergiol

Respostas:


32

JavaScript ( 553 512 bytes)

Link para a versão reproduzível

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}

Tentei fazer com que ela fosse lançada no console real no início (com console.loge console.clear), mas estava tremendo demais, então coloquei em HTML semelhante ao console. Ele funcionará com isso:

<pre id=x>

Também o implementei com células 2x1 primeiro, mas parecia pior que 1x1. Isso seria uma pequena mudança embora.

Usa awsdteclas no teclado.

Atualizar:

Consegui reduzi-lo para 512 (exatamente 0x200) bytes, melhorando a busca da cauda e fazendo mais mágica.

Agora você ganha 2 pontos quando uma peça aparece em seu rabo (é uma característica). Também consertei a sobreposição quando a cobra se morde.


1
lindo! e você está certo, parece melhor como 1x1 que 2x1. a única preocupação que eu realmente tinha era subir e descer muito mais rápido que a esquerda e a direita, mas é possível considerando as restrições. As luzes piscando no console não me importo muito (veja meu programa de invasores espaciais, é bastante cintilante), mas suponho que uma página da Web em texto simples também funcione! um problema, porém ... existe alguma maneira de reiniciar sem precisar atualizar? :(
Blazer

Não funciona comawsd
Neal

@ Blazer Isso levaria mais 13 caracteres: - / ... e você tem a tecla F5 de qualquer maneira.
copie

@ Neal Sim, eu usei as setas, mas consertei agora.
copie

@copy Suponho que não torná-lo um requisito
Blazer

21

Código da máquina x86 (128 bytes)

Muito parecido com o que eu escrevi para Gerar um Fractal de Mandlebrot , escrevi um estímulo para o jogo da cobra em 128 bytes. Ele não atende totalmente aos requisitos do desafio (começa a se mover para a direita, nem todas as paredes são desenhadas), mas estou postando isso porque acho que é uma solução interessante e criativa. A pontuação é mostrada em binário à direita, as teclas de seta controlam a direção do movimento, a 'comida' é jogada aleatoriamente e termina se você bater em si mesmo, na parede ou na borda da tela.

Link para código executável e fonte

Captura de tela

Além disso, no que diz respeito ao comentário anterior sobre se o dosbox está trapaceando, acho perfeitamente aceitável desde que esteja em um modo de exibição baseado em texto, desde então, é apenas um terminal do DOS.


Por que o DOSBox seria considerado trapaceiro? É uma plataforma perfeitamente legítima.
dfeuer 9/07

9

16 bit 8086

526 bytes / 390 bytes

Decodifique isso usando um decodificador Base64 e chame-o de "snake.com" e execute no prompt de comando do Windows. Testado no WinXP, pode ser necessário usar o DosBox para obter o modo de vídeo correto. As teclas de controle são 'wasd' e espaço para sair. Pressione 'w' para iniciar.

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

Aqui está uma versão em modo de caractere com 390 bytes de comprimento:

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

Esse modo de personagem tem três bytes a mais (mas a cobra é melhor):

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA

pontos para a criatividade, mas acho que usar o dosbox é trapaça, porque o desafio é fazer o jogo funcionar em um console ou terminal ascii, não em um dosbox. Além disso, o código de golfe não deveria ser um código-fonte, não um código binário?
Blazer

7
@ Blazer: Esse é o código fonte - digitei o código da máquina usando um editor hexadecimal - é assim que eu sou! ;-) A coisa do DosBox só é necessária se os drivers de vídeo tiverem problemas com os gráficos do modo 13 (a minha placa está boa com ela). Não seria difícil fazer uma versão ascii (provavelmente menor também)
Skizz

A versão "390 bytes" decodifica para apenas 388 bytes e trava quando executada no dosbox. Parece que algo pode ter sido perdido na transmissão. :( Ainda assim, as outras duas versões são extremamente legais!
Ilmari Karonen

Existe uma versão sem código do código? (Eu não sei essa linguagem)
AL

1
@ n.1: o programa é um código de máquina 8086, você pode carregá-lo em um depurador (D86) e visualizar o código como escrito, embora sem nomes de etiqueta.
SKIZZ

6

concha / sh, 578 caracteres

Tentei ser compatível com POSIX (sendo o mais portátil possível e evitar bashisms, mesmo o gerador de números aleatórios não precisa / proc). Você pode, por exemplo, reproduzi-lo no seu terminal nativo ou através de uma sessão SSH: execute com 'dash -c ./snake'. Também há uma variante ilegível / legível em ~ 2800 bytes, que pode ser vista aqui .

Algumas notas: o script de shell não é adequado para a codificação de jogos 8-)

  • para ser justo, usamos apenas os chamados 'builtins', o que significa:
    • nenhuma chamada externa de programas como 'clear', 'stty' ou 'tput'
    • por isso, redesenhamos a tela inteira a cada movimento
    • os únicos componentes internos usados ​​(também conhecidos como comandos nativos) são:
      • eco, eval, while-loop, deixe, quebre, leia, caso, teste, conjunto, mudança, alias, fonte
  • não existe um gerador de números aleatórios (PRNG), então temos que construir nosso próprio
  • obtendo um pressionamento de tecla, então precisamos gerar outro thread
    • para obter o evento na tarefa pai, usamos um arquivo temporário (feio!)
  • a cobra em si é uma lista, que é barata:
    • cada elemento é um (x, y) -tuplo
    • perder a cauda significa: mudar a lista por 1
    • adicionar uma (nova) cabeça significa: acrescentar uma string
  • a grade é internamente uma matriz, mas o shell / sh não sabe disso:
    • nós "emulamos" a matriz (x, y) através de uma chamada de avaliação feia com vars globais
  • e finalmente: nos divertimos muito!
#!/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

insira a descrição da imagem aqui


Isso realmente funciona ? se a cobra estiver indo para a direita e você pressioná- ala para. Esquisito.
gniourf_gniourf

Sim, porque você se morde - é assim que deve ser o IMHO. Discutimos isso internamente e todos concordam com isso.
Bastian Bittorf

echo -ndefinitivamente não é portátil. Se o primeiro operando for -n ou se algum dos operandos contiver um caractere de barra invertida ('\'), os resultados serão definidos pela implementação. Usar eco para qualquer coisa que não seja texto literal sem nenhuma opção não é portátil. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h

nyuszika7h: alguma idéia de como circuncidar isso?
Bastian Bittorf

nyuszika7h: Encontrei uma maneira de remover a chamada principal 'eco-n' - portanto, resta apenas uma chamada. está chamando a fuga de seqüência para 'ir para casa posição (0,0)'
Bastian Bittorf

4

Ruby 1.9 / apenas Windows / ( 354 337 355 346 bytes)

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

Reproduz em uma placa 20x40 no console do Windows. A pontuação é mostrada sob o quadro. Use WASDpara controlar a cobra, qualquer outra tecla para sair (com força!). Edite o tempo de suspensão no final da linha 5 para controlar a velocidade. (Ou salve 10 caracteres e torne-o quase impossível de jogar removendo completamente o sono!)

Recurso de bônus: falha ao iniciar aleatoriamente (quando a peça inicial é gerada no local da cobra).

Eu precisava de ~ 100 caracteres para solucionar a falta de um getchar sem bloqueio. Aparentemente, o Ruby 1.9.3 inclui uma biblioteca "io / console" que salvaria cerca de metade deles. E esta solução é específica do Windows. Existem soluções publicadas para fazer o mesmo tipo de coisa nos sistemas * nix, mas não as testei para comparar a contagem de caracteres.

Editar:

Tive que adicionar 18 bytes depois que percebi que a cauda só cresce depois de comer, não depois de cada passo.

Editar 2: (possivelmente) problema de falha corrigido, salvou os 9 bytes restringindo a um item de comida.


Gosto da ideia de vários itens de comida de uma só vez, mas há um grande problema: a cauda deve se mover com o jogador, crescendo apenas um personagem para cada pedaço de comida que você coletar.
Blazer

Você adicionou o comentário enquanto eu estava trabalhando para corrigi-lo ... Se houver apenas uma peça, eu posso remover a 9.times{}, salvando 9 caracteres.
precisa saber é o seguinte

a única exigência é que haja um ou mais pedaço de comida de cada vez, então sim, você poderia apenas fazer 1 peça de cada vez, poupando alguns personagens
Blazer

o jogo caiu aleatoriamente sobre mim em ~ 140 pontos, não sei por quê. mas caso contrário muito agradável
Blazer

Corrigido o acidente, eu acho. Se ele travar novamente, informe a mensagem de erro do ruby.
ASHelly

4

Applesoft Basic - 478 (462)

Este foi o meu primeiro código de golfe, mas foi escrito em 1989 e implementa o jogo de cobra conforme solicitado (mas sem comida, as cobras crescem continuamente, e na verdade são dois jogadores, não um) usando apenas duas linhas de Applesoft Basic.

Havia uma série de concursos de programas de duas linhas na época, como no diário do Dr. Dobbs. Passei 6 meses descobrindo como encaixar isso em duas linhas com limite de 255 caracteres (e apenas um ramo)

Mais informações em: http://davesource.com/Projects/SpeedWaller/

O programa digitado é exatamente duas linhas:

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

A listagem, quando formatada, fica assim:

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

O jogo é na verdade dois jogadores e inclui "instruções" na parte inferior da página, mostrando as teclas e um contador para que você possa ver quantos passos você sobreviveu. São 478 caracteres, 16 deles são as instruções e a saída do contador; portanto, 462, se você deseja cortá-los.


4

Console do C # .NET Framework 4.7.2 ( 2.456 2.440 2.424 2.408 2.052 1.973 1.747 1.686 bytes)

Isso foi divertido, mas eu realmente tive que pensar quais variáveis ​​eram o que, porque são apenas uma letra.

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

Algumas capturas de tela:

Cobra com 10 pontos Cobra caiu com pontuação de 4

Binário: https://github.com/wooden-utensil/snakeCodeGolf/releases/tag/v1.0.0.0

Repositório do GitHub: https://github.com/wooden-utensil/snakeCodeGolf

Registro de alterações: https://github.com/wooden-utensil/snakeCodeGolf/releases


1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
Stephen

1
Você já tentou tuplas como em (int X,int Y)d; ...; d=(0,-1)? Isso pode salvar bytes. Eu também não consigo ver por que você está fazendo, em Vector2 d;Vector2 c;Vector2 a;vez de Vector2 d,c,a. Eu acho que você também pode armazenar a função Console.SetCursorPosition como uma Action<...>variável de letra única. Você pode subtrair DateTime com o operador -. Você também pode declarar variáveis ​​de loop globalmente e simplesmente zerá-las quando necessário, sem declará-las.
meu pronome é monicareinstate

1
[sugestões continuam] Você pode usar 1>0ou armazenar trueem uma variável em vez de usar a palavra-chave. Você pode usar o glorioso operador -> nos loops. Na DateTime b = DateTime.Nowparte, bpode ser var. Você pode ou não conseguir salvar alguns bytes usando dynamic(geralmente permite mesclar declarações de tipos diferentes).
meu pronome é monicareinstate

1
Puxar m.write(String)para sua própria função de uma letra provavelmente economizaria uma tonelada
Veskah 08/07

1
Existem também alguns blocos que podem ser usados b.widthe b.heightmuitos que provavelmente poderiam ser salvos em outra var local com o nome de uma letra
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)

Não sai corretamente. A peça pode desaparecer se aparecer em cima da cobra.


1

Bash (muitos caracteres: ca. 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

Captura de tela

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.