Yahtzee spelet del 2

By , . Latest revision .

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

Klassen Rule och dess subklasser

Klassen Rule och dess subklasser

#Attributen

Inga.

#Metoderna

  • points(hand) - metoden är abstrakt och ska innehålla pass. 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ärden
  • points(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. 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

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

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

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

  4. Lägg till ett test för Die klassen i me/kmom02/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.
  5. Skapa tester för Hand klassen i me/kmom02/yahtzee2/tests/test_hand.py. Testa följande saker i Hand klassen:

    1. Att skapa ett objekt utan skicka argument till konstruktorn.
    2. Att skapa ett objekt och skicka lista med tärningar till konstruktorn.
    3. Att roll() med en lista som argument slår om rätt tärningar.
    4. Att roll() utan argument slår om alla tärningar.
    5. Att to_list() returnerar en lista med tärningarnas värde.
  6. 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.

  1. Vid menyval “r” efter att tärningarna visats, så ska användaren kunna välja regel och då ska poängsumman visas.

  2. Testa, validera och publicera applikationen på studentservern.

#Krav grupp

När ni är färdiga kan det se ut så här:

Bild efter 1 slag och regeln Threes vald

Bild efter 1 slag och regeln Threes vald

  1. 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”.

  2. Vid varje regel ska det också visas hur många poäng respektive regel är värd men nuvarande hand.

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

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

  5. Lägg till en route reset som nollställer sessionen och därmed startar om spelet. Lägg till den i navbaren.

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

Document source.

Category: oopython.