Baue ein einfaches Roguelike

8

Diese Herausforderung basiert auf einem Vorschlag, der vor einigen Jahren von der Usenet-Gruppe rec.games.roguelike.development vorgeschlagen wurde. Ich kann den ursprünglichen Newsgroup-Beitrag nicht finden, aber Sie können sich das Github-Repo der Lösungen ansehen . Es wurde nur in ein paar Sprachen gespielt und ich würde gerne noch mehr sehen!

Zielsetzung

Ziel ist es, ein Programm zu erstellen, das eine Draufsicht auf einen Dungeon mit ASCII-Zeichen zeigt. Es wird ein @Schild geben, das den Spieler darstellt, der durch den freien Raum im Dungeon bewegt werden kann (dargestellt durch ), obwohl er nicht durch die Wände gehen kann (dargestellt durch #).

Die Karte des Dungeons muss folgendermaßen aussehen:

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

Der Spieler muss an Position {2,2} beginnen, wobei {0,0} die obere linke Ecke ist.

Schnittstelle

Der Benutzer muss in der Lage sein, den Player mithilfe der Pfeiltasten auf der Tastatur in die vier Hauptrichtungen zu bewegen.

Es muss eine Möglichkeit für den Benutzer geben, das Programm zu beenden. Es muss kein eleganter Exit sein (zum Beispiel spielt es keine Rolle, ob eine Ausnahme gedruckt wird).

Die Karte und der Spieler müssen gezeichnet werden, bevor Eingaben vorgenommen wurden, und der Spieler muss nach jeder Eingabe aktualisiert werden.

Bibliotheken

Sie können auch etablierte Bibliotheken für die Eingabe oder Ausgabe von Konsolen verwenden, z. B. Curses. Erwähnen Sie in Ihrer Antwort einfach, was Sie verwenden.

Wertung

Dies ist Code Golf, kürzester Code gewinnt!

Paul Prestidge
quelle
Ziemlich nah an einem Duplikat von Build a Engine für ein Labyrinthspiel, das sicherlich einige zusätzliche Einträge verwenden könnte. Gedanken?
dmckee --- Ex-Moderator Kätzchen
@dmckee Es ist definitiv ziemlich ähnlich. Ich hoffe, dass der einfachere Eingabemechanismus und die Herausforderung, die voreingestellte Karte effizient fest zu codieren, sie ausreichend anders machen.
Paul Prestidge
Ich werde auf jeden Fall das fest codierte Kartenbit kaufen. Lassen Sie mich jetzt nur darüber nachdenken, wie ich meine vorherige Lösung anpassen könnte ...
dmckee --- Ex-Moderator Kätzchen
2
Ich kann einfach nicht anders, als das Spiel zu erwähnen, das mich mit C: nethack.org
SeanC

Antworten:

6

C 257 253 222 220

Verwendet system("cls")anstelle von Flüchen (Verwendung system("clear")für Linux-Systeme) und einen cleveren Algorithmus, um die Karte in eine 8-stellige Zahl einzupassen. Nicht erweiterte Tasten beenden das Programm, z. B. Escape.

BEARBEITEN: Zeigt jetzt auch Ihren Helden unter der Karte an, indem Sie a<230anstelle von a<132:

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

Code:

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
quelle
Das kompiliert nicht für mich.
Matt
Kompiliert und arbeitet für mich mit Visual Studio 2008.
Sir_Lagsalot
@Matt: Hm .. Ich habe bisher sowohl MinGW (gcc 4.6.1) als auch MSVC (VS 2009) unter Windows erfolgreich ausprobiert. Was ist die Fehlermeldung?
Schnaader
@schnaader in gcc 4.4.5 Ich bekomme: test.c :(. text + 0x1a1): undefinierter Verweis auf `putch '. Ich bekomme den gleichen Fehler für getch
Matt
Denn putches putchargibt das Gleiche, aber ich weiß nicht, wie ich es ersetzen soll getch- es gibt auch ein getchar, aber es funktioniert bei mir nicht - es scheint, dass es die Cursortasten nicht erkennt.
Schnaader
4

Ruby 1.9 + Flüche (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
quelle
1
Dabei wird eine andere als die angegebene Karte verwendet. Ich empfehle stattdessen die Verwendung von 0xf3e499e601c0d0240b0380679927cf.
Matt
@ Matt guter Fang, danke!
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]

Die Python Curses-Bibliothek wird nur unter Linux offiziell unterstützt. Es gibt inoffizielle für Windows, aber ich kann nicht garantieren, dass dies damit funktioniert.

Um ein paar Zeichen zu speichern, habe ich die Schlüsselcodes für oben, unten, links und rechts fest codiert. Dies kann bei manchen Menschen zu Problemen führen. Wenn dies für niemanden funktioniert, kann ich eine Version posten, die sollte.

Verwenden Sie Strg + C zum Beenden. Sie müssen Ihr Terminal wahrscheinlich nach dem Beenden zurücksetzen, aber die Herausforderung besagte ausdrücklich, dass der Ausgang nicht ordnungsgemäß sein musste.

Matt
quelle
1

QBasic, 314 313 Bytes

Diese Art von Problem erfordert einfach eine QBasic-Lösung.

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

Dies ist Golf QBasic, das durch den Autoformatter erheblich erweitert wird. Wenn Sie jedoch genau diesen Code in die IDE eingeben und F5 drücken, sollte er ausgeführt werden. Getestet auf QB64 .

Bildschirmfoto

Erläuterung:

Die Karte wird zeilenweise als die Bits der Ganzzahlen in der DATAAnweisung codiert (1 für Leerzeichen, 0 für Wand). Die verschachtelte FORSchleife entpackt sie, speichert Wahrheitswerte im 2D-Array wund druckt #oder entsprechend. (Beachten Sie, dass dies in QBasic der Fall ist -1. Deshalb addieren wir zu 35, anstatt zu subtrahieren!) Der Spieler beginnt bei 3,3, da die meisten Dinge in QBasic 1-indiziert sind.

Wir geben dann eine GOTOSchleife: Druck der @, Tastatureingabe, Konvertieren zu erweiterten Zeichencodes erhalten und modifizieren , xund ybasierend darauf , ob der Benutzer gedrückt L / U / R / D. Wenn w(x,y)es wahr ist, dann ist es ein Raum und wir können dorthin ziehen; Ansonsten bleib sitzen. Der kürzeste Weg, den ich zum Beenden gefunden habe, ist das Drücken der Tabulatortaste (ASCII 9). Jede andere Eingabe führt uns zurück zum erstenLOCATE Anweisung.

Ich muss sagen, ich bin ziemlich gekitzelt, Python mit einer QBasic-Antwort geschlagen zu haben.

DLosc
quelle