Yahtzee spelet del 2 - klasser

By , . Latest revision .

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.

Klassen Rule, dess subklasser och Scoreboard

Klassen Rule, dess subklasser och Scoreboard

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 ska True returneras, annars False. 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ärden
  • points(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 i value 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.

Klassen Scoreboard

Klassen Scoreboard

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 ett ValueError 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 returnera True om alla regler har använts en gång för att få poäng, annars False.

  • 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

  1. Kopiera er kod från me/kmom02/yahtzee1 till me/kmom03/yahtzee2.

  2. Implementera de nya metoderna för Die och Hand.

  3. Lägg till ett test för Die klassen i me/kmom03/yahtzee2/tests/test_die.py. Testa följande saker i Die klassen:

    1. Att __eq__() returnerar rätt vi jämförelse med ett annat Die objekt.
  4. Skapa tester för Hand klassen i me/kmom03/yahtzee2/tests/test_hand.py. Testa följande saker i Hand klassen:

    1. 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.
    2. Att skapa ett objekt och skicka lista med tärningsvärden till konstruktorn.
    3. Att to_list() returnerar en lista med tärningarnas värde.
  5. Implementera koden för Rule enligt klassdiagrammen ovanför. Spara alla klasser i filen me/kmom03/yahtzee2/src/rules.py.

  6. Implementera koden för Scoreboard enligt klassdiagrammen ovanför. Spara koden i filen me/kmom03/yahtzee2/src/scoreboard.py.

  7. Gör nya klassdiagram för Die och Hand, inkludera relation och kardinalitet. Spara dem som uml.png i yahtzee2 mappen. Rita gärna i draw.io. Ni kan utgå från diagrammen som finns i Yahtzee1 uppgiften.

  8. 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

  1. I Die klassen, gör om metoden get_value() till en get property med namnet value.

#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.

Document source.

Category: oopython.