Bangun Roguelike Sederhana

8

Tantangan ini didasarkan pada salah satu yang diusulkan pada grup usenet, rec.games.roguelike.development beberapa tahun yang lalu. Saya tidak dapat menemukan posting newsgroup asli, tetapi Anda dapat melihat repo Github solusi . Itu hanya bermain golf dalam beberapa bahasa dan saya ingin melihat lebih banyak lagi!

Objektif

Tujuannya adalah untuk membangun program yang menyajikan tampilan bawah-atas dari ruang bawah tanah menggunakan karakter ascii. Akan ada @tanda yang mewakili pemain yang dapat dipindahkan melalui ruang bebas di ruang bawah tanah (diwakili oleh ), meskipun tidak dapat melewati dinding (diwakili oleh #).

Peta ruang bawah tanah harus terlihat seperti ini:

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

Pemain harus mulai di lokasi {2,2}, di mana {0,0} adalah sudut kiri atas.

Antarmuka

Pengguna harus dapat menggerakkan pemain di empat arah mata angin menggunakan tombol panah pada keyboard.

Perlu ada beberapa cara bagi pengguna untuk keluar dari program. Tidak perlu keluar dengan anggun (misalnya, tidak masalah jika pengecualian dicetak).

Peta dan pemain harus ditarik sebelum input diambil, dan pemain perlu diperbarui setelah setiap input.

Perpustakaan

Jangan ragu menggunakan pustaka yang mapan untuk input atau output konsol, seperti Kutukan. Sebutkan saja dalam jawaban Anda apa yang Anda gunakan.

Mencetak gol

Ini golf kode, kode terpendek menang!

Paul Prestidge
sumber
Cukup dekat dengan duplikat Bangun mesin untuk permainan labirin yang tentu saja bisa menggunakan beberapa entri tambahan. Pikiran?
dmckee --- ex-moderator kitten
@ Dmckee Ini pasti sangat mirip. Saya harap mekanisme input yang lebih sederhana dan tantangan hardcoding efisien peta preset akan membuatnya cukup berbeda.
Paul Prestidge
Saya pasti akan membeli bit peta hardcoded. Sekarang biarkan saya berpikir tentang bagaimana saya bisa mengadaptasi solusi saya sebelumnya ...
dmckee --- ex-moderator kitten
2
Saya hanya bisa menyebutkan permainan yang memperkenalkan saya ke C: nethack.org
SeanC

Jawaban:

6

C, 257 253 222 220

Gunakan system("cls")alih-alih kutukan (gunakan system("clear")untuk sistem Linux) dan algoritme pintar untuk menyesuaikan peta menjadi angka 8 digit. Kunci yang tidak diperpanjang mengakhiri program, misalnya melarikan diri.

EDIT: Sekarang juga tunjukkan pahlawan Anda di bawah peta dengan menggunakan a<230alih-alih a<132:

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

Kode:

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);}
schnaader
sumber
Ini tidak cocok untuk saya.
Matt
Mengkompilasi dan bekerja untuk saya menggunakan Visual Studio 2008.
Sir_Lagsalot
@ Matt: Hm .. Saya berhasil mencoba MinGW (gcc 4.6.1) dan MSVC (VS 2009) di Windows sejauh ini. Apa pesan kesalahannya?
schnaader
@ schnaader di gcc 4.4.5 Saya mendapatkan: test.c :(. teks + 0x1a1): referensi tidak ditentukan untuk `putch '. Saya mendapatkan kesalahan yang sama untuk getch
Matt
Sebab putch, ada putcharyang melakukan hal yang sama, tapi saya tidak tahu bagaimana cara mengganti getch- ada getcharjuga, tetapi tidak berfungsi untuk saya - sepertinya tidak mengenali kunci kursor.
schnaader
4

Ruby 1.9 + Curses (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[]}
Paul Prestidge
sumber
1
Itu menggunakan peta yang berbeda dari yang ditentukan. Saya sarankan menggunakan 0xf3e499e601c0d0240b0380679927cf sebagai gantinya.
Matt
@Matt tangkapan yang bagus, terima kasih!
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]

Pustaka kutukan python hanya didukung secara resmi di linux. Ada yang tidak resmi tersedia untuk windows, tetapi saya tidak dapat menjamin bahwa ini akan bekerja dengannya.

Untuk menyimpan beberapa karakter, saya membuat kode kunci kode ke atas, bawah, kiri, dan kanan. Ini dapat menyebabkan masalah bagi sebagian orang. Jika ini tidak berhasil untuk siapa pun, saya dapat memposting versi yang seharusnya.

Gunakan ctrl + c untuk keluar. Anda mungkin harus mengatur ulang terminal Anda setelah keluar, tetapi tantangannya secara khusus mengatakan bahwa pintu keluar tidak harus anggun.

Mat
sumber
1

QBasic, 314 313 byte

Masalah semacam ini hanya meminta solusi 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

Ini QBasic golf, yang akan diperluas secara signifikan oleh autoformatter. Tetapi, jika Anda mengetikkan kode persis ini ke dalam IDE dan menekan F5, itu harus dijalankan. Diuji pada QB64 .

Tangkapan layar

Penjelasan:

Peta dikodekan dengan baris-bijaksana sebagai bit dari bilangan bulat dalam DATApernyataan (1 untuk ruang, 0 untuk dinding). FORLoop bersarang membongkar mereka, menyimpan nilai kebenaran dalam array 2D w, dan mencetak #atau sesuai. (Perhatikan bahwa yang benar dalam QBasic adalah -1, jadi mengapa kita menambahkan ke 35 bukannya mengurangi!) Pemain mulai dari 3,3 karena sebagian besar hal 1-diindeks dalam QBasic.

Kami kemudian memasukkan GOTOloop: mencetak @, mendapatkan input keyboard, mengkonversi ke kode karakter yang diperluas, dan memodifikasi xdan yberdasarkan apakah pengguna menekan L / U / R / D. Jika w(x,y)benar, maka itu adalah ruang dan kita bisa pindah ke sana; jika tidak, tetap tinggal. Akhirnya, cara terpendek yang saya temukan untuk keluar adalah dengan menekan tombol tab (ASCII 9). Input lain apa pun akan membuat kami kembali ke LOCATEpernyataan pertama .

Saya harus mengatakan, saya agak geli telah mengalahkan Python dengan jawaban QBasic.

DLosc
sumber