Yahtzee spelet del 2
I denna uppgiften ska ni fortsätta med Yahtzee spelet ni började på i kmom01.
Ni kommer att fortsätta utveckla spelet igenom flera kursmoment. I denna uppgiften skapar vi alla regler och anger vilken regel som ska användas. Poängsumman sparar vi och visar liksom föregående tärningsslag.
#Förkunskaper
Ni har gått igenom delarna “Intro till guiden” och “Klass relationer” i guiden “Kom igång med objekt”.
Ni har jobbat igenom övningen “Flask, POST och GET”.
Ni har jobbat igenom övningen med UML del 2.
Om ni har gjort övningarna så har ni nästan kommit i mål med uppgiften.
#Introduktion
Ni ska som sagt utveckla ett Yahtzee spel över flera kursmoment. Ni som jobbar ensamma ska utveckla spelet för terminalen medan ni som jobbar i grupp ska utveckla spelet för webbläsaren med hjälp av Flask.
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.
#Die
Lägg till en ny metod.
__eq__(die/value)
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)
- metoden är abstrakt och ska innehållapass
. 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, name)
- inga defaultvärdenpoints(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. 3 för 3 stycken 1:or om det är i subklassen Ones.
#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)
- 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
#Krav
Kraven är uppdelade i tre sektioner nedanför. Ni som jobbar i grupp måste uppfylla kraven i Krav för alla och Krav grupp. Ni som jobbar ensamma måste uppfylla kraven i Krav för alla och kan välja mellan att göra Krav ensam eller Krav grupp.
#Krav för alla
Kopiera er kod från
me/kmom01/yahtzee1
tillme/kmom02/yahtzee2
.Implementera de nya metoderna för Die och Hand.
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.Lägg till ett test för Die klassen i
me/kmom02/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/kmom02/yahtzee2/tests/test_hand.py
. Testa följande saker i Hand klassen:- Att skapa ett objekt utan skicka argument till konstruktorn.
- Att skapa ett objekt och skicka lista med tärningar till konstruktorn.
- Att
roll()
med en lista som argument slår om rätt tärningar. - Att
roll()
utan argument slår om alla tärningar. - Att
to_list()
returnerar en lista med tärningarnas värde.
Implementera koden för Rule enligt klassdiagrammen ovanför. Spara alla klasser i filen
me/kmom02/yahtzee2/src/rules.py
.
#Krav ensam
Du ska lägga till följande funktionalitet till ditt terminalprogram.
Vid menyval “r” efter att tärningarna visats, så ska användaren kunna välja regel och då ska poängsumman visas.
Testa, validera och publicera applikationen på studentservern.
#Krav grupp
När ni är färdiga kan det se ut så här:
Lägg till radiobuttons för de olika reglerna i ett formulär med en submit-knapp. Bredvid en radiobutton för en viss regel ska namnet på regeln skrivas ut, t.ex. “Three of a kind”.
Vid varje regel ska det också visas hur många poäng respektive regel är värd men nuvarande hand.
Varje gång användaren använder formuläret för att få poäng för en regel, spara den totala poängsumman i session och visa upp den på sidan.
Använd session för att spara värdet på föregående hand och visa upp det överst på webbsida, “Last die rolls”. Spara nuvarande värde på tärningarna med
to_list()
till sessionen innan du slår om tärningarna.Lägg till en route
reset
som nollställer sessionen och därmed startar om spelet. Lägg till den i navbaren.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
Det finns inga extrauppgifter.
#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
- 2022-01-20: (A, grm) Första upplagan.