Yahtzee spelet del 2 - klasser
I denna uppgiften ska ni fortsätta med Yahtzee spelet ni började på i kmom02.
Ni kommer att fortsätta utveckla spelet igenom flera kursmoment. I denna uppgiften skapar vi alla regler ger spelaren möjlighet att välja regler. Vi jobbar inte något med Flask och det grafiska, det sparar vi till nästa vecka.
#Förkunskaper
Ni har gått igenom guiden “Kom igång med objekt”.
#Introduktion
Ni ska som sagt utveckla ett Yahtzee spel över flera kursmoment.
Spelet ska följa de internationella reglerna och inte svenska reglerna. Här kan ni hitta reglerna. Denna veckan ska vi skapa klasserna för reglerna. Vi ska kunna välja regel och visa dess poängsumman. Vi ska dessutom visa föregående tärningsslag.
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.
#Diagram
Klassdiagram över klasserna ni ska skapa. Dia och Hand är tomma för de klassdiagrammen ska ni fylla i själva.
PS. Jag har lagt en kompositions pil mellan Rule och Scoreboard, ni måste inte göra en sån implementation jag ritade den för att visa att Scoreboard behöver objekt från alla regel klasser. Egentligen borde det vara en pil både från Scoreboard och Hand till varje regel klass men jag det blir för rörigt då, därför har jag bara dragit till Rule klassen.
#Die
Lägg till en ny metod.
__eq__(die:Die/value:int)
ska kunna ta emot ett Die objekt eller ett heltal. Om tärningarna innehåller samma värde skaTrue
returneras, annarsFalse
. Samma gäller om heltaltet är samma som tärningens värde.
#Hand
Lägg till en ny metod.
to_list()
ska returnera en lista som innehåller värdet (int
) på alla tärningarna i Hand objektet.
#Rule
Denna klassen är en abstrakt klass och representerar en regel. Det ska finnas en subklass för varje sätt att få poäng.
#Attributen
Inga.
#Metoderna
points(hand: Hand)
- metoden är abstrakt och ska vara tom. Syftet med metoden är att räkna ut hur många poäng man får med en Hand med en regel.
#SameValueRule
Denna klassen ärver från Rule
och representerar reglerna i övre delen, antalet 1:or, 2:or, 3:or etc. Se klassdiagrammet “Klassen Rule och dess subklasser” ovan.
#Attributen
value
- Ska innehålla värdet för regeln, t.ex. 1 för regeln Ones, 2 för regeln Twos.name
- Ska innehålla namnet på regeln, t.ex. “Ones” för regeln Ones osv.
#Metoderna
__init__(value: int, name:str)
- inga defaultvärdenpoints(hand: Hand)
- ska ta emot ett Hand objekt som argument. Metoden ska räkna ut hur många av tärningarna som har samma värde som värdet ivalue
och returnera vad det blir i poäng. T.ex. 4 för 2 stycken 2:or om det är i subklassen Twos.
#Ones
Denna klassen ärver från SameValueRule
och representerar regeln med 1:or. Se klassdiagrammet “Klassen Rule och dess subklasser” ovan.
#Attributen
Inga.
#Metoderna
__init__()
- anropar basklassens konstruktor. Se kodexempel.
...
def __init__(self):
super().__init__(1, "Ones")
...
Klasserna Twos
, Threes
, Fours
, Fives
och Sixes
är uppbyggda på samma sätt.
#ThreeOfAKind
Denna klassen representerar regeln minst 3 likadana tärningar. Se klassdiagrammet “Klassen Rule och dess subklasser” ovan.
#Attributen
name
- Ska innehålla namnet på regeln, t.ex. “Three Of A Kind”.
#Metoderna
__init__()
- sätter namnet på regeln. Se kodexempel.
...
def __init__(self):
self.name = "Three of a kind"
...
points(hand: Hand)
- ska returnera poängsumman för regeln. Om handen innehåller minst 3 tärningar med samma värde blir poängen summan av alla tärningar i handen. Oavsett vilket värde det finns 3 av så blir poängen summan av alla 5 tärningar.
#Resterande regler
De andra klasserna för de andra reglerna FourOfAKind, FullHouse, SmallStraight, LargeStraight, Yahtzee och Chance är uppbyggda på samma sätt som ThreeOfAKind.
#FourOfAKind
FourOfAKind poäng sätts likadant som ThreeOfAKind, om man har minst fyra likadana tärningar så blir poängen summan av alla tärningar.
#FullHouse
För att ha FullHouse behöver tärningarna vara två av samma tal och triss av ett annat tal. Poängen för en FullHouse är alltid 25, oavsett vilka tärningar det är. T.ex. handen [1, 1, 6, 6, 6]
är värd 25 poäng.
#SmallStraight
För att ha SmallStraight behöver handen innehålla fyra sekventiella värden och en SmallStraight är alltid värd 30 poäng, oavsett vilka tärningar som utgör den. T.ex. [6, 1, 3, 2, 4]
är värd 30 poäng.
#LargeStraight
För att ha LargeStraight behöver alla värden i handen vara i sekventiell ordning och en LargeStraight är alltid värd 40 poäng, oavsett vilka tärningar som utgör den. T.ex. [5, 1, 3, 2, 4]
är värd 40 poäng.
#Yahtzee
För att ha Yahtzee måste alla tärningar i handen ha samma värde och en Yahtzee är alltid värd 50 poäng, oavsett vilka tärningar som utgör den. T.ex. [1, 1, 1, 1, 1]
är värd 50 poäng.
Vi skippar Yahtzee bonus regeln som står med i regel dokumentet som är länkat i början.
#Chance
Chance innebär att summan av alla tärningar i handen blir hur mycket poäng regeln är värd. T.ex. [1, 1, 1, 1, 1]
är värd 5 poäng
#Scoreboard
Denna klassen ska innehålla hur många poäng spelaren har samlat på sig och vilka regler som spelaren har fått poäng för. Hur ni implementerar denna klassen är inte lika reglerat som i tidigare uppgifter. Ni får göra lite egna val.
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
Det är upp till er själva vilka attribut ni vill ha. Datan som ska finnas i ett objekt är de olika reglerna och hur många poäng spelaren har fått för de olika reglerna.
Attributet ni väljer att använda för att hålla poängen, ska vara privat.
#Metoder
get_total_points()
- Metoden ska returnera hur många poäng spelaren har samlat på sig än så länge.add_points(rule_name, hand)
- Metoden ska lägga till poäng för en hand för en specifik regel. Om spelaren redan har fått poäng för den regeln ska ettValueError
lyftas och inga poäng ges.get_points(rule_name)
- Metoden ska returnera hur många poäng spelaren har fått för en regel. Om regeln inte har använts för att ge poäng, returnera-1
.finished()
- Metoden ska returneraTrue
om alla regler har använts en gång för att få poäng, annarsFalse
.from_dict(points)
- Det ska vara en classmethod som används för att skapa ett nytt Scoreboard objekt. Metoden ska ta emot en dictionary där nycklarna är namn på regler och värdena är hur många poäng som de reglerna har fått. Värdet-1
används för att markera att en regel inte har använts för att få några poäng. Här finns ett exempel på en dictionary som kan användas som argument. Tips skapa denna metoden tidigt, testerna använder sig av den för att skapa objekt att testa på.
#Krav
Kopiera er kod från
me/kmom02/yahtzee1
tillme/kmom03/yahtzee2
.Implementera de nya metoderna för Die och Hand.
Lägg till ett test för Die klassen i
me/kmom03/yahtzee2/tests/test_die.py
. Testa följande saker i Die klassen:- Att
__eq__()
returnerar rätt vi jämförelse med ett annat Die objekt.
- Att
Skapa tester för Hand klassen i
me/kmom03/yahtzee2/tests/test_hand.py
. Testa följande saker i Hand klassen:- Att skapa ett objekt utan skicka argument till konstruktorn.
- För att verifiera att det funkar som det ska räcker det inte med att bara kolla att ni har skapat ett objekt.
- Använd
random.seed()
för att kunna verifiera att ett objekt har skapats på korrekt sätt.
- Att skapa ett objekt och skicka lista med tärningsvärden till konstruktorn.
- Att
to_list()
returnerar en lista med tärningarnas värde.
- Att skapa ett objekt utan skicka argument till konstruktorn.
Implementera koden för Rule enligt klassdiagrammen ovanför. Spara alla klasser i filen
me/kmom03/yahtzee2/src/rules.py
.Implementera koden för Scoreboard enligt klassdiagrammen ovanför. Spara koden i filen
me/kmom03/yahtzee2/src/scoreboard.py
.Gör nya klassdiagram för Die och Hand, inkludera relation och kardinalitet. Spara dem som
uml.png
iyahtzee2
mappen. Rita gärna i draw.io. Ni kan utgå från diagrammen som finns i Yahtzee1 uppgiften.Testa, validera och publicera applikationen på studentservern.
# Ställ dig i kurskatalogen
dbwebb test yahtzee2
dbwebb publish yahtzee2
Rätta eventuella fel som dyker upp och validera igen. När det ser grönt ut så är du klar.
#Extrauppgift
- I Die klassen, gör om metoden
get_value()
till en get property med namnetvalue
.
#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
- 2024-01-17: (A, aar) Första upplagan.