Skip to content

Kmom03: Tärningsspelet Dice100 del 2

Tärningsspelet Dice100 är ett enkelt men roligt tärningsspel. Det gäller att samla ihop poäng för att komma först till 100 genom att kasta tärningar. I varje omgång kastar en spelare i taget tärningar tills spelaren väljer att stanna och spara poängen eller tills det dyker upp en 1:a eftersom spelaren då förlorar alla poäng som samlats in i rundan. Antalet rundor räknas upp oavsett om spelaren väljer att spara rundan eller får en etta.

I denna uppgiften får du möjlighet att använda en statisk klass AsciiArt som “skriver ut” tärningarna som enkla terminalbilder i ASCII.

Vi gör ett eget undantag/exception och sparar dessutom en topplista på fil. Naturligtvis lägger du till ett menyalternativ för att visa topplistan i terminalen.

Du bör ha jobbat igenom Kmom03 eller ha motsvarande kunskaper.

Projektet som du skapar ska heta Dice100 och det skapar du i kmom03 katalogen. Kopiera in de klasser du redan har från kmom02 och lägg dem under kmom03/Dice100/src.

Klassen AsciiArt innehåller bilder på tärningarna som kan användas för att göra det lite roligare i terminalen. Ladda ner klassen AsciiArt och lägg den i katalogen “kmom03/Dice100/src”. Uppdatera namespace till Dice100.src.

Ladda ner filen AsciiArt.cs. Stå i katalogen kmom03/Dice100.
task download-code -- kmom03/AsciiArt.cs
cp ../codeExamples/AsciiArt.cs src/
ls src
// ger följande: AsciiArt.cs Menu.cs Round.cs Die.cs Game.cs

Huvudprogrammet, Program.cs, använder bara menyklassen och ska starta menyn.

  1. Lägg varje klasser i en egen fil.

  2. All in- och utmatning ska ske i klassen Menu. Ta bort metoden PrintRound i klassen Round.

  3. Gör det möjligt att mata in ett namn samt antalet tärningar som spelet ska använda. Inmatning ska ske via terminalen. Gör en publik metod InitGame på klassen Menu som hälsar välkommen. Välkomstmeddelandet ska innehålla namnet på spelet, namnet som matades in och antalet tärningar som valdes.

  4. Skapa ett exception NumberOfDieException som ska kastas om du försöker sätta antalet tärningar på Game-objektet till ett värde som är mindre än 2 och större än 10. Vad ska hända om spelaren matar in för många eller för få tärningar? Ett bra sätt är att låta användaren mata in tills värdet blir ok.
    Ett tips: klassen Game vet hur många tärningar som är ok och bör vara den som kastar ett exception om antalet inte är ok. Gör en metod public bool SetGameValues(int noOfDice, string name) i klassen Game, som sätter namn och antal tärningar. Ett exception som innehåller delsträngen “vara 2 eller fler” om talet är för litet och “vara 10 eller färre” om talet är för stort ska kastas. Glöm inte att fånga de undantag/exception som kan kastas! Om allt går bra så returnerar SetGameValues true, annars false.

  5. Testa genom att köra menyprogrammet och mata in för många respektive för få tärningar och kontrollera att undantag/exception kastas och fångas. Testa också att det funkar att mata in ett ok värde.

  6. Gör en topplista som sparar resultaten för antal tärningar, namn, poäng och antal rundor. Detta gör du lämpligen med en sträng som du sparar till en fil toplist.txt efter varje runda.
    Testerna förväntar sig minst 3 rader (kör spelet minst 3 gånger) och att det på varje rad i filen toplist.txt finns en sträng med formatet <antal tärningar>, <namn>, <poäng>, <antal rundor>.
    Exempel: 5, Kalle Karlsson, 103, 5
    Gör en egen klass FileHandler enligt:

Image description
Bild: Klassdiagram FileHandler
  1. Gör ett menyalternativ för att visa topplistan. Presentera en lista och sortera efter minst antal rundor. Topplistan kan se så här:
Topplistan för Dice100
Antal rundor Namn Antal tärningar Total poäng
5 Pelle 4 102
8 Kalle 5 103
10 Nisse 4 115
  1. Beskriv relationerna mellan alla objekten i ett klassdiagram med kardinalitet. Lägg gärna in text/textrutor med förklaringar på hur du tänker med relationer och kardinalitet. Lämna in diagrammet i filen classdiagram.pdf eller classdiagram.png. Diagrammet kan ritas i ritprogram eller på ett papper som du tar kort på.

  2. Skriv 3-5 rader om hur du hade delat upp klasser och objekt och dess relationer om du hade fått bestämma själv. Dice100 ska ha minst samma funktionalitet som i kmom03. Tips på tankar: Om du lägger till en klass som hanterar tärningar, ska tärningen själv ha sin bild, ska Game äga Menu (anpassning till olika språk), annan funktionalitet, ska det finnas en klass Spelare etc. Skriv meningarna i Canvasinlämningen.

Så här kan det se ut när det är klart.

Play
  1. Gör så att flera spelare kan spela mot varandra.

  2. Spara olika topplistor för 1 tärning, 2 tärningar och så vidare. Presentera dessutom sannolikheten att få en 1:a för varje topplista.

  3. Gör så att antalet rundor är begränsat. Vid start av spelet får användaren välja både antal tärningar och maximala antalet rundor. Om maximala antalet rundor är 7 så måste användaren komma upp till 100 poäng på 7 rundor, därefter blir det “game over”.

Testa din kod genom att köra igenom ditt menyprogram och kontrollera att det fungera som det ska. Därefter kontrollerar du att testerna i testprojektet går igenom vilket innebär att dina klasser fungerar som de ska.
Du hämtar enhetstesterna så här:

Terminal window
task download-tests -- kmom03

Då ser det ut så här:

Terminal window
pwd // stå i kmom03
tree -L 2
.
├── Dice100
│   ├── Dice100.csproj
│   ├── Program.cs
│   ├── src
│   ├── bin
│   └── obj
├── Dice100.Tests
│   ├── Dice100.Tests.csproj
│   ├── DieTest.cs
│   ├── FileHandlerTest.cs
│   ├── GameTest.cs
│   ├── GeneralTest.cs
│   ├── MenuTest.cs
│   ├── RoundTest.cs
│   ├── TestData
├── classdiagram.pdf

Titta i filen “Dice100.Tests.csproj” och se om den pekar ut rätt klasser att testa. Den ska peka ut klasserna som ska testas genom att referera till projektfilen “Dice100.csproj”. Kör testerna:

Terminal window
pwd // stå i kmom03/Dice100.Tests
dotnet test
dotnet test --logger "console;verbosity=normal" // mer information

Hoppas alla tester går igenom! Lycka till!

Ta bort debugutskrifter och sätt antalet tärningar och målpoäng så att det stämmer med kraven.

Felsöka med hjälp av utskrifter av Console.WriteLine(). Använd gärna debugger i VS Code.

Glöm inte att använda ‘dotnet format’ för att formatera din kod.

Lycka till och hojta till i forumet om du behöver hjälp!