Übung 6: Text-Adventure¶
Beschreibung des Adventures¶
Eines der ersten Spiele, das ich je gespielt habe, war ein Text-Adventure namens Colossal Cave Adventure. Du kannst das Spiel here online spielen, um eine Vorstellung davon zu bekommen, wie Text-Adventures aussehen. Im Ernst, probiere es aus. Ansonsten wird es schwer zu verstehen sein, was wir hier versuchen.
Die wohl bekanntesten Spiel dieser Art ist die Zork-Serie.
Das erste „große“ Programm, das ich selbst erstellt habe, war ein Text-Adventure. Es ist einfach, ein solches Adventure zu beginnen. Es ist auch eine großartige Möglichkeit, das Verwenden von Listen zu üben. Unser Spiel in dieser Übung beinhaltet eine Liste von Räumen, die nach Norden, Osten, Süden oder Westen navigiert werden können. Jedes Zimmer ist eine Liste mit der Beschreibung des Zimmers und den Zimmern in den jeweiligen Richtungen. Im folgenden Abschnitt findest du einen Beispiellauf:
Probelauf¶
You are in a dusty castle room.
Passages lead to the north and south.
What direction? n
You are in the armory.
There is a room off to the south.
What direction? s
You are in a dusty castle room.
Passages lead to the north and south.
What direction? s
You are in a torch-lit hallway.
There are rooms to the east and west.
What direction? e
You are in a bedroom. A window overlooks the castle courtyard.
A hallway is to the west.
What direction? w
You are in a torch-lit hallway.
There are rooms to the east and west.
What direction? w
You are in the kitchen. It looks like a roast is being made for supper.
A hallway is to the east.
What direction? w
Can't go that way.
You are in the kitchen. It looks like a roast is being made for supper.
A hallway is to the east.
What direction?
Diese Übung setzt voraus, dass du die Kapitel bis zu Einführung in Listen kennst.
Erstelle dein Dungeon¶
Bevor du beginnst, skizziere das Dungeon, das du erstellen möchtest. Es könnte ungefähr so aussehen:
Als nächstes nummeriere alle Räume beginnend mit Null.
Verwende diese Skizze, um herauszufinden, wie alle Räume miteinander verbunden sind. Beispielsweise ist Raum 0 mit Raum 3 im Norden, Raum 1 im Osten und kein Raum im Süden und Westen verbunden.
Schritt für Schritt Anweisungen¶
Denke daran, das ich Ende des Jahres nach doppelten Hausaufgaben suche. Ich sammele alle Hausaufgaben aus früheren Semestern und Aufgaben von Nicht-Simpson-Studenten, die ich online finde. Ich führe ein Programm aus, das nach Duplikaten sucht. Stelle sicher, dass deine Arbeit deine eigene ist.
Define a class called
Roomas shown in Defining the Class.Define an
__init__method as shown in Defining the Init Function.Define class attributes for
description,north,east,south, andwestas shown in Defining the Init Function. Defaultdescriptionto an empty string, all others to0.Customize the
__init__method (also known as the constructor) to take in data for all five attributes when theRoomis created. Refer back to Address Class With Init Parameters for an example.Create a
mainfunction and call themainfunction as shown in Creating a Main Function. Make sure yourmainfunction is not inside theRoomclass.Erstelle in der
main-Funktion ein leeres Array mit dem Namenroom_list. Wenn du vergessen hast wie das geht, lies Erstelle eine leere Liste.Create a variable called
room. Set it equal to a new instance of theRoomclass. For the first parameter, create a string with a description of your first room. The last four elements will be the number of the next room if the user goes north, east, south, or west. Look at your sketch to see what numbers to use. UseNoneif no room hooks up in that direction. (Do not putNonein quotes. Also, remember that Python is case sensitive sononewon’t work either. The keywordNoneis a special value that represents „nothing.“ Because sometimes you need a value, other than zero, that represents )Hänge diesen Raum an die Raumliste an. Siehe An eine Liste anhängen, wenn du vergessen hast, wie das geht.
Repeat the prior two steps for each room you want to create. Just re-use the
roomvariable.Erstelle eine Variable namens
current_room. Setze sie auf Null.Print the
room_listvariable. Run the program. You should see a really long list of every room object in your adventure that looks something like this strange line:[<__main__.Room object at 0x03800520>, <__main__.Room object at 0x0398F220>,
If you don’t, make sure you are calling your
mainfunction at the end of your program, and that it isn’t indented.Adjust your
print statementto only print the first room (element zero) in the list. Run the program and confirm you get output similar to:<__main__.Room object at 0x03800520>
Mit
current_roomundroom_listgibst du den aktuellen Raum aus, in dem sich der Benutzer befindet. Da dein erster Raum 0 ist, sollte die Ausgabe dieselbe sein wie zuvor.Change the print statement so that you only print the description of the room, and not the strange object printing we are getting now. You can do that by appending
.descriptionto what you printed in the prior step. When you run it, you should get your room description:You are in a room. There is a passage to the north.
Erstelle eine Variable mit dem Namen
doneund setze sie aufFalse. Füge dann den Ausdruck der Raumbeschreibung in einewhile-Schleife ein, die so lange wiederholt wird, bisdoneaufTruegesetzt ist. Wir werdendoneaber noch nicht aufTruesetzen.Füge vor der Ausgabe der Beschreibung Code hinzu, um eine leere Zeile auszugeben, dadurch wird sie bei jedem Spielzug optisch abgetrennt.
Füge nach der Ausgabe der Raumbeschreibung eine Codezeile hinzu, in der der Benutzer gefragt wird, was er tun möchte. Verwende die Anweisung
input. Denke daran, dass du Buchstaben eingeben wirst. Daher möchtest du nicht, was der Benutzer eingibt, in eine Ganzzahl oder eine Gleitkommazahl umwandeln. Es wird so ähnlich aussehen, wie wir Eingaben in Übung 4: Kamel erhalten haben. Der häufigste Fehler, den ich bei Studierenden gesehen habe, ist, eine Eingabe-Anweisung zu haben und den Rückgabewert nicht zu erfassen. Siehe Zurückgegeben Wert weiterverarbeiten, wenn du dieses Problem hast.Füge eine
if-Anweisung hinzu, um festzustellen, ob der Benutzer nach Norden gehen möchte. Du solltes Benutzereingaben wie „n“ und „N“ sowie „Nord“ und „NoRd“ akzeptieren. Möglicherweise musst du Folgendes wiederholen Textvergleiche und Mehrfache Textvergleiche.If the user wants to go north, create a variable called
next_roomand get it equal toroom_list[current_room].north, which should be the number for what room is to the north.Add another
ifstatement to see if the next room is equal toNone. If it is, print „You can’t go that way.“ Otherwise setcurrent_roomequal tonext_room. Note: This newifstatement is part of theifstatement to go north. So make sure it is indented inside thatif. Also, if you are doing one choice or another, remember to useelse.Teste dein Programm. Kannst du nach Norden in einen neuen Raum gehen?
Füge
elif-Anweisungen hinzu, um Ost, Süd und West zu behandeln. Füge eineelse-Anweisung hinzu, um dem Benutzer mitzuteilen, dass das Programm nicht versteht, was er eingegeben hat.Es ist eine gute Idee, Leerzeilen in den Programmcode einzufügen, der die einzelnen Richtungen behandelt. Ich meine nicht eine Leerzeile auszugeben, sondern tatsächlich Leerzeilen im Programmcode. Auf diese Weise gruppierst du den Code visuell in Abschnitte.
Es ist eine gute Idee, zu jedem Abschnitt auch Kommentare hinzuzufügen.
Teste dein Programm. Stelle sicher, dass du genügend Beschreibungen hast, damit jemand, der das Programm ausführt, weiß, in welche Richtung es gehen soll. Sag nicht „Du bist in der Küche.“ Sag stattdessen „Sie sind in der Küche. Es gibt eine Tür nach Norden.“
Füge einen Ende-Kommando hinzu, das das Spiel beendet.
Stelle sicher, dass das Programm für Groß- und Kleinschreibung funktioniert.
Das Programm soll funktionieren, wenn der Benutzer „nord“ oder „n“ eingibt. Wiederhole Mehrfache Textvergleiche falls nötig.
Verwende etwas Zeit, um dieses Spiel interessant zu machen. Erstelle nicht einfach einen „Ostraum“ und einen „Westraum“. Das ist langweilig.
Nehme dir auch ein wenig Zeit, um Rechtschreibung und Grammatik zu überprüfen. Ohne ein Textverarbeitungsprogramm, das deine Texte überprüft, musst du besonders aufmerksam sein. Beachte insbesondere:
In the past I’ve had people capitalize words in this lab that should not be capitalized. Incorrect capitalization of direcetions are common. See when do you capitalize directions.
Schreibe Raumnamen in Großbuchstaben. Schreibe nicht „Sie befinden sich im wohnzimmer“, da das Wort „Wohnzimmer“ in Großbuchstaben geschrieben wird.
Verwende \n, um Zeilenumbrüche in deinen Beschreibungen aufzunehmen, damit nicht alles in einer Zeile ausgegeben wird. Setze keine Leerzeichen um das \n herum, sonst werden die Leerzeichen ausgegeben.
What I like about this program is how easy it is to expand into a full game. Expanding the game to use all eight cardinal directions (including „NorthWest“), along with „up“ and „down“ is rather easy. Managing an inventory of objects that can exist in rooms, be picked up, and dropped is just a matter of keeping lists.
Die Erweiterung dieses Programms zu einem vollständigen Spiel ist eine der beiden Optionen für die abschließende Übung in diesem Kurs.