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
awsd
e osstarting direction should always be up
requisitos,M-x snake
iria trabalharM-: (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.Respostas:
JavaScript (
553512 bytes)Link para a versão reproduzível
Tentei fazer com que ela fosse lançada no console real no início (com
console.log
econsole.clear
), mas estava tremendo demais, então coloquei em HTML semelhante ao console. Ele funcionará com isso:Também o implementei com células 2x1 primeiro, mas parecia pior que 1x1. Isso seria uma pequena mudança embora.
Usa
awsd
teclas 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.
fonte
awsd
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
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.
fonte
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.
Aqui está uma versão em modo de caractere com 390 bytes de comprimento:
Esse modo de personagem tem três bytes a mais (mas a cobra é melhor):
fonte
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-)
fonte
a
la para. Esquisito.echo -n
definitivamente 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.htmlRuby 1.9 / apenas Windows / (
354 337 355346 bytes)Reproduz em uma placa 20x40 no console do Windows. A pontuação é mostrada sob o quadro. Use
WASD
para 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.
fonte
9.times{}
, salvando 9 caracteres.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:
A listagem, quando formatada, fica assim:
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.
fonte
Console do C # .NET Framework 4.7.2 (
2.4562.4402.4242.4082.0521.9731.7471.686 bytes)Isso foi divertido, mas eu realmente tive que pensar quais variáveis eram o que, porque são apenas uma letra.
Algumas capturas de tela:
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
fonte
Console.Write("Score:"+l);Console.WriteLine()
->Console.WriteLine("Score:"+l)
(int X,int Y)d; ...; d=(0,-1)
? Isso pode salvar bytes. Eu também não consigo ver por que você está fazendo, emVector2 d;Vector2 c;Vector2 a;
vez deVector2 d,c,a
. Eu acho que você também pode armazenar a função Console.SetCursorPosition como umaAction<...>
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.1>0
ou armazenartrue
em uma variável em vez de usar a palavra-chave. Você pode usar o glorioso operador -> nos loops. NaDateTime b = DateTime.Now
parte,b
pode servar
. Você pode ou não conseguir salvar alguns bytes usandodynamic
(geralmente permite mesclar declarações de tipos diferentes).m.write(String)
para sua própria função de uma letra provavelmente economizaria uma toneladab.width
eb.height
muitos que provavelmente poderiam ser salvos em outra var local com o nome de uma letraPython 3 - 644
Não sai corretamente. A peça pode desaparecer se aparecer em cima da cobra.
fonte
Bash (muitos caracteres: ca. 1522)
fonte