Construye un Roguelike simple

8

Este desafío se basa en uno propuesto en el grupo usenet rec.games.roguelike.development hace unos años. No puedo encontrar la publicación original del grupo de noticias, pero puedes echar un vistazo al repositorio de soluciones de Github . ¡Solo se jugó en un par de idiomas y me encantaría ver más!

Objetivo

El objetivo es construir un programa que presente una vista de arriba a abajo de una mazmorra usando caracteres ascii. Habrá un @letrero que representa al jugador que se puede mover a través del espacio libre en la mazmorra (representado por ), aunque no puede pasar a través de las paredes (representado por #).

El mapa de la mazmorra debe verse así:

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

El jugador debe comenzar en la ubicación {2,2}, donde {0,0} es la esquina superior izquierda.

Interfaz

El usuario debe poder mover al jugador en las cuatro direcciones cardinales utilizando las teclas de flecha del teclado.

Debe haber alguna forma para que el usuario salga del programa. No necesita ser una salida elegante (por ejemplo, no importa si se imprime una excepción).

El mapa y el jugador deben dibujarse antes de tomar cualquier entrada, y el jugador debe actualizarse después de cada entrada.

Bibliotecas

Siéntase libre de usar bibliotecas establecidas para la entrada o salida de la consola, como Curses. Solo menciona en tu respuesta lo que estás usando.

Puntuación

Este es el código de golf, ¡el código más corto gana!

Paul Prestidge
fuente
Muy cerca de un duplicado de Construir un motor para un juego de laberinto que ciertamente podría usar algunas entradas adicionales. Pensamientos?
dmckee --- ex gatito moderador
@dmckee Definitivamente es bastante similar. Espero que el mecanismo de entrada más simple y el desafío de codificar de manera eficiente el mapa preestablecido lo haga lo suficientemente diferente.
Paul Prestidge
Ciertamente compraré el bit de mapa codificado. Ahora déjame pensar en cómo podría adaptar mi solución anterior ...
dmckee --- ex-gatito moderador
2
No puedo evitar mencionar el juego que me presentó a C: nethack.org
SeanC

Respuestas:

6

C, 257253 222 220

Utiliza en system("cls")lugar de maldiciones (uso system("clear")para sistemas Linux) y un algoritmo inteligente para ajustar el mapa en un número de 8 dígitos. Las teclas no extendidas finalizan el programa, por ejemplo, escape.

EDITAR: ahora también muestra a tu héroe debajo del mapa usando en a<230lugar 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
fuente
Esto no se compila para mí.
Matt
Compila y funciona para mí usando Visual Studio 2008.
Sir_Lagsalot
@Matt: Hm .. Intenté con éxito tanto MinGW (gcc 4.6.1) como MSVC (VS 2009) en Windows hasta ahora. ¿Cuál es el mensaje de error?
schnaader
@schnaader en gcc 4.4.5 Obtengo: test.c :(. text + 0x1a1): referencia indefinida a `putch '. Me sale el mismo error para getch
Matt
Porque putchhay lo putcharque hace lo mismo, pero no sé cómo reemplazarlo getch, también hay uno getchar, pero no funciona para mí, parece que no reconoce las teclas del cursor.
schnaader
4

Ruby 1.9 + Maldiciones (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
fuente
1
Que utiliza un mapa diferente del especificado. Recomiendo usar 0xf3e499e601c0d0240b0380679927cf en su lugar.
Matt
@ Matt buena captura, gracias!
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]

La biblioteca Python Curses solo es oficialmente compatible con Linux. Hay no oficiales disponibles para Windows, pero no puedo garantizar que esto funcione con él.

Para guardar algunos caracteres, codifiqué los códigos para arriba, abajo, izquierda y derecha. Esto puede causar problemas a algunas personas. Si esto no funciona para alguien, puedo publicar una versión que debería.

Use ctrl + c para salir. Probablemente tendrá que restablecer su terminal después de salir, pero el desafío dijo específicamente que la salida no tenía que ser elegante.

Mate
fuente
1

QBasic, 314 313 bytes

Este tipo de problema simplemente pide una solución 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

Este es QBasic golfizado, que se ampliará significativamente por el autoformatter. Pero, si escribe este código exacto en el IDE y presiona F5, debería ejecutarse. Probado en QB64 .

Captura de pantalla

Explicación:

El mapa está codificado en filas como los bits de los enteros en la DATAdeclaración (1 para el espacio, 0 para el muro). El FORbucle anidado los descomprime, almacena valores de verdad en la matriz 2D we imprime #o en consecuencia. (¡Tenga en cuenta que cierto en QBasic es -1, por lo tanto, por qué estamos sumando a 35 en lugar de restar!) El jugador comienza en 3,3 porque la mayoría de las cosas están indexadas en 1 en QBasic.

Entonces entramos en un GOTObucle: imprimir el @, obtenemos la entrada de teclado, convertido al código de carácter prolongado, y modificamos xy yen función de si el usuario pulsa L / T / R / D. Si w(x,y)es cierto, entonces es un espacio y podemos movernos allí; de lo contrario, quédese. Finalmente, la forma más corta que encontré para salir es presionando la tecla tab (ASCII 9). Cualquier otra entrada nos devuelve a la primera LOCATEdeclaración.

Debo decir que me hizo cosquillas haber derrotado a Python con una respuesta QBasic.

DLosc
fuente