Übung 6: Text-Adventure

../../_images/castle_01.png

Beschreibung des Adventures

One of the first games I ever played was a text adventure called Colossal Cave Adventure. You can play the game on-line here (1), here (2) or here (3) to get an idea what text adventure games are like. Seriously, give it a try. Otherwise it will be hard to understand what we are trying to do here.

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?

This game assumes you know the material up through Introduction to Lists and Classes, Constructors, and Attributes.

Erstelle dein Dungeon

Bevor du beginnst, skizziere das Dungeon, das du erstellen möchtest. Es könnte ungefähr so ​​aussehen:

../../_images/castle_map_01.png

Als nächstes nummeriere alle Räume beginnend mit Null.

../../_images/castle_map_02.png

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.

  1. Define a class called Room as shown in Defining the Class.

  2. Define an __init__ (also known as the constructor) method as shown in Defining the Init Function.

  3. Define class attributes for description, north, east, south, and west as shown in Defining the Init Function. Default description to an empty string, all others to 0.

  4. Update the __init__ method to take in data for all five attributes when the Room is created. So instead of defaulting to zero, now set the elements to the parameters passed in. Refer back to Address Class With Init Parameters for an example of what we are looking for.

  5. Create a main function and call the main function as shown in Creating a Main Function. Make sure your main function is not inside the Room class.

  6. Erstelle in der main-Funktion ein leeres Array mit dem Namen room_list. Wenn du vergessen hast wie das geht, lies Create an Empty List.

  7. Create a variable called room. Set it equal to a new instance of the Room class. 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. Use None if no room hooks up in that direction. (Do not put None in quotes. Also, remember that Python is case sensitive so none won’t work either. The keyword None is a special value that represents „nothing.“ Because sometimes you need a value, other than zero, that represents )

  8. Hänge diesen Raum an die Raumliste an. Siehe Adding to a List, wenn du vergessen hast, wie das geht.

  9. Repeat the prior two steps for each room you want to create. Just re-use the room variable.

  10. Erstelle eine Variable namens current_room. Setze sie auf Null.

  11. Print the room_list variable. 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 main function at the end of your program, and that it isn’t indented.

  12. Adjust your print statement to 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>
    
  13. Mit current_room und room_list gibst du den aktuellen Raum aus, in dem sich der Benutzer befindet. Da dein erster Raum 0 ist, sollte die Ausgabe dieselbe sein wie zuvor.

  14. 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 .description to 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.
    
  15. Erstelle eine Variable mit dem Namen done und setze sie auf False. Füge dann den Ausdruck der Raumbeschreibung in eine while-Schleife ein, die so lange wiederholt wird, bis done auf True gesetzt ist. Wir werden done aber noch nicht auf True setzen.

  16. Füge vor der Ausgabe der Beschreibung Code hinzu, um eine leere Zeile auszugeben, dadurch wird sie bei jedem Spielzug optisch abgetrennt.

  17. 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.

  18. 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.

  19. If the user wants to go north, create a variable called next_room and get it equal to room_list[current_room].north, which should be the number for what room is to the north.

  20. Add another if statement to see if the next room is equal to None. If it is, print „You can’t go that way.“ Otherwise set current_room equal to next_room. Note: This new if statement is part of the if statement to go north. So make sure it is indented inside that if. Also, if you are doing one choice or another, remember to use else.

  21. Teste dein Programm. Kannst du nach Norden in einen neuen Raum gehen?

  22. Füge elif -Anweisungen hinzu, um Ost, Süd und West zu behandeln. Füge eine else-Anweisung hinzu, um dem Benutzer mitzuteilen, dass das Programm nicht versteht, was er eingegeben hat.

  23. 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.

  24. Es ist eine gute Idee, zu jedem Abschnitt auch Kommentare hinzuzufügen.

  25. 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.“

  26. Füge einen Ende-Kommando hinzu, das das Spiel beendet.

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 directions 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.