2D Dungeon Crawler

9

Votre programme doit prendre une chaîne à plusieurs lignes, comme ceci:

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

pest le joueur et #est un bloc.

Maintenant sous cela dans le terminal devrait être une ligne d'entrée disant:

How do you want to move?

Si le joueur tape, lil doit marcher à gauche quand il n'y a pas de bloc, sinon, quand il y a un bloc, il ne peut pas passer et ne bouge pas bien sûr, maintenant la sortie dans le terminal doit être mise à jour ( et la sortie précédente effacée / remplacée):

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

Il peut taper lpour gauche, rpour droite, upour haut et dpour bas.

L'entrée sera toujours multiligne, mais ne sera pas toujours remplie d'espaces dans un rectangle parfait. De plus, les hachages peuvent être n'importe où dans la chaîne et ne seront pas toujours connectés les uns aux autres. Par exemple:

##  ##
#  #
## p
     #

est un donjon valide. (notez le manque d'espaces de fin sur chaque ligne)

Si le joueur sort de la chaîne, il n'a pas besoin d'être affiché. Mais s'il revient plus tard, il doit à nouveau être affiché.

Et les limites de « l' extérieur » de la chaîne sont length(longest_line)par number_of_linesrectangle, même si une ligne n'est pas rembourré avec des espaces à droite, cet endroit est pas considéré hors limites. Exemple utilisant le donjon précédent:

##  ##
#  #p
##  
     #

La deuxième ligne n'avait pas d'espace où le p est maintenant, mais cela n'a pas d'importance.

Enfin, votre programme doit boucler pour toujours en prenant une entrée.

Cas de test

Cas de test 1:

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

How do you want to move?
d

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

Cas de test 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  #
####

Bien sûr, ceux-ci ne sont pas complets. Votre code devrait boucler pour toujours et effacer l'écran entre chaque sortie .

Votre sortie est autorisée à demander une entrée en tant que How do you want to move?\n<input>ou How do you want to move?<input>(c'est-à-dire que vous n'avez pas besoin de l'entrée sur une ligne vierge), et vous n'avez pas besoin d'une ligne vide entre la dernière ligne du donjon et l'invite. (ils ne peuvent cependant pas être sur la même ligne)

Les failles standard sont interdites! C'est le code-golf, donc le code le plus court en octets gagne!

LMD
la source
2
Est-il acceptable si l'entrée est une lettre suivie d'une entrée? Aussi, je suggère de se débarrasser d'avoir à imprimer cette chaîne, ce qui ne semble rien ajouter au défi
Luis Mendo
2
Je pense que c'est re-être ouvert, mais ma suggestion est que l'invite d' entrée (pour l, r, uou d) peut être quelque chose, non seulement « Comment voulez-vous déplacer »? Cela n'affecte pas vraiment les réponses, sauf pour le golf.
Rɪᴋᴇʀ
@EasterlyIrk: Je ne serais pas d'accord. Parce que dans ce cas, les golfeurs devront réfléchir à la façon de compresser la chaîne pour économiser des octets.
LMD
2
@ user7185318 Gardez cela à l'esprit , restez fondamentalement avec 1 problème par défi. La compression de la chaîne est un problème complètement distinct, puis la création d'un robot de donjon, et ne devrait donc probablement pas être abordée à ce défi.
Rɪᴋᴇʀ
1
Est-il acceptable que le joueur s'affiche lorsqu'il est hors limites ou doit-il disparaître?
mwh

Réponses:

1

MATLAB, 268 247 246 octets

Probablement pas compétitif, mais c'était amusant. Version golfée:

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

Version lisible:

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

Les tryblocs sont destinés à empêcher la fonction de planter en cas d'erreur hors limites. Je suis sûr que deux d'entre eux sont exagérés, mais je ne peux pas faire mieux que ça.

Il convient de noter que MATLAB étendra le tableau vers le bas et vers la droite, mais le joueur disparaîtra lors de son premier déplacement vers une zone `` inexplorée ''. Par exemple, si vous vous déplacez en dehors des limites actuelles du donjon vers la droite d'un espace, vous disparaissez, mais au tour suivant MATLAB étendra le tableau pour inclure la nouvelle colonne (ou la ligne, si vous vous déplacez vers le bas). '#'==d(y,x)enregistre un octet par rapport à d(y,x)=='#', car vous n'avez pas besoin d'espace entre ifet'#'

mwh
la source
Bonne réponse ! J'espère que cette fois ce n'est pas quelque chose de très court qui l'emporte, ici les langues communes devraient avoir une chance aussi, parce que plus le défi est grand, mieux c'est Java etc. :)
LMD
1

Café-script: 580 octets

J'ai retiré tout ce que je pouvais de cet algorithme particulier et de mon cerveau fatigué. J'ai besoin de vacances.

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'
Lord Ratte
la source
belle solution, Lord Ratte
LMD