Crie um simples Roguelike

8

Esse desafio é baseado em uma proposta do grupo usenet rec.games.roguelike.development há alguns anos. Não consigo encontrar a postagem original do grupo de notícias, mas você pode conferir o repositório de soluções do Github . Foi jogado apenas em alguns idiomas e eu adoraria ver mais!

Objetivo

O objetivo é criar um programa que apresente uma visão de cima para baixo de uma masmorra usando caracteres ascii. Haverá um @sinal representando o jogador que pode ser movido através do espaço livre na masmorra (representado por ), embora ele não possa passar através das paredes (representado por #).

O mapa da masmorra deve ficar assim:

####  ####
#  #  #  #
#  ####  #
#        #
##      ##
 #      #
 #      #
##      ##
#        #
#  ####  #
#  #  #  #
####  ####

O jogador deve começar no local {2,2}, onde {0,0} é o canto superior esquerdo.

Interface

O usuário precisa ser capaz de mover o player nas quatro direções principais usando as teclas de seta do teclado.

É necessário que haja alguma maneira de o usuário sair do programa. Ele não precisa ser uma saída normal (por exemplo, não importa se uma exceção é impressa).

O mapa e o jogador precisam ser desenhados antes que qualquer entrada seja recebida, e o jogador precisa ser atualizado após cada entrada.

Bibliotecas

Sinta-se livre para usar bibliotecas estabelecidas para entrada ou saída do console, como Maldições. Apenas mencione na sua resposta o que você está usando.

Pontuação

Este é o código de golfe, o código mais curto vence!

Paul Prestidge
fonte
Bem perto de uma duplicata do Build a engine para um jogo de labirinto que certamente poderia usar algumas entradas adicionais. Pensamentos?
dmckee --- gatinho ex-moderador
@dmckee É definitivamente bem parecido. Espero que o mecanismo de entrada mais simples e o desafio de codificar com eficiência o mapa predefinido o tornem diferente o suficiente.
Paul Prestidge
Certamente comprarei o bit do mapa codificado. Agora, deixe-me só penso em como eu poderia se adaptar a minha solução anterior ...
dmckee --- ex-moderador gatinho
2
Eu só não posso deixar de mencionar o jogo que me apresentou a C: nethack.org
SeanC

Respostas:

6

C, 257253 222 220

Usa em system("cls")vez de maldições (use system("clear")para sistemas Linux) e um algoritmo inteligente para ajustar o mapa em um número de 8 dígitos. Teclas não estendidas encerram o programa, por exemplo, escape.

EDIT: Agora também mostra seu herói abaixo do mapa usando em a<230vez de a<132:

    ##
   ####
 ###  ###
 # #  # #
## #  # ##
   ####
  #    #
 ##    ##

Código:

a,p=14,w=11,X,Y;m(I){X=I%w-1,Y=I/w;return 70313263>>(Y>5?w-Y:Y)*5+(X>4?9-X:X)&1;}main(){do{system("cls");a=a&4?1:a&2?-1:a&8?-w:w;p+=!m(p+a)*a;for(a=0;++a<230;)putch(a%w?a-p?m(a)*35:64:10);}while(a=getch()>>7?getch():0);}
schnaader
fonte
Isso não compila para mim.
24512 Matt
Compila e trabalha para mim usando o Visual Studio 2008.
Sir_Lagsalot
@ Matt: Hm .. Tentei com sucesso o MinGW (gcc 4.6.1) e o MSVC (VS 2009) no Windows até agora. Qual é a mensagem de erro?
schnaader
@schnaader no gcc 4.4.5 Recebo: test.c :(. text + 0x1a1): referência indefinida ao `putch '. Eu recebo o mesmo erro para getch
Matt
Pois putchexiste o putcharque faz o mesmo, mas eu não sei como substituir getch- também existe getchar, mas não funciona para mim - parece que não reconhece as teclas do cursor.
schnaader
4

Ruby 1.9 + Maldições (248)

require'curses';include Curses;noecho;curs_set 0
b=0xf3e499e601c0d0240b0380679927cf.to_s(2).tr'01',' #'
s=init_screen<<b.scan(/.{10}/)*$/;s.keypad 1
p=22;d=->t=?@{setpos p/10,p%10;addch t;6};d[]
loop{p=b[v=p+[10,-10,-1,1][getch%d[32]]]<?#?v:p;d[]}
Paul Prestidge
fonte
1
Que usa um mapa diferente do especificado. Eu recomendo usar 0xf3e499e601c0d0240b0380679927cf.
Matt
@ Captura boa Matt, obrigado!
Paul Prestidge
3

Python 332 319 317

from curses import*
M=0xf3e499e601c0d0240b0380679927cf;S=initscr();S.keypad(1);x,y=2,2;A=S.addstr;[A(a,b,[' ','#'][M>>(10*a+b)&1])for a in range(12)for b in range(10)]
while 1:A(y,x,'@');k=S.getch();A(y,x,' ');X=[[x,x-1],[x+1,1]][k==261][k==260];Y=[[y,y-1],[y+1,y+1]][k==258][k==259];x,y=[(X,Y),(x,y)][M>>(10*Y+X)&1]

A biblioteca de maldições python é oficialmente suportada apenas no linux. Existem outros não oficiais disponíveis para o Windows, mas não posso garantir que isso funcione com ele.

Para salvar alguns caracteres, codifiquei os códigos de teclas para cima, baixo, esquerda e direita. Isso pode causar problemas para algumas pessoas. Se isso não funcionar para ninguém, posso postar uma versão que deveria.

Use ctrl + c para sair. Você provavelmente precisará redefinir seu terminal após sair, mas o desafio disse especificamente que a saída não precisava ser agradável.

Matt
fonte
1

QBasic, 314 313 bytes

Esse tipo de problema simplesmente implora por uma solução QBasic.

DIM w(12,10)
FOR r=1TO 12
READ d
FOR c=1TO 10
w(r,c)=(d*2AND 2^c)>0
?CHR$(35+3*w(r,c));
NEXT
?
NEXT
i=3
j=3
1LOCATE i,j
?"@"
a$=""
9a$=INKEY$
IF""=a$GOTO 9
k=ASC(RIGHT$(a$,1))
x=i+(k=72)-(k=80)
y=j+(k=75)-(k=77)
LOCATE i,j
?" "
IF w(x,y)THEN i=x:j=y
IF k>9GOTO 1
DATA 48,438,390,510,252,765,765,252,510,390,438,48

Esse é o QBasic, que será expandido significativamente pelo formador automático. Mas, se você digitar esse código exato no IDE e pressionar F5, ele deverá ser executado. Testado em QB64 .

Captura de tela

Explicação:

O mapa é codificado em linha como os bits dos números inteiros na DATAinstrução (1 para espaço, 0 para parede). O FORloop aninhado os descompacta, armazenando valores verdadeiros na matriz 2D we imprimindo #ou de acordo. (Observe que é verdade no QBasic -1, por isso, adicionamos 35 ao invés de subtrair!) O player começa com 3,3 porque a maioria das coisas é indexada 1 no QBasic.

Em seguida, inserimos um GOTOloop: imprima @, obtenha entrada do teclado, converta em código de caracteres estendido e modifique xe com ybase em se o usuário pressionou L / U / R / D. Se w(x,y)é verdade, então é um espaço e podemos nos mudar para lá; caso contrário, fique parado. Finalmente, a maneira mais curta que encontrei para sair é pressionando a tecla Tab (ASCII 9). Qualquer outra entrada nos leva de volta à primeira LOCATEinstrução.

Devo dizer que estou muito agradado por ter vencido o Python com uma resposta QBasic.

DLosc
fonte