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.
Lägg till poäng i topplistan
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.
Klassdiagram för Yahtzee.
#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.
klassdiagram för UnorderedList och Node
__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 lyftMissingIndexexception.size: Returnera antalet element i listan. En tom lista har storleken 0.get: Returnera värde på index. Om index inte finns lyftMissingIndexexception.index_of: Om data finns i listan returnera dess index. Om värdet inte finns lyftMissingValueexception.print_list: Skriv ut listans innehåll.remove: Ta bort nod med samma data. Om värdet inte finns lyftMissingValueexception. 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.
Klassen Leaderboard
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. Parameternentriesska ha default värdetNone. Det ska kunna ta ett vanligtlistobjekt 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 ettLeaderboardobjekt med data från filen och sen returnera det skapadeLeaderboardobjektet.save(filename)- Metoden ska spara datan frånenteriestill fil med filnamnet. Datan ska vara strukturerad i filen så att ni kan läsa upp den iload()och återskapaLeaderboardobjektet. PS Om du fårpermission deniedpå studentservern, körsudo chmod 777 din-fillokalt 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/yahtzee3tillme/kmom05/yahtzee4.Implementera
Nodeklassen iyahtzee4/src/node.py.Implementera Exception klasserna
MissingIndexochMissingValueiyahtzee4/src/errors.pyImplementera
UnorderedListklassen iyahtzee4/src/unorderedlist.py.Implementera
Leaderboardklassen iyahtzee4/src/leaderboard.py. EttUnorderedListobjekt 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
Leaderboardklassen.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
Leaderboardobjekt. 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
UnorderedListobjekt, 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
datetimemodulen 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] = 4fungerar.
#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.
