Xây dựng một Roguelike đơn giản


8

Thử thách này dựa trên một đề xuất trên nhóm usenet rec.games.roguelike.development vài năm trước. Tôi không thể tìm thấy bài đăng nhóm tin tức ban đầu, nhưng bạn có thể xem qua các giải pháp Github . Nó chỉ được chơi bằng một vài ngôn ngữ và tôi muốn thấy nhiều hơn nữa!

Mục tiêu

Mục đích là để xây dựng một chương trình trình bày góc nhìn từ trên xuống của ngục tối bằng các ký tự ascii. Sẽ có một @dấu hiệu đại diện cho người chơi có thể được di chuyển qua không gian trống trong ngục tối (đại diện bởi ), mặc dù nó không thể đi qua các bức tường (đại diện bởi #).

Bản đồ của ngục tối phải như thế này:

####  ####
#  #  #  #
#  ####  #
#        #
##      ##
 #      #
 #      #
##      ##
#        #
#  ####  #
#  #  #  #
####  ####

Người chơi phải bắt đầu tại vị trí {2,2}, trong đó {0,0} là góc trên cùng bên trái.

Giao diện

Người dùng cần có khả năng di chuyển máy nghe nhạc theo bốn hướng chính bằng cách sử dụng các phím mũi tên trên bàn phím.

Cần phải có một số cách để người dùng thoát khỏi chương trình. Nó không cần phải là một lối thoát duyên dáng (ví dụ, không có vấn đề gì nếu một ngoại lệ được in).

Bản đồ và người chơi cần được vẽ trước khi thực hiện bất kỳ đầu vào nào và người chơi cần được cập nhật sau mỗi lần nhập.

Thư viện

Vui lòng sử dụng các thư viện đã thiết lập cho đầu vào hoặc đầu ra của bàn điều khiển, chẳng hạn như Curses. Chỉ cần đề cập trong câu trả lời của bạn những gì bạn đang sử dụng.

Chấm điểm

Đây là mã golf, mã ngắn nhất thắng!


Khá gần với một bản sao của Build a engine cho một trò chơi mê cung mà chắc chắn có thể sử dụng một số mục bổ sung. Suy nghĩ?
dmckee --- ex-moderator mèo con

@dmckee Nó chắc chắn khá giống nhau. Tôi hy vọng cơ chế nhập liệu đơn giản hơn và thách thức mã hóa hiệu quả bản đồ đặt trước sẽ làm cho nó đủ khác biệt.
Paul Prestidge

Tôi chắc chắn sẽ mua bit bản đồ được mã hóa cứng. Bây giờ hãy để tôi suy nghĩ về cách tôi có thể điều chỉnh giải pháp trước đây của mình ...
dmckee --- ex-moderator mèo con

2
Tôi chỉ không thể giúp đỡ, nhưng đề cập đến những trò chơi mà giới thiệu tôi với C: nethack.org
SeanC

Câu trả lời:


6

C, 256 253 222 220

Sử dụng system("cls")thay vì những lời nguyền (sử dụng system("clear")cho các hệ thống Linux) và một thuật toán thông minh để điều chỉnh bản đồ thành một số có 8 chữ số. Các phím không mở rộng kết thúc chương trình, ví dụ thoát.

EDIT: Bây giờ cũng hiển thị anh hùng của bạn bên dưới bản đồ bằng cách sử dụng a<230thay vì a<132:

    ##
   ####
 ###  ###
 # #  # #
## #  # ##
   ####
  #    #
 ##    ##

Mã số:

a,p=14,w=11,X,Y;m(I){X=I%w-1,Y=I/w;return 70313263>>(Y>5?w-Y:Y)*5+(X>4?9-X:X)&1;}main(){do{system("cls");a=a&4?1:a&2?-1:a&8?-w:w;p+=!m(p+a)*a;for(a=0;++a<230;)putch(a%w?a-p?m(a)*35:64:10);}while(a=getch()>>7?getch():0);}

Điều này không biên dịch cho tôi.
Matt

Biên dịch và hoạt động cho tôi bằng Visual Studio 2008
Sir_Lagsalot

@Matt: Hừm .. Tôi đã thử thành công cả MinGW (gcc 4.6.1) và MSVC (VS 2009) trong Windows cho đến nay. Thông báo lỗi là gì?
schnaader

@schnaader trong gcc 4.4.5 Tôi nhận được: test.c :(. text + 0x1a1): tham chiếu không xác định cho `putch '. Tôi nhận được cùng một lỗi cho getch
Matt

Đối với putch, có những putcharthứ tương tự, nhưng tôi không biết cách thay thế getch- cũng có getchar, nhưng nó không hoạt động với tôi - dường như nó không nhận ra các phím con trỏ.
schnaader

4

Ruby 1.9 + Lời nguyền (248)

require'curses';include Curses;noecho;curs_set 0
b=0xf3e499e601c0d0240b0380679927cf.to_s(2).tr'01',' #'
s=init_screen<<b.scan(/.{10}/)*$/;s.keypad 1
p=22;d=->t=?@{setpos p/10,p%10;addch t;6};d[]
loop{p=b[v=p+[10,-10,-1,1][getch%d[32]]]<?#?v:p;d[]}

1
Điều đó sử dụng một bản đồ khác với bản đồ được chỉ định. Tôi khuyên bạn nên sử dụng 0xf3e499e601c0d0240b0380679927cf thay thế.
Matt

@Matt bắt tốt, cảm ơn!
Paul Prestidge

3

Python 332 319 317

from curses import*
M=0xf3e499e601c0d0240b0380679927cf;S=initscr();S.keypad(1);x,y=2,2;A=S.addstr;[A(a,b,[' ','#'][M>>(10*a+b)&1])for a in range(12)for b in range(10)]
while 1:A(y,x,'@');k=S.getch();A(y,x,' ');X=[[x,x-1],[x+1,1]][k==261][k==260];Y=[[y,y-1],[y+1,y+1]][k==258][k==259];x,y=[(X,Y),(x,y)][M>>(10*Y+X)&1]

Thư viện nguyền rủa python chỉ được hỗ trợ chính thức trên linux. Có những cái không chính thức có sẵn cho windows, nhưng tôi không thể đảm bảo rằng cái này sẽ hoạt động với nó.

Để lưu một vài ký tự, tôi đã mã hóa mã khóa cho lên, xuống, trái và phải. Điều này có thể gây ra vấn đề cho một số người. Nếu điều này không hiệu quả với bất cứ ai, tôi có thể đăng một phiên bản nên.

Sử dụng ctrl + c để thoát. Bạn có thể sẽ phải thiết lập lại thiết bị đầu cuối của mình sau khi thoát, nhưng thách thức nói cụ thể là lối ra không cần phải duyên dáng.


1

QBasic, 314 313 byte

Loại vấn đề này chỉ đơn giản là cầu xin một giải pháp QBasic.

DIM w(12,10)
FOR r=1TO 12
READ d
FOR c=1TO 10
w(r,c)=(d*2AND 2^c)>0
?CHR$(35+3*w(r,c));
NEXT
?
NEXT
i=3
j=3
1LOCATE i,j
?"@"
a$=""
9a$=INKEY$
IF""=a$GOTO 9
k=ASC(RIGHT$(a$,1))
x=i+(k=72)-(k=80)
y=j+(k=75)-(k=77)
LOCATE i,j
?" "
IF w(x,y)THEN i=x:j=y
IF k>9GOTO 1
DATA 48,438,390,510,252,765,765,252,510,390,438,48

Đây là QBasic được đánh gôn, sẽ được mở rộng đáng kể bởi bộ tự động định dạng. Nhưng, nếu bạn nhập mã chính xác này vào IDE và nhấn F5, nó sẽ chạy. Đã thử nghiệm trên QB64 .

Ảnh chụp màn hình

Giải trình:

Bản đồ được mã hóa theo hàng như các bit của số nguyên trong DATAcâu lệnh (1 cho không gian, 0 cho tường). FORVòng lặp lồng nhau giải nén chúng, lưu trữ các giá trị thật trong mảng 2D wvà in #hoặc theo đó. (Lưu ý rằng đúng trong QBasic là -1, do đó, tại sao chúng tôi thêm 35 thay vì trừ!) Người chơi bắt đầu ở 3,3 vì hầu hết mọi thứ đều được lập chỉ mục 1 trong QBasic.

Sau đó, chúng tôi nhập một GOTOvòng lặp: in @, nhận đầu vào bàn phím, chuyển đổi thành mã ký tự mở rộng và sửa đổi xydựa trên việc người dùng có nhấn L / U / R / D hay không. Nếu w(x,y)đúng, thì đó là một không gian và chúng ta có thể di chuyển đến đó; nếu không, ở lại đặt. Cuối cùng, cách ngắn nhất tôi tìm thấy để thoát là bằng cách bấm phím tab (ASCII 9). Bất kỳ vòng lặp đầu vào nào khác, chúng tôi sẽ sao lưu LOCATEcâu lệnh đầu tiên .

Tôi phải nói rằng, tôi khá nhột khi đánh bại Python bằng câu trả lời QBasic.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.