2D Dungeon Crawler

9

Twój program musi wziąć ciąg z wieloma liniami, taki jak ten:

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

pjest graczem i #jest blokiem.

Teraz pod terminalem powinien znajdować się wiersz wejściowy z napisem:

How do you want to move?

Jeśli typ gracza lmusi iść w lewo, gdy nie ma bloku, inaczej, gdy jest blok, nie może przejść i oczywiście się nie porusza, teraz wyjście w terminalu musi zostać zaktualizowane ( a poprzednie dane wyjściowe zostały wyczyszczone / zastąpione):

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

Może pisać lw lewo, rw prawo, uw górę i dw dół.

Dane wejściowe zawsze będą wielowierszowe, ale nie zawsze będą wypełnione spacjami w idealny prostokąt. Ponadto skróty mogą znajdować się w dowolnym miejscu ciągu i nie zawsze będą ze sobą połączone. Na przykład:

##  ##
#  #
## p
     #

jest ważnym lochiem. (zwróć uwagę na brak spacji końcowych w każdej linii)

Jeśli gracz wyjdzie poza ciąg, nie musi być wyświetlany. Ale jeśli wróci później, musi zostać ponownie wyświetlony.

I granice „na zewnątrz” struny są length(longest_line)przez number_of_linesprostokąta, więc nawet jeśli jedna linia nie jest spacjami z prawej strony, że lokalizacja nie jest uznawany poza granicami. Przykład użycia wcześniejszego lochu:

##  ##
#  #p
##  
     #

Druga linia nie miała spacji, w której znajduje się teraz p, ale to nie ma znaczenia.

Wreszcie twój program musi zapętlać się na zawsze, przyjmując dane wejściowe.

Przypadki testowe

Przypadek testowy 1:

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

How do you want to move?
d

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

Przypadek testowy 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  #
####

Oczywiście nie są one kompletne. Twój kod powinien zapętlać się w nieskończoność i czyścić ekran między każdym wyjściem .

Twój wynik może pytać o dane wejściowe jako How do you want to move?\n<input>lub How do you want to move?<input>(tj. Nie potrzebujesz danych wejściowych w pustej linii) i nie potrzebujesz pustej linii między ostatnią linią lochu a pytaniem. (nie mogą być na tej samej linii)

Standardowe luki są niedozwolone! To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!

LMD
źródło
2
Czy jest akceptowalne, jeśli wprowadzeniem jest litera, po której następuje Enter? Sugeruję również, aby pozbyć się konieczności drukowania tego ciągu, co wydaje się nie dodawać niczego do wyzwania
Luis Mendo,
2
Myślę, że to ponownie otwierane, ale moja propozycja jest taka, że wejście szybka (do l, r, u, lub d) może być cokolwiek, a nie tylko „Jak chcesz przenieść”? To naprawdę nie wpływa na odpowiedzi, z wyjątkiem golfisty.
Rɪᴋᴇʀ
@EasterlyIrk: Nie zgodziłbym się. Ponieważ w tym przypadku golfiści będą musieli pomyśleć o tym, jak skompresować ciąg, aby zaoszczędzić bajty.
LMD,
2
@ user7185318 Pamiętaj o tym , po prostu trzymaj się 1 problemu na wyzwanie. Kompresowanie sznurka jest zupełnie innym problemem niż tworzenie robota w lochach, dlatego prawdopodobnie nie powinno się go podejmować.
Rɪᴋᴇʀ
1
Czy jest dopuszczalne, jeśli gracz jest wyświetlany, gdy znajduje się poza boiskiem, czy też musi zniknąć?
mwh

Odpowiedzi:

1

MATLAB, 268 247 246 bajtów

Prawdopodobnie nie konkurencyjny, ale było fajnie. Wersja golfowa:

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

Wersja do odczytu:

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

Te trybloki są, aby zapobiec funkcję z upaść na poza granicami błędów. Jestem pewien, że dwa z nich to przesada, ale nie mogę pograć w golfa lepiej.

Warto zauważyć, że MATLAB rozszerzy tablicę w dół i w prawo, ale gracz zniknie, gdy po raz pierwszy przejdzie do „niezbadanego” obszaru. Na przykład, jeśli przejdziesz poza bieżące granice lochu w prawo o jedną spację, znikniesz, ale w następnej turze MATLAB rozszerzy tablicę o nową kolumnę (lub rząd, jeśli poruszasz się w dół). '#'==d(y,x)oszczędza bajt w porównaniu do d(y,x)=='#', ponieważ nie potrzebujesz spacji między ifi'#'

mwh
źródło
Niezła odpowiedź ! Mam nadzieję, że tym razem nie wygra coś bardzo krótkiego, tutaj wspólne języki również powinny mieć szansę, ponieważ im większe wyzwanie, tym lepsza jest Java itp. :)
LMD
1

Skrypt kawy: 580 bajtów

Wycisnąłem wszystko, co mogłem, z tego konkretnego algorytmu i mojego zmęczonego mózgu. Potrzebuję wakacji.

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
źródło
fajne rozwiązanie, Lord Ratte
LMD