2D Dungeon Crawler

9

Program Anda harus mengambil string multi-baris, seperti ini:

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

padalah pemain dan #merupakan blok.

Sekarang di bawah itu di terminal harus menjadi garis input yang mengatakan:

How do you want to move?

Jika pemain mengetik ldia harus berjalan meninggalkan ketika tidak ada blok, lain, ketika ada blok, dia tidak bisa melewati dan tidak bergerak tentu saja, sekarang output di terminal harus diperbarui ( dan output sebelumnya dihapus / ditimpa):

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

Ia dapat mengetik luntuk kiri, rkanan, uatas dan dbawah.

Input akan selalu multiline, tetapi tidak akan selalu diisi dengan spasi menjadi persegi panjang yang sempurna. Selain itu, hash dapat berada di mana saja di string, dan tidak akan selalu terhubung satu sama lain. Sebagai contoh:

##  ##
#  #
## p
     #

adalah penjara yang valid. (perhatikan kurangnya spasi tambahan pada setiap baris)

Jika pemain keluar dari string, dia tidak harus ditampilkan. Tetapi jika dia kembali lagi nanti, dia harus ditampilkan lagi.

Dan batas-batas "di luar" string adalah length(longest_line)dengan number_of_linespersegi panjang, jadi bahkan jika satu baris tidak diisi dengan spasi di sebelah kanan, lokasi itu tidak dianggap di luar batas. Contoh menggunakan penjara bawah tanah sebelumnya:

##  ##
#  #p
##  
     #

Baris kedua tidak memiliki ruang di mana p sekarang, tetapi itu tidak masalah.

Akhirnya, program Anda harus mengulang selamanya mengambil input.

Uji kasus

Uji kasus 1:

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

How do you want to move?
d

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

Uji kasus 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  #
####

Tentu saja, ini tidak lengkap. Kode Anda harus berulang selamanya dan menghapus layar antara setiap output .

Output Anda diperbolehkan untuk meminta input sebagai How do you want to move?\n<input>atau How do you want to move?<input>(yaitu Anda tidak perlu input pada baris kosong), dan Anda tidak perlu baris kosong antara baris terakhir dari ruang bawah tanah dan prompt. (Namun mereka tidak bisa berada di jalur yang sama)

Celah standar tidak diizinkan! Ini adalah kode-golf, jadi kode terpendek dalam byte menang!

LMD
sumber
2
Apakah bisa diterima jika inputnya berupa huruf diikuti dengan enter? Juga, saya sarankan untuk tidak mencetak string itu, yang sepertinya tidak menambah tantangan
Luis Mendo
2
Saya rasa ini adalah re-yg dpt dibuka, tapi saran saya adalah bahwa input prompt (untuk l, r, u, atau d) bisa apa saja, bukan hanya "Bagaimana Anda ingin pindah"? Itu tidak benar-benar mempengaruhi jawaban kecuali untuk golfyness.
Rɪᴋᴇʀ
@EasterlyIrk: Saya tidak akan setuju. Karena dalam kasus ini, pegolf harus memikirkan cara mengompres string untuk menghemat byte.
LMD
2
@ user7185318 Ingatlah ini , pada dasarnya tetap dengan 1 masalah per tantangan. Mengompresi string adalah masalah yang benar-benar terpisah kemudian membuat crawler penjara bawah tanah, dan dengan demikian mungkin tidak boleh ditempelkan pada tantangan itu.
Rɪᴋᴇʀ
1
Apakah dapat diterima jika pemain ditampilkan ketika mereka di luar batas, atau apakah mereka harus menghilang?
mwh

Jawaban:

1

MATLAB, 268 247 246 byte

Mungkin tidak kompetitif, tapi itu menyenangkan. Versi 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 yang dapat dibaca:

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

The tryblok untuk mencegah fungsi dari menerjang di luar kesalahan batas. Saya yakin mereka berdua berlebihan, tetapi saya tidak bisa menurunkannya lebih baik dari itu.

Perlu dicatat bahwa MATLAB akan memperluas array ke bawah dan ke kanan, tetapi pemain akan menghilang ketika pindah ke area 'yang belum dijelajahi' untuk pertama kalinya. Misalnya, jika Anda bergerak di luar batas saat ini ruang bawah tanah ke kanan dengan satu ruang, Anda akan menghilang, tetapi giliran berikutnya MATLAB akan memperluas array untuk memasukkan kolom baru (atau baris, jika Anda bergerak ke bawah). '#'==d(y,x)menghemat satu byte dibandingkan dengan d(y,x)=='#', karena Anda tidak memerlukan ruang antara ifdan'#'

mwh
sumber
Jawaban bagus ! Saya harap kali ini bukan sesuatu yang sangat singkat menang, di sini bahasa umum harus memiliki kesempatan juga, karena semakin besar tantangan, semakin baik java dll :)
LMD
1

Kopi-skrip: 580 Bytes

Saya telah memeras semua yang saya bisa dari algoritma khusus ini dan otak saya yang lelah. Saya butuh liburan.

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'
Tuan Ratte
sumber
solusi yang bagus, Lord Ratte
LMD