2D Dungeon Crawler

9

Su programa tiene que tomar una cadena de líneas múltiples, como esta:

#############
#           #
#     p     #
#           #
#############

pes el jugador y #es un bloque.

Ahora debajo de eso en la terminal debería haber una línea de entrada que diga:

How do you want to move?

Si el jugador escribe lque tiene que caminar hacia la izquierda cuando no hay un bloque, de lo contrario, cuando hay un bloque, no puede pasar y no se mueve, por supuesto, ahora la salida en la terminal debe actualizarse ( y la salida anterior borrada / sobrescrita):

#############
#           #
#    p      #
#           #
#############

Puede escribir lpara izquierda, rpara derecha, upara arriba y dpara abajo.

La entrada siempre será multilínea, pero no siempre se rellenará con espacios en un rectángulo perfecto. Además, los hash pueden estar en cualquier parte de la cadena y no siempre estarán conectados entre sí. Por ejemplo:

##  ##
#  #
## p
     #

Es una mazmorra válida. (tenga en cuenta la falta de espacios finales en cada línea)

Si el jugador sale de la cadena, no tiene que mostrarse. Pero si regresa más tarde, debe mostrarse nuevamente.

Y los límites de "fuera" de la cadena son length(longest_line)por number_of_linesrectángulo, por lo que incluso si una línea no se rellena con espacios a la derecha, esa ubicación no se considera fuera de los límites. Ejemplo usando la mazmorra anterior:

##  ##
#  #p
##  
     #

La segunda línea no tenía un espacio donde ahora está la p, pero eso no importa.

Finalmente, su programa debe recorrer siempre para siempre la entrada.

Casos de prueba

Caso de prueba 1:

####
# p#
#
####

How do you want to move?
d

####
#  #
# p
####

Caso de prueba 2:

####
  p#
   #
####

How do you want to move?
l

####
 p #
   #
####

How do you want to move?
d

####
   #
 p #
####

How do you want to move?
l

####
   #
p  #
####

How do you want to move?
l

####
   #
   #
####

How do you want to move?
r

####
   #
p  #
####

Por supuesto, estos no están completos. Su código debe repetirse para siempre y borrar la pantalla entre cada salida .

Su salida puede solicitar la entrada como How do you want to move?\n<input>o How do you want to move?<input>(es decir, no necesita la entrada en una línea en blanco), y no necesita una línea vacía entre la línea final de la mazmorra y la solicitud. (Sin embargo, no pueden estar en la misma línea)

¡Las lagunas estándar no están permitidas! Este es el código de golf, por lo que gana el código más corto en bytes.

LMD
fuente
2
¿Es aceptable si la entrada es una letra seguida de enter? Además, sugiero deshacerse de tener que imprimir esa cadena, que no parece agregar nada al desafío
Luis Mendo
2
Creo que esto es re-abrir, pero mi sugerencia es que la entrada rápida (para l, r, u, o d) puede ser cualquier cosa, no sólo "¿Cómo se quiere mover"? Realmente no afecta las respuestas excepto por el golf.
Rɪᴋᴇʀ
@EasterlyIrk: no estaría de acuerdo. Porque en este caso, los golfistas tendrán que pensar en cómo comprimir la cadena para guardar bytes.
LMD
2
@ user7185318 Tenga esto en cuenta , básicamente siga con 1 problema por desafío. Comprimir la cadena es un problema completamente separado y luego hacer un rastreador de mazmorras, y por lo tanto, probablemente no se debe abordar ese desafío.
Rɪᴋᴇʀ
1
¿Es aceptable que el jugador se muestre cuando está fuera de límites o necesita desaparecer?
mwh

Respuestas:

1

MATLAB, 268 247 246 bytes

Probablemente no competitivo, pero fue divertido. Versión de golf:

function f(s);d=char(split(s,'\n'));[y,x]=ind2sub(size(d),find(d=='p'));while 1;d
c=uint8(input('How do you want to move?','s'))-100;v=y+~c-(c==17);w=x+(c==14)-(c==8);try;d(y,x)=' ';end;try;if'#'==d(v,w);v=y;w=x;end;d(v,w)='p';end;y=v;x=w;clc;end

Versión legible:

function f(s)
% Split the string on newlines and convert to a padded char array
d = char(split(s,'\n'));

% Get the initial indices of p
[y,x] = ind2sub(size(d),find(d=='p'));

% Loop forever
while 1
    % Implicitly display the dungeon
    d

    % Get the ASCII of the user input, minus 100 (saves a few bytes in
    % the comparisons)
    c=uint8(input('How do you want to move?','s'))-100;

    % Get the new y from the ASCII
    v = y+~c-(c==17);

    % Get the new x from the ASCII
    w = x+(c==14)-(c==8);

    % Clear the player from the dungeon if they are in it
    try
        d(y,x)=' ';
    end

    % Check if new position is a #, and revert to old position if so
    try
        if '#'==d(v,w)
            v=y;w=x;
        end
        d(v,w)='p';
    end
    % Update x and y
    y=v;
    x=w;

    % Clear the screen
    clc;
end

Los trybloques son para evitar que la función falle en errores fuera de límites. Estoy seguro de que dos de ellos son excesivos, pero no puedo jugar golf mejor que eso.

Vale la pena señalar que MATLAB expandirá la matriz hacia abajo y hacia la derecha, pero el jugador desaparecerá cuando se mueva a un área 'inexplorada' por primera vez. Por ejemplo, si te mueves fuera de los límites actuales de la mazmorra hacia la derecha en un espacio, desaparecerás, pero el próximo giro MATLAB expandirá la matriz para incluir la nueva columna (o fila, si te mueves hacia abajo). '#'==d(y,x)ahorra un byte en comparación con d(y,x)=='#', ya que no necesita un espacio entre ify'#'

mwh
fuente
Buena respuesta ! Espero que esta vez no gane algo muy corto, aquí los idiomas comunes también deberían tener una oportunidad, porque cuanto más grande sea el desafío, mejor será Java, etc. :)
LMD
1

Escritura de café: 580 bytes

He exprimido todo lo que pude de este algoritmo en particular y mi cerebro cansado. Necesito unas vacaciones.

C=console
e='length'
N=null
f=(S)->
    x=y=X=Y=N
    q=(c,v)->
        X=[x+c,N][+(-1<x+c<w)]
        Y=[y+v,N][+(-1<y+v<h)]
        try L[y+v][x+c]!='#'catch
            1
    r=(s)->
        if (X||Y)
            return
        L[y]=((t=L[y].split '')[x]=s)
        L[y]=t.join ''
    while 1
        L=S.split '\n'
        [h,w]=[L[e],L[0][e]]
        x=[X,x][+(x?)]
        y=[Y,y][+(y?)]
        for k in[0..h*w-1]
            if L[k//h][k%w]=='p'
                x=k%w
                y=k//h
        C.clear()
        C.log S
        r(' ')
        switch prompt("How do you want to move?")
            when'l'
                q(-1,0)&&x--
            when'r'
                q(1,0)&&x++
            when'u'
                q(0,-1)&&y--
            when'd'
                q(0,1)&&y++
        r('p')
        S=L.join '\n'
Señor ratte
fuente
buena solución, Lord Ratte
LMD