Fortsättning på Yahtzee spelet - del 4
Som i alla spel behöver vi veta vem som är bäst, i denna uppgifter ska vi lägga till en topplista över spelares poäng.
Ni ska skapa en ny vi där vi kan se vilka poäng spelare har fått. Poängen ska sparas i en fil och använda er egna UnorderedList.
#Förkunskaper
Du har läst artikeln “Exceptions”.
Du har läst artikeln “Datastrukturer”.
Du har läst artikeln “Hantera datan som utgör objekten”
#Introduktion
Spelet ska följa de internationella reglerna och inte svenska reglerna. Här kan ni hitta reglerna.
Nytt i denna uppgiften är att skapa en LeaderBoard klass som använder en UnorderedList och spara data i en fil.
Era klasser ska uppfylla beskrivningarna nedanför. Beskrivningarna är vad som måste finnas, ni får och är rekommenderade att skapa ytterligare metoder och attribut där ni tycker att det behövs.
#Unordered list
Vi ska skapa en egen datastruktur, en “Unordered list”, som en klass. Unordered list kan liknas vid en vanlig lista i Python. Det ska gå att lagra element i den. En representation av en unordered list kan se ut såhär:
Nedanför ser vi ett klassdiagram för en UnorderedList klass. Under diagrammet beskrivs varje metod. Diagrammet ska uppfyllas av er implementation.
__init__
: Skapa en tom lista.append
: Lägg till nytt element/nod sist i listan.set
: Skriv över element med ny data som finns på index. Om index inte finns lyftMissingIndex
exception.size
: Returnera antalet element i listan. En tom lista har storleken 0.get
: Returnera värde på index. Om index inte finns lyftMissingIndex
exception.index_of
: Om data finns i listan returnera dess index. Om värdet inte finns lyftMissingValue
exception.print_list
: Skriv ut listans innehåll.remove
: Ta bort nod med samma data. Om värdet inte finns lyftMissingValue
exception. Om det finns flera noder med värdet, ta bara bort första.
TIPS skapa append
och get
tidigt, de behövs för testerna.
TIPS För att exekvera er UnorderedList kod separat från resten av koden kan ni skriva python3 -m src.unorderedlist
. Det kan ni använda för att testa köra koden när ni utvecklar den.
#Leaderboard
Denna klassen ska innehålla hur många poäng olika spelare har fått när de har spelat klart. Ni ska använda er av UnorderedList för att hålla namn och poäng för varje klart spel som har sparats.
Metoderna i diagrammet måste finnas, i övrigt får ni själva bestämma hur klassen ska implementeras. Konstruktorn får ni själva bestämma vad som behövs för att skapa ett nytt objekt. Ni kan också lägga till fler metoder och attribut.
#Attribut
entries
- Ska innehålla ett UnorderedList objekt.
#Metoder
__init__(entries=None)
- Konstruktorn ska skapa UnorderedList objektet. Parameternentries
ska ha default värdetNone
. Det ska kunna ta ett vanligtlist
objekt med sparade name och poäng. Om en lista skickas med ska ni ta elementen från listan och lägga i ert UnorderedList objekt.load(filename)
- Ska vara en klassmetod. Metoden ska läsa upp data från fil med filnamnet, skapa ettLeaderboard
objekt med data från filen och sen returnera det skapadeLeaderboard
objektet.save(filename)
- Metoden ska spara datan frånenteries
till fil med filnamnet. Datan ska vara strukturerad i filen så att ni kan läsa upp den iload()
och återskapaLeaderboard
objektet. PS Om du fårpermission denied
på studentservern, körsudo chmod 777 din-fil
lokalt och gör dbwebb publish igen.add_entry(name, score)
- Metoden ska lägga till namn och poäng ientries
.remove_entry(index)
- Metoden ska ta bort elementet med index värde frånentries
.
Tips! I app.py
, för ert Leaderboard
objekt ska ni inte spara något i session
. Nu ska ni använda save()
och load()
för att spara och läsa data från fil istället. På det sättet kan vi göra datan permanent.
#Krav
Kopiera er kod från
me/kmom04/yahtzee3
tillme/kmom05/yahtzee4
.Implementera
Node
klassen iyahtzee4/src/node.py
.Implementera Exception klasserna
MissingIndex
ochMissingValue
iyahtzee4/src/errors.py
Implementera
UnorderedList
klassen iyahtzee4/src/unorderedlist.py
.Implementera
Leaderboard
klassen iyahtzee4/src/leaderboard.py
. EttUnorderedList
objekt ska användas för att hålla spelare och dess poäng. Tips, använd en tuple för att hålla namn och poäng som ett element.Använd en fil för att spara data från
Leaderboard
klassen.När spelaren har använt alla regler och vunnit ska spelaren se hur många poäng den fick och få upp ett formulär där användaren kan skriva in sitt namn. Formuläret ska skickas till en route där namnet och dess poäng läggs till i ett
Leaderboard
objekt. Spara ner den uppdatera datan till fil.Skapa en ny vy för att visa upp topplistan, använd en tabell för att visa namn och poäng spelare har fått. I er template fil ska ni jobba mot ett
UnorderedList
objekt, ni får inte plocka ut data från det, lägga i en vanlig lista och sen jobba mot den vanliga listan.I tabellen för topplistan ska man kunna välja att radera ett inlägg i topplistan, då ska det även tas bort från filen.
I topplista vyn ska det skrivas ut hur många sparade inlägg som finns.
Lägg till tester för följande saker. Kolla på Testa exceptions för att se hur man fångar exceptions i ett test:
- UnorderedList klassen:
get()
- kolla att exception lyfts om index inte finns.get()
- kolla att rätt värde returneras om index finns.remove()
- kolla att exceptions lyfts om värde saknas.remove()
- kolla att listan är korrekt efter element har tagits bort om värdet finns.
- UnorderedList klassen:
Testa, validera och publicera applikationen på studentservern.
# Ställ dig i kurskatalogen
dbwebb test yahtzee4
dbwebb publish yahtzee4
Rätta eventuella fel som dyker upp och validera igen. När det ser grönt ut så är du klar.
#Extrauppgift
Använd
datetime
modulen för att spara dag och tid som spelaren fick sin poäng. Visa upp det i topplista routen också.Implementera den magiska metoden len för din UnorderedList. Gör så
len(list)
fungerar.Implementera den magiska metoden str för din UnorderedList. Gör så
print(list)
ochstr(list)
fungerar.Implementera den magiska metoden getitem för din UnorderedList. Gör så
list[0]
fungerar.Implementera den magiska metoden setitem för din UnorderedList. Gör så
list[0] = 4
fungerar.
#Tips från coachen
Lär dig felsöka med debuggern, använd den när du får problem. Komplettera med utskrifter av print()
.
Validera ofta. Så slipper du en massa valideringsfel i slutet av övningen.
Lycka till och hojta till i forumet om du behöver hjälp!
#Revision history
- 2023-02-23: (B, aar) La till dunder metoderna som extrauppgifter.
- 2023-01-21: (A, aar) Första upplagan.