Labb 6

Labb 6 är den första labben i en serie labbar. Serien går ut på att ni ska skriva ett spel. Spelet går ut på att hitta ut ur en labyrint. På vägen så ska man försöka så många mynt som möjligt, samt undvika de elaka monstrena.

Spelet implementeras i tre steg. Varje steg ses som en milstolpe i utvecklingsprocessen med en leverans som ska lämnas in.

Första leveransen ska innehålla följande:

  • funktioner som används för att skapa och manipulera den abstrakta datatyperna för rum
  • sju rum som sitter ihop
  • ett embryo till själva spelet:
    • huvudpersonen börjar i ett rum
    • användaren kan navigera mellan rummen med via ett textgränssnitt
    • användaren kan be om en beskrivning av rummet med hjälp av kommandot titta/look

Du kommer att behöva läsa pythondokumentationen kring dictionary för att klara labben. Du hittar den här: http://docs.python.org/2/library/stdtypes.html#typesmapping

IPython och texteditor

För att använda IPython måste man lägga till en modul till sitt konto. Detta behöver man bara göra en gång. Följande skrivs in i ett skalfönster (där zaza <1> är prompten):

zaza <1> module initadd prog/python/2.7.2
zaza <2> module load prog/python/2.7.2

För att starta IPython skriver du sedan:

zaza <3> ipython

Texteditorerna gedit, jedit och emacs hittar du i “start-menyn”. Vill du använda vi skriver du vi i ett skalfönster. Det tar tid att lära sig använda emacs och vi, så det görs bäst utanför labbtid. Om du inte redan kan emacs eller vi, prova både gedit och jedit och hitta er favorit.

Uppdatering 2012–11–06: jedit ligger under Program -> Programmeringsverktyg -> Programkodredigerare. gedit ligger under Program -> Tillbehör -> Textredigerare.

För att köra IPython hemma är det enklaste att ladda ner och installera EPD Free.

Att köra det man skrivit i texteditorn

Om vi antar att du sparat din fil i ~/729G04/labb6/labb6-abcde12-fghij34.py så kan du göra följande för att köra det du skrivit.

Starta ipython

Öppna ett skalfönster, skriv in följande.

zaza <1> ipython
Python 2.7.2 (default, Mar  8 2012, 09:29:03) 
Type "copyright", "credits" or "license" for more information.

IPython 0.13 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:

Du har nu startat IPython. Du kan göra samma saker här som i det interaktiva Python-skalet i IDLE + ännu mer.

Ladda filen (samma sak som F5)

Man laddar en fil med %run -i <filnamn>. Du måste då skriva hela sökvägen till filen. Alternativt kan du navigera dit med de kommandon (t.ex. cd och ls) du kan använda i ett vanligt skalfönster (Terminal). Du kan använda tab-komplettera katalog och filnamn.

In [1]: cd 729G04/labb6
/home/abcde12/729G04

In[2]: %run -i labb6-abcde12-fghij34.py

Kommandot %run -i laddar in Python-kod in i minnet. Du kan nu använda de funktioner du definierat i filen. Om du skrivit “lös” kod i filen kommer den att köras.

Avsluta IPython

Du avslutar IPython genom att trycka ctrl-d.

Lite mer om IPython hittar du på följande kompissida: http://www.ida.liu.se/~729G04/kompis/ipythonquickstart

Implementationssteg

Följ stegen nedan för labb 6. Lite tips på hur man använder dictionary kan du hitta på följande kompissida: http://www.ida.liu.se/~729G04/kompis/dictionaryquickstart

  1. Skapa en funktion create_room(name) som skapar ett rum, dvs returnerar en dictionary som har innehåller namn på rummet, tom beskrivning av rummet (""), samt nycklar med tomma värden (None) för rum åt alla fyra väderstreck.
  2. Skapa funktionen set_room_description(room, description) som tar ett rum som argument och ändrar på dess beskrivning. Room är använder den struktur som skapats av create_room() som representerar ett rum. Beskrivningen är en sträng.
  3. Skapa funktionerna set_north_exit(room, exit_room), set_east_exit(room, exit_room), set_south_exit(room, exit_room) och set_west_exit(room, exit_room) som används för att ändra på ett rums utgångar. Uppdatering 2012–11–16: Både room och exit_room är av den abstrakta datatypen room. room är av den abstrakta typen room. exit_room kan vara av den abstrakta typen room, men för att underlätta inför labb 7, så är det bästa att använda en sträng med namnet på rummet.
  4. Skapa get-funktioner för alla attribut hos rum som ni kan sätta.
  5. Skapa sju rum som hänger ihop, spara dem i en dictionary. Använd rummens namn som nycklar.
  6. Spara spelarens position (en referens till ett rum) i en variabel current_room
  7. Skriv en funktion main() som innehåller huvudloopen. Huvudloopen innehåller implementationen av textgränssnittet som ska möjliggöra att du kan gå mellan rum. Den ska hantera förflyttningskommandon (t.ex. n, e, s, w) och tittakommandot (t.ex. look eller titta).
  8. Skriv en funktion print_room_desc(room) som skriver ut ett rums beskrivning samt berättar vilka håll som det finns dörrar åt.
  9. Implementera funktioner som anropas på när användaren vill flytta på sig. Dessa funktioner ska flytta spelaren om möjligt.

Nedan följer ett skissartat körexempel.

>>> main()
Welcome to the LABYRINTH

--------------------
Room: Start
The walls and floor are made of stone. You feel cold.
Exits: north
--------------------
Command: north
You walk through the north exit.
Command: look
--------------------
Room: North room
The walls and floor are made of stone. You feel cold. Deja vu.
Exits: east, south
--------------------
Command: 

Felhantering

  • Inmatningen från användaren ska felhanteras. Dvs användaren ska kunna skriva in vad som helst utan att programmet kraschar.
  • förflyttningar ska felhanteras – feedback ska ges till användaren om hen försöker gå åt ett håll som det inte finns ett rum
  • set-funktionerna ska också innehålla felhantering, dvs de ska kontrollera så att argumenten är av rätt typ.

Tips

Alla tips har flyttat till denna kompissida: http://www.ida.liu.se/~729G04/kompis/labb6tips

Inlämning

Labben lämnas in via e-post och som papperskopia i labbomslag till din labbhandledare. Vad som ska ingå står högst upp under rubriken “Första leveransen ska innehålla”.


Sidansvarig: Jody Foo
Senast uppdaterad: 2012-10-29