2D Dungeon Crawler

9

Ваша программа должна принимать многострочную строку, например так:

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

pявляется игроком и #является блоком.

Теперь под этим в терминале должна быть строка ввода, гласящая:

How do you want to move?

Если игрок печатает, lон должен идти влево, когда нет блока, иначе, когда есть блок, он не может пройти и, конечно, не двигается, теперь выход в терминале должен быть обновлен ( и предыдущий вывод очищен / перезаписан):

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

Он может печатать lслева, rсправа, uвверх и dвниз.

Ввод всегда будет многострочным, но не всегда будет дополняться пробелами в идеальный прямоугольник. Кроме того, хэши могут находиться в любом месте строки и не всегда будут связаны друг с другом. Например:

##  ##
#  #
## p
     #

это действительное подземелье. (обратите внимание на отсутствие пробелов в каждой строке)

Если игрок выходит за пределы строки, он не должен отображаться. Но если он вернется позже, он должен появиться снова.

И границы «за пределами» строки являются length(longest_line)по number_of_linesпрямоугольнику, так что даже если одна строка не дополняется пробелами справа, что место не рассматривается вне границ. Пример использования более ранней темницы:

##  ##
#  #p
##  
     #

Во второй строке не было пробела, где сейчас p, но это не имеет значения.

Наконец, ваша программа должна зацикливаться на вечность, принимая ввод.

Контрольные примеры

Тестовый пример 1:

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

How do you want to move?
d

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

Контрольный пример 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  #
####

Конечно, они не завершены. Ваш код должен зацикливаться вечно и очищать экран между каждым выходом .

Ваш вывод может запрашивать ввод как How do you want to move?\n<input>или How do you want to move?<input>(т.е. вам не нужно вводить пустую строку), и вам не нужна пустая строка между последней строкой подземелья и подсказкой. (однако они не могут быть на одной линии)

Стандартные лазейки запрещены! Это код-гольф, поэтому выигрывает самый короткий код в байтах!

LMD
источник
2
Приемлемо ли, если ввод представляет собой букву, за которой следует ввод? Кроме того, я предлагаю избавиться от необходимости печатать эту строку, которая, кажется, ничего не добавляет к проблеме
Луис Мендо
2
Я думаю , что это вновь открываемые, но мое предложение заключается в том , что входная строке (для l, r, u, или d) может быть что угодно, а не только «Как вы хотите переместить»? Это на самом деле не влияет на ответы, кроме гольфистости.
Rɪᴋᴇʀ
@EasterlyIrk: я бы не согласился. Потому что в этом случае игрокам в гольф придется подумать о том, как сжать струну, чтобы сохранить байты.
LMD
2
@ user7185318 Имейте это в виду , в основном придерживайтесь 1 проблемы за вызов. Сжатие строки - это совершенно отдельная проблема, а затем создание обходчика подземелий, и поэтому, вероятно, не стоит связываться с этим вызовом.
Rɪᴋᴇʀ
1
Приемлемо ли, если игрок отображается, когда он выходит за границы, или он должен исчезнуть?
МВтч

Ответы:

1

MATLAB, 268 247 246 байт

Наверное, неконкурентоспособен, но это было весело. Гольф версия:

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

Читаемая версия:

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

Эти tryблоки , чтобы предотвратить функцию от аварии на вне границ ошибок. Я уверен, что двое из них излишни, но я не могу сыграть вничью лучше, чем это.

Стоит отметить, что MATLAB расширит массив вниз и вправо, но игрок исчезнет при переходе в «неизведанную» область в первый раз. Например, если вы переместитесь за пределы текущих границ подземелья на одну позицию справа, вы исчезнете, но в следующий ход MATLAB расширит массив, включив в него новый столбец (или строку, если вы двигаетесь вниз). '#'==d(y,x)сохраняет байт по сравнению с d(y,x)=='#', так как вам не нужно пространство между ifи'#'

МВтч
источник
Хороший ответ ! Надеюсь, на этот раз победа будет не очень короткой, и здесь у обычных языков тоже должен быть шанс, потому что чем сложнее вызов, тем лучше java и т. Д. :)
LMD
1

Coffee-скрипт: 580 байт

Я выжал все, что мог из этого конкретного алгоритма и моего усталого мозга. Мне нужен выходной.

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'
Лорд ратт
источник
хорошее решение, лорд Ратт
LMD