2Dダンジョンクローラー


9

プログラムは、次のように複数行の文字列を取る必要があります。

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

pプレイヤーで#あり、ブロックです。

ターミナルの下には、次のような入力行があります。

How do you want to move?

プレーヤーlがブロックがないときに左に歩く必要があると入力した場合、それ以外の場合、ブロックがあるときは通過できず、もちろん移動しません。ターミナルの出力を更新する必要があります(および以前の出力がクリア/上書きされました):

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

彼はl左、r右、u上、d下のどちらでも入力できます。

入力は常に複数行になりますが、完全な長方形にスペースが埋め込まれるとは限りません。さらに、ハッシュは文字列のどこにでも置くことができ、常に互いに接続されているわけではありません。例えば:

##  ##
#  #
## p
     #

有効なダンジョンです。(各行の末尾にスペースがないことに注意してください)

プレイヤーがストリングの外に出た場合、彼は表示される必要はありません。しかし、彼が後で戻ってきた場合、彼は再び表示される必要があります。

そして、「外」の境界文字列がされているlength(longest_line)ことにより、number_of_lines1行が右側のスペースで埋めていない場合でも、長方形、そう、その場所は、範囲外とみなされていません。以前のダンジョンを使用した例:

##  ##
#  #p
##  
     #

2行目には、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>(つまり、空白行に入力する必要はありません)。また、ダンジョンの最後の行とプロンプトの間の空行は必要ありません。(ただし、同じ行に入れることはできません)

標準の抜け穴は禁止されています!これはコードゴルフなので、バイト単位の最短コードが優先されます!


2
入力が文字の後にEnterが続く場合は許容されますか?また、その文字列を印刷する必要をなくすことをお勧めします。これは課題に何も追加しないようです
Luis Mendo

2
私は、これは再開放可能だと思うが、私の提案は(のためのプロンプト入力ということですlru、またはにd)「移動したいどうすればよい」だけではなく、何もすることができますか?ゴルファー以外の答えにはあまり影響しません。
Rɪᴋᴇʀ

@EasterlyIrk:同意しない。この場合、ゴルファーは文字列を圧縮してバイトを節約する方法を考える必要があるためです。
LMD 2016

2
@ user7185318 これを念頭に置いて、基本的にチャレンジごとに1つの問題に固執してください。文字列を圧縮することは、ダンジョンクローラーを作成することとは完全に別の問題であるため、おそらくその課題に取り組む必要はありません。
Rɪᴋᴇʀ

1
プレーヤーが範囲外にいるときに表示される場合、またはそれらを非表示にする必要がありますか?
MattWH 2016

回答:


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ブロックは、境界エラーのうちにクラッシュからの機能を防ぐためです。2つはやりすぎだと思いますが、それ以上のゴルフはできません。

注目に値するのは、MATLABが配列を下方向および右方向に拡張することですが、プレーヤーが初めて「未調査」領域に移動すると、プレーヤーは表示されなくなります。たとえば、ダンジョンの現在の境界の外側に1スペース右に移動すると、表示は消えますが、MATLABは次に配列を拡張して、新しい列(または下に移動している場合は行)を含めます。との間にスペースが必要ない'#'==d(y,x)ためd(y,x)=='#'、と比較して1バイトが節約されます。if'#'


素敵な答え !今回は非常に短い勝利ではないことを願っています。ここで一般的な言語にもチャンスがあるはずです。より大きな挑戦、より良いJavaなどです。:)
LMD

1

Coffee-script: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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.