โปรแกรมรวบรวมข้อมูล 2D Dungeon


9

โปรแกรมของคุณต้องใช้สตริงที่มีหลายแถวเช่นนี้

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

pเป็นผู้เล่นและ#เป็นบล็อก

ตอนนี้ภายใต้ที่ใน terminal ควรเป็นสายอินพุตพูดว่า:

How do you want to move?

หากผู้เล่นประเภทที่lเขาต้องเดินออกไปเมื่อไม่มีบล็อกอื่น ๆ เมื่อมีบล็อกเขาไม่สามารถผ่านและไม่ย้ายแน่นอนตอนนี้เอาท์พุทใน terminal จะต้องมีการปรับปรุง ( และเอาต์พุตก่อนหน้าจะถูกล้าง / เขียนทับ):

#############
#           #
#    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ɪᴋᴇʀ

@ElylyIrk: ฉันไม่เห็นด้วย เพราะในกรณีนี้นักกอล์ฟจะต้องคิดเกี่ยวกับวิธีการบีบอัดสตริงเพื่อบันทึกไบต์
LMD

2
@ user7185318 โปรดจำไว้ว่าโดยทั่วไปติดกับ 1 ปัญหาต่อการท้าทาย การบีบอัดสตริงนั้นเป็นปัญหาที่แยกจากกันอย่างสิ้นเชิงจากนั้นสร้างโปรแกรมรวบรวมข้อมูลดันเจี้ยนและดังนั้นจึงไม่ควรที่จะจัดการกับความท้าทายนั้น
Rɪᴋᴇʀ

1
เป็นที่ยอมรับหรือไม่หากผู้เล่นแสดงเมื่อพวกเขาอยู่นอกขอบเขตหรือพวกเขาจำเป็นต้องหายไป?
mwh

คำตอบ:


1

MATLAB, 268 247 246 ไบต์

อาจไม่สามารถแข่งขันได้ แต่มันสนุก รุ่น Golfed:

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บล็อกที่มีฟังก์ชั่นเพื่อป้องกันจากการกระแทกบนออกจากข้อผิดพลาดในขอบเขต ฉันแน่ใจว่าพวกเขาสองคนนั้น overkill แต่ฉันไม่สามารถตีมันลงได้ดีกว่านี้อีก

เป็นที่น่าสังเกตว่า MATLAB จะขยายอาร์เรย์ลงและไปทางขวา แต่ผู้เล่นจะหายไปเมื่อย้ายไปยังพื้นที่ 'ไม่สำรวจ' เป็นครั้งแรก ตัวอย่างเช่นหากคุณย้ายออกนอกขอบเขตปัจจุบันของดันเจี้ยนไปทางขวาหนึ่งช่องว่างคุณจะหายไป แต่การเปิด MATLAB ครั้งต่อไปจะขยายอาร์เรย์เพื่อรวมคอลัมน์ใหม่ (หรือแถวหากคุณกำลังเลื่อนลง) '#'==d(y,x)บันทึกไบต์เปรียบเทียบกับd(y,x)=='#'เนื่องจากคุณไม่ต้องการช่องว่างระหว่างifและ'#'


คำตอบที่ดี! ฉันหวังว่าเวลานี้ไม่ใช่สิ่งที่ชนะสั้นมากที่นี่ภาษาทั่วไปควรจะมีโอกาสมากเกินไปเพราะความท้าทายที่ใหญ่กว่าดีกว่าเป็น Java ฯลฯ :)
LMD

1

Coffee-script: 580 Bytes

ฉันบีบทุกอย่างที่ทำได้จากอัลกอริทึมนี้และสมองที่เหนื่อยล้าของฉัน ฉันต้องการวันหยุด

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.