シンプルなローグライクを構築する


8

この課題は、数年前にusenetグループrec.games.roguelike.developmentで提案されたものに基づいています。元のニュースグループの投稿は見つかりませんが、ソリューションのGithubリポジトリをご覧いただけます。それはいくつかの言語でしかゴルフされなかったので、もっと見たいです!

目的

目的は、アスキー文字を使用してダンジョンのトップダウンビューを表示するプログラムを構築することです。@ダンジョンのフリースペース(で表される)を移動できるプレイヤーを表す標識がありますが、壁(で表される#)を通過することはできません。

ダンジョンのマップは次のようになります。

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

プレーヤーは{2,2}の位置から開始する必要があります。{0,0}は左上隅です。

インターフェース

ユーザーは、キーボードの矢印キーを使用して、プレーヤーを4つの基本方向に移動できる必要があります。

ユーザーがプログラムを終了するための何らかの方法が必要です。正常に終了する必要はありません(たとえば、例外が出力されても問題ありません)。

マップとプレーヤーは、入力が行われる前に描画する必要があり、プレーヤーは入力ごとに更新する必要があります。

図書館

Cursesなどのコンソール入力または出力用の確立されたライブラリを自由に使用してください。あなたの答えであなたが何を使っているかを述べてください。

得点

これはコードゴルフで、最短のコードが勝ちます!


確かにいくつかの追加エントリを使用できる迷路ゲーム用Build engineの複製にかなり近い。考え?
dmckee ---元モデレーターの子猫2012

@dmckeeそれは間違いなくかなり似ています。よりシンプルな入力メカニズムと、プリセットマップを効率的にハードコーディングする課題が、十分に異なるものになることを願っています。
Paul Prestidge、2012

私は確かにハードコードされたマップビットを買うでしょう。ここで、以前のソリューションをどのように適応させるかについて考えさせてください...
dmckee ---元モデレーターの子猫2012

回答:


6

C、257 253 222 220

用途system("cls")代わりの呪い(使用system("clear")のLinuxシステム用)と巧妙なアルゴリズムは、8桁の数字にマップを合わせて。拡張されていないキーはプログラムを終了します(エスケープなど)。

編集:のa<230代わりにを使用して、マップの下にヒーローを表示しますa<132

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

コード:

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);}

これは私のためにコンパイルされません。
マット

Visual Studioの2008使用して私のためにコンパイルした作品
Sir_Lagsalot

@Matt:うーん..これまで、WindowsでMinGW(gcc 4.6.1)とMSVC(VS 2009)の両方を正常に試しました。エラーメッセージは何ですか?
シュナーダー2012

@schnaader in gcc 4.4.5取得:test.c :(。text + 0x1a1):未定義の「putch」への参照。getchでも同じエラーが発生します
Matt

のためにputchputchar同じことをするものがありますが、交換方法がわかりませんgetch-ありgetcharますが、私にとっては機能しません-カーソルキーを認識しないようです。
シュナーダー

4

Ruby 1.9 +呪い(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
指定されたものとは異なるマップを使用します。代わりに0xf3e499e601c0d0240b0380679927cfを使用することをお勧めします。
Matt

@マットグッドキャッチ、ありがとう!
Paul Prestidge 2012

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]

python cursesライブラリは、Linuxでのみ正式にサポートされています。Windowsで利用できる非公式のものもありますが、これが動作することを保証できません。

数文字を保存するために、上、下、左、右のキーコードをハードコードしました。これは一部の人に問題を引き起こす可能性があります。これが誰にとってもうまくいかない場合、私はそうすべきバージョンを投稿することができます。

ctrl + cを使用して終了します。おそらく、終了後に端末をリセットする必要がありますが、課題は、終了が優雅である必要がないことを明確に述べています。


1

QBasic、314 313バイト

この種の問題は、単に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

これはゴルフのQBasicで、オートフォーマッタによって大幅に拡張されます。しかし、この正確なコードをIDEに入力してF5を押すと、実行されるはずです。QB64でテスト済み。

スクリーンショット

説明:

マップは、DATAステートメント内の整数のビットとして行ごとにエンコードされます(スペースの場合は1、壁の場合は0)。ネストされたFORループはそれらをアンパックし、2D配列に真理値を格納し、それに応じてw印刷します。(QBasicのtrueはなので、減算ではなく35に加算するので注意してください!)ほとんどのものがQBasicで1インデックス化されているため、プレーヤーは3,3から始まります。#-1

我々は、次に、入力GOTO印刷:ループ@、キーボード入力を取得し、拡張文字コードに変換し、変更x及びyユーザがL / U / R / D押されたか否かに基づいています。場合はw(x,y)trueで、それは宇宙だと、私たちはそこに移動することができます。それ以外の場合は、そのままにしておきます。最後に、終了することがわかった最短の方法は、タブキー(ASCII 9)を押すことです。他の入力は、最初のLOCATEステートメントにループバックします。

私は言う必要があります、私はQBasicの答えでPythonを打ち負かしたのではなくむしろくすぐられています。

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