2D 던전 크롤러


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>(즉, 빈 줄에 입력이 필요하지 않음) 입력을 요구할 수 있으며 던전의 마지막 줄과 프롬프트 사이에 빈 줄이 필요하지 않습니다. (그러나 그들은 같은 줄에있을 수 없습니다)

표준 허점은 허용되지 않습니다! 이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


2
입력 값이 문자 다음에 enter이면 허용됩니까? 또한, 나는 그 문자열을 인쇄하지 말 것을 제안합니다. 도전에 아무 것도 추가하지 않는 것 같습니다
Luis Mendo

2
나는 그 메시지 입력 (이 재 개방이지만, 내 제안 생각 l, r, u, 또는 d) 아무것도 할 수있다,뿐만 아니라 "어떻게 이동하겠습니까?" 골을 제외하고는 실제로 답변에 영향을 미치지 않습니다.
Rɪᴋᴇʀ

@EasterlyIrk : 동의하지 않습니다. 이 경우 골퍼는 바이트를 절약하기 위해 문자열을 압축하는 방법을 고려해야합니다.
LMD

2
@ user7185318 이것을 명심 하고 기본적으로 도전 당 1 개의 문제를 고수 하십시오 . 문자열을 압축하는 것은 완전히 별개의 문제이며 던전 크롤러를 만드는 것이므로 해당 도전에 직면해서는 안됩니다.
Rɪᴋᴇʀ

1
플레이어가 경계를 벗어 났을 때 표시되거나 사라져야합니까?
mwh

답변:


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'#'


좋은 대답! 나는 :) 더 큰 도전 때문에, 더 나은 자바 등이 있으며, 공통의 언어가 너무 기회를해야하지 뭔가 여기 매우 짧은 승리, 이번에 희망
LMD

1

커피 스크립트 : 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'

좋은 해결책, Lord Ratte
LMD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.