From 5da07f009febcc3951020ac329de9b48b7cb1aa9 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Fri, 12 Jul 2024 16:10:15 +0100 Subject: [PATCH 01/36] Tests --- build.sbt | 2 +- src/main/scala/GuessWhoGame/Plan1.sc | 2 ++ src/main/scala/GuessWhoGame/Tests.scala | 48 +++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/GuessWhoGame/Tests.scala diff --git a/build.sbt b/build.sbt index 6834d12..d8d1c0a 100644 --- a/build.sbt +++ b/build.sbt @@ -12,4 +12,4 @@ lazy val root = (project in file(".")) libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.19" % Test, "org.scalactic" %% "scalactic" % "3.2.19", -) \ No newline at end of file +) diff --git a/src/main/scala/GuessWhoGame/Plan1.sc b/src/main/scala/GuessWhoGame/Plan1.sc index 7e2897a..46ff1f1 100644 --- a/src/main/scala/GuessWhoGame/Plan1.sc +++ b/src/main/scala/GuessWhoGame/Plan1.sc @@ -5,3 +5,5 @@ // def revealSecretCharacter: Character = selectedCharacter + + diff --git a/src/main/scala/GuessWhoGame/Tests.scala b/src/main/scala/GuessWhoGame/Tests.scala new file mode 100644 index 0000000..19a87a5 --- /dev/null +++ b/src/main/scala/GuessWhoGame/Tests.scala @@ -0,0 +1,48 @@ +package GuessWhoGame + +import org.scalatest.flatspec.FlatSpec +import org.scalatest.matchers.should.Matchers._ + +class CharacterSpec extends FlatSpec { + val characters = List( + Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), + Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), + Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), + Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), + Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), + Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), + Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), + Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), + Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), + Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), + Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), + Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), + Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + ) + + "Character" should "initialise with 20 characters on the board" in { + val game = new GuessWhoGame(characters) + game.getRemainingCharacters.size shouldEqual 20 + } + + "GuessWhoGame" should "eliminate characters correctly based on questions" in { + val game = new GuessWhoGame(characters) + game.askQuestion(_.gender == "male") + game.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "check win condition correctly" in { + val game = new GuessWhoGame(characters) + while (game.getRemainingCharacters.size > 1) { + game.askQuestion(_.gender == "male") // adjust questions as needed + } + game.checkWinCondition shouldBe true + } +} From ad25235a2d36a4f45840efdab9c10c7efe26f1ab Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 09:36:06 +0100 Subject: [PATCH 02/36] Added planning notes for today's actions --- src/main/scala/GuessWhoGame/Plan1.sc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/scala/GuessWhoGame/Plan1.sc b/src/main/scala/GuessWhoGame/Plan1.sc index 9583fe1..ac266aa 100644 --- a/src/main/scala/GuessWhoGame/Plan1.sc +++ b/src/main/scala/GuessWhoGame/Plan1.sc @@ -5,3 +5,16 @@ // def revealSecretCharacter: GuessWhoGame.Character = selectedCharacter +//First thing Monday: + //Make sure the selected character is being selected + //Make sure the selected character is still represented on the game board + //Take input questions + //Amend list based on input questions + +//4. TDD + //- Write tests for each part of the logic + //- Test character creation with attributes + //- Test random selection + //- Test Yes/No Questions + //- Test state changes of the board after each questions + //- Test conditions in which the game ends \ No newline at end of file From 9be750ee15124cf2e4854e357269121cfcba2395 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 10:05:16 +0100 Subject: [PATCH 03/36] Testing suite debugging --- src/main/scala/GuessWhoGame/Plan1.sc | 1 + .../GuessWhoGameSpec/CharacterSpec.scala | 4 +-- .../GuessWhoGameSpec/GameBoardSpec.scala | 4 ++- .../GuessWhoGameSpec/GameLogicSpec.scala | 28 ++++++++++++++++++- .../scala/GuessWhoGameSpec/GameSpec.scala | 3 +- .../GuessWhoGameSpec/QuestionsSpec.scala | 4 +-- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Plan1.sc b/src/main/scala/GuessWhoGame/Plan1.sc index 5879c77..ed12cbe 100644 --- a/src/main/scala/GuessWhoGame/Plan1.sc +++ b/src/main/scala/GuessWhoGame/Plan1.sc @@ -11,6 +11,7 @@ //Make sure the selected character is still represented on the game board //Take input questions //Amend list based on input questions + //Triggering end result //4. TDD //- Write tests for each part of the logic diff --git a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala index 4156ea4..c8a8866 100644 --- a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala @@ -1,6 +1,6 @@ -import org.scalatest.FlatSpec +import org.scalatest.flatspec.AnyFlatSpec -class CharacterSpec extends FlatSpec { +class CharacterSpec extends AnyFlatSpec { "GuessWhoGame.Character" should "initialise with 20 characters on the board" in { val totalChars = Characters.size assert(GuessWhoGame.gameBoard.size == 20) diff --git a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala b/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala index e612509..9ffaae6 100644 --- a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala @@ -1,5 +1,7 @@ package GuessWhoGameSpec +import org.scalatest.flatspec.AnyFlatSpec -class GameBoardSpec { + +class GameBoardSpec extends AnyFlatSpec { } diff --git a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala index ab2f50f..a3d3f54 100644 --- a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala @@ -1,5 +1,31 @@ package GuessWhoGameSpec +import org.scalatest.flatspec +import org.scalatest.flatspec.AnyFlatSpec -class GameLogicSpec { +class GameLogicSpec extends AnyFlatSpec { } + + +//class GameLogic (characters: List[Character]) { +// private val board = new GameBoard(characters) +// private val selectedCharacter = selectRandomCharacter(characters) +// +// private def selectRandomCharacter(characters: List[Character]): Character = { +// characters(Random.nextInt(characters.size)) +// } +// +// def askQuestion(question: Character => Boolean): Boolean = { +// val answer = question(selectedCharacter) +// board.getRemainingCharacters.foreach { character => +// if (question(character) != answer) board.eliminateCharacter(character) +// } +// answer +// } +// +// def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 +// +// def getSelectedCharacter: Character = selectedCharacter +// +// def getRemainingCharacters: List[Character] = board.getRemainingCharacters +//} diff --git a/src/test/scala/GuessWhoGameSpec/GameSpec.scala b/src/test/scala/GuessWhoGameSpec/GameSpec.scala index e2e3897..8d8fcdc 100644 --- a/src/test/scala/GuessWhoGameSpec/GameSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameSpec.scala @@ -1,5 +1,6 @@ package GuessWhoGameSpec +import org.scalatest.flatspec.AnyFlatSpec -object GameSpec { +object GameSpec extends AnyFlatSpec { } diff --git a/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala b/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala index fb3bcee..77ee96e 100644 --- a/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala @@ -1,4 +1,4 @@ -import org.scalatest.FlatSpec +import org.scalatest.flatspec.AnyFlatSpec /** //naming convention: same as file with spec at the end @@ -10,7 +10,7 @@ import org.scalatest.FlatSpec } //however sometimes we want it to fail. */ -class QuestionsSpec extends FlatSpec{ +class QuestionsSpec extends AnyFlatSpec { } From 569c5ea1f6150597182158e3405b421443e679f3 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 10:27:42 +0100 Subject: [PATCH 04/36] Code for selecting character from gameboard added --- src/main/scala/GuessWhoGame/GameLogic.scala | 24 +++++++++++++------ .../GuessWhoGame/runthroughTestingGround.sc | 18 ++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala index cf1aa6b..067180a 100644 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ b/src/main/scala/GuessWhoGame/GameLogic.scala @@ -6,14 +6,25 @@ import scala.util.Random //ask question //end game/win condition -class GameLogic (characters: List[Character]) { - private val board = new GameBoard(characters) - private val selectedCharacter = selectRandomCharacter(characters) +class GameLogic (board: Board) { + private val selectedCharacter = selectRandomCharacter(board.Characters) - private def selectRandomCharacter(characters: List[Character]): Character = { - characters(Random.nextInt(characters.size)) - } + private def selectRandomCharacter(characters: List[Character]): Character = { + characters(Random.nextInt(characters.size)) + } + + def getSelectedCharacter: Character = selectedCharacter + + //Testing only, delete once game running clearly + def printSelectedCharacter(): Unit = { + println(selectedCharacter.name) + } + //ABOVE = TESTING ONLY + + + + //Not touched yet def askQuestion(question: Character => Boolean): Boolean = { val answer = question(selectedCharacter) board.getRemainingCharacters.foreach { character => @@ -24,7 +35,6 @@ class GameLogic (characters: List[Character]) { def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 - def getSelectedCharacter: Character = selectedCharacter def getRemainingCharacters: List[Character] = board.getRemainingCharacters } diff --git a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc b/src/main/scala/GuessWhoGame/runthroughTestingGround.sc index 0ba598d..6e2156c 100644 --- a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc +++ b/src/main/scala/GuessWhoGame/runthroughTestingGround.sc @@ -1,3 +1,5 @@ +import scala.util.Random + case class Character(val name: String, val gender: String, val hairColor: String, val eyeColor: String, val wearsGlasses: Boolean, val facialHair: Boolean) case class Board (Characters: List[Character]) { @@ -33,8 +35,24 @@ gameBoard.printCharacterNames() //working so far +class GameLogic (board: Board) { + private val selectedCharacter = selectRandomCharacter(board.Characters) + private def selectRandomCharacter(characters: List[Character]): Character = { + characters(Random.nextInt(characters.size)) + } + def getSelectedCharacter: Character = selectedCharacter + //Testing only, delete once game running clearly + def printSelectedCharacter(): Unit = { + println(selectedCharacter.name) + } + //ABOVE = TESTING ONLY +} +//TESTING IN RUNTHROUGH ONLY +val gameLogic = new GameLogic(gameBoard) +gameLogic.printSelectedCharacter() +//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER \ No newline at end of file From d1576600c282e3acf6dd612252de8bf9eb64da9a Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 10:39:52 +0100 Subject: [PATCH 05/36] GameLogic tweaked --- src/main/scala/GuessWhoGame/GameLogic.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala index 067180a..9c3c308 100644 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ b/src/main/scala/GuessWhoGame/GameLogic.scala @@ -24,6 +24,9 @@ class GameLogic (board: Board) { + + + //Not touched yet def askQuestion(question: Character => Boolean): Boolean = { val answer = question(selectedCharacter) From abff432c8c5340a67e747b9566a18b8d4126c096 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 11:02:47 +0100 Subject: [PATCH 06/36] Question handling refactored --- src/main/scala/GuessWhoGame/Questions.scala | 77 ++++++++++++++++----- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Questions.scala b/src/main/scala/GuessWhoGame/Questions.scala index 89cb111..f792f9e 100644 --- a/src/main/scala/GuessWhoGame/Questions.scala +++ b/src/main/scala/GuessWhoGame/Questions.scala @@ -1,27 +1,72 @@ class Questions { - def askQuestion(attribute: String, value: Either[String, Boolean]): Unit = { + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { attribute match { case "name" => - if (selectedCharacter.name == value) remainingCharacters.filter(_.name == value) // game end here! - else remainingCharacters = remainingCharacters.filterNot(_.name == value) - //trigger game end + value match { + case Left(value) => + if (selectedCharacter.name == value) { + remainingCharacters.filter(_.name == value) // game end here! + endGame() + } else { + remainingCharacters = remainingCharacters.filterNot(_.name == value) + } + case _ => println("Invalid name value added. Try again") + } case "gender" => - if (selectedCharacter.gender == value) remainingCharacters.filter(_.gender == value) - else remainingCharacters = remainingCharacters.filterNot(_.gender == value) + value match { + case Left(value) => + if (selectedCharacter.gender == value) { + remainingCharacters.filter(_.gender == value) + } else { + remainingCharacters = remainingCharacters.filterNot(_.gender == value) + } + case _ => println("Invalid gender value added. Try again") + } case "hairColor" => - if (selectedCharacter.hairColor == value) remainingCharacters.filter(_.hairColor == value) - else remainingCharacters = remainingCharacters.filterNot(_.hairColor == value) + value match { + case Left(value) => + if (selectedCharacter.hairColor == value) { + remainingCharacters.filter(_.hairColor == value) + } + else { + remainingCharacters = remainingCharacters.filterNot(_.hairColor == value) + } + case _ => println("Invalid hair colour value added. Try again") + } case "eyeColor" => - if (selectedCharacter.eyeColor == value) remainingCharacters.filter(_.eyeColor == value) - else remainingCharacters = remainingCharacters.filterNot(_.eyeColor == value) + value match { + case Left(value) => + if (selectedCharacter.eyeColor == value) { + remainingCharacters.filter(_.eyeColor == value) + } + else { + remainingCharacters = remainingCharacters.filterNot(_.eyeColor == value) + } + case _ => println("Invalid eye colour value added. Try again") + } case "wearsGlasses" => - if (selectedCharacter.wearsGlasses == value) remainingCharacters.filter(_.wearsGlasses == value) - else remainingCharacters = remainingCharacters.filterNot(_.wearsGlasses == value) + value match { + case Right(value) => + if (selectedCharacter.wearsGlasses == value) { + remainingCharacters.filter(_.wearsGlasses == value) + } + else { + remainingCharacters = remainingCharacters.filterNot(_.wearsGlasses == value) + } + case _ => println("Invalid glasses value added. Try again") + } case "hasFacialHair" => - if (selectedCharacter.hasFacialHair == value) remainingCharacters.filter(_.hasFacialHair == value) - else remainingCharacters = remainingCharacters.filterNot(_.hasFacialHair == value) + value match { + case Right(value) => + if (selectedCharacter.hasFacialHair == value) { + remainingCharacters.filter(_.hasFacialHair == value) + } + else { + remainingCharacters = remainingCharacters.filterNot(_.hasFacialHair == value) + } + case _ => println("Invalid facial hair value added. Try again") + } - //need for an error case here?? } } -} +} \ No newline at end of file From 44b8c651f21d7c6f7f19bf42ef6b3c6f9e83ffcf Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 11:04:01 +0100 Subject: [PATCH 07/36] Tests added --- src/main/scala/GuessWhoGame/GameLogic.scala | 35 ++++------ .../GuessWhoGameSpec/CharacterSpec.scala | 46 ++++++++++++- .../GuessWhoGameSpec/GameBoardSpec.scala | 36 +++++++++- .../GuessWhoGameSpec/GameLogicSpec.scala | 66 ++++++++++++++++++- 4 files changed, 153 insertions(+), 30 deletions(-) diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala index 067180a..53ac5dd 100644 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ b/src/main/scala/GuessWhoGame/GameLogic.scala @@ -2,39 +2,26 @@ package GuessWhoGame import scala.util.Random -//start game (select character) -//ask question -//end game/win condition - -class GameLogic (board: Board) { - private val selectedCharacter = selectRandomCharacter(board.Characters) +class GuessWhoGame(characters: List[Character]) { + private val board = new GameBoard(characters) + private val selectedCharacter = selectRandomCharacter(characters) private def selectRandomCharacter(characters: List[Character]): Character = { characters(Random.nextInt(characters.size)) } - def getSelectedCharacter: Character = selectedCharacter - - //Testing only, delete once game running clearly - def printSelectedCharacter(): Unit = { - println(selectedCharacter.name) - } - //ABOVE = TESTING ONLY - - - - - //Not touched yet - def askQuestion(question: Character => Boolean): Boolean = { - val answer = question(selectedCharacter) - board.getRemainingCharacters.foreach { character => - if (question(character) != answer) board.eliminateCharacter(character) - } - answer + // The askQuestion method should take a function as a parameter + def askQuestion(question: Character => Boolean): Boolean = { + val answer = question(selectedCharacter) + board.getRemainingCharacters.foreach { character => + if (question(character) != answer) board.eliminateCharacter(character) } + answer + } def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 + def getSelectedCharacter: Character = selectedCharacter def getRemainingCharacters: List[Character] = board.getRemainingCharacters } diff --git a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala index c8a8866..a0d8ea1 100644 --- a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala @@ -1,8 +1,48 @@ +package GuessWhoGame + import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers._ class CharacterSpec extends AnyFlatSpec { - "GuessWhoGame.Character" should "initialise with 20 characters on the board" in { - val totalChars = Characters.size - assert(GuessWhoGame.gameBoard.size == 20) + val characters = List( + Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), + Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), + Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), + Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), + Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), + Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), + Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), + Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), + Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), + Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), + Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), + Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), + Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + ) + + "GuessWhoGame" should "initialise with 20 characters on the board" in { + val game = new GuessWhoGame(characters) + game.getRemainingCharacters.size shouldEqual 20 + } + + it should "eliminate characters correctly based on questions" in { + val game = new GuessWhoGame(characters) + game.askQuestion(_.gender == "male") + game.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "check win condition correctly" in { + val game = new GuessWhoGame(characters) + while (game.getRemainingCharacters.size > 1) { + game.askQuestion(_.gender == "male") // adjust questions as needed + } + game.checkWinCondition shouldBe true } } diff --git a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala b/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala index 9ffaae6..6241450 100644 --- a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala @@ -1,7 +1,41 @@ package GuessWhoGameSpec -import org.scalatest.flatspec.AnyFlatSpec +import GuessWhoGame._ +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers._ class GameBoardSpec extends AnyFlatSpec { + val characters = List( + Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + ) + + "GameBoard" should "initialize with the provided characters" in { + val gameBoard = new GameBoard(characters) + gameBoard.getRemainingCharacters shouldEqual characters + } + + it should "eliminate a character correctly" in { + val gameBoard = new GameBoard(characters) + val characterToEliminate = characters.head + gameBoard.eliminateCharacter(characterToEliminate) + gameBoard.getRemainingCharacters should not contain characterToEliminate + gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) + } + + it should "reset the board correctly" in { + val gameBoard = new GameBoard(characters) + val characterToEliminate = characters.head + gameBoard.eliminateCharacter(characterToEliminate) + gameBoard.resetBoard() + gameBoard.getRemainingCharacters shouldEqual characters + } + + it should "return an empty list if all characters are eliminated" in { + val gameBoard = new GameBoard(characters) + characters.foreach(gameBoard.eliminateCharacter) + gameBoard.getRemainingCharacters shouldBe empty + } } diff --git a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala index a3d3f54..e2c6994 100644 --- a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala @@ -1,12 +1,74 @@ package GuessWhoGameSpec -import org.scalatest.flatspec + +import GuessWhoGame._ import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers._ + +class GuessWhoGameSpec extends AnyFlatSpec { + + val characters = List( + Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), + Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), + Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), + Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), + Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), + Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), + Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), + Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), + Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), + Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), + Character("john", "male", "black", "brown", wearsGlasses = true, facialHair = false), + Character("kate", "female", "blonde", "green", wearsGlasses = false, facialHair = true), + Character("mike", "male", "brown", "blue", wearsGlasses = true, facialHair = true), + Character("lucy", "female", "black", "brown", wearsGlasses = false, facialHair = false) + ) + + "GuessWhoGame" should "initialize with the correct number of characters" in { + val game = new GuessWhoGame(characters) + game.getRemainingCharacters.size shouldEqual characters.size + } -class GameLogicSpec extends AnyFlatSpec { + it should "select a random character at the start of the game" in { + val game = new GuessWhoGame(characters) + val selectedCharacter = game.getSelectedCharacter + characters should contain(selectedCharacter) + } + it should "eliminate characters correctly based on questions" in { + val game = new GuessWhoGame(characters) + val initialSize = game.getRemainingCharacters.size + game.askQuestion(character => character.gender == "male") + val newSize = game.getRemainingCharacters.size + newSize should be < initialSize + game.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "check win condition correctly" in { + val game = new GuessWhoGame(characters) + while (game.getRemainingCharacters.size > 1) { + game.askQuestion(character => character.gender == "male") + } + game.checkWinCondition shouldBe true + } + + it should "reset the game board correctly" in { + val game = new GuessWhoGame(characters) + game.askQuestion(character => character.gender == "male") + game.getRemainingCharacters.size should be < characters.size + game.resetBoard() + game.getRemainingCharacters.size shouldEqual characters.size + } } + + //class GameLogic (characters: List[Character]) { // private val board = new GameBoard(characters) // private val selectedCharacter = selectRandomCharacter(characters) From 30d7adfcf7488f9056eaf57df9aa3a1a1931019e Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Mon, 15 Jul 2024 11:54:53 +0100 Subject: [PATCH 08/36] Refactor attempted --- src/main/scala/GuessWhoGame/Board.scala | 9 +- src/main/scala/GuessWhoGame/Game.scala | 2 + src/main/scala/GuessWhoGame/GameBoard.scala | 4 +- src/main/scala/GuessWhoGame/GameLogic.scala | 112 +++++++++++++++--- .../GuessWhoGame/runthroughTestingGround.sc | 83 ++++++++++++- 5 files changed, 183 insertions(+), 27 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 423dc52..8dd13b7 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -1,7 +1,12 @@ package GuessWhoGame -case class Board (Characters: List[Character]) { +case class Board (characters: List[Character]) { def printCharacterNames(): Unit = { - Characters.foreach(Character => println(Character.name)) + characters.foreach(Character => println(Character.name)) } + + def eliminateCharacter(character: Character): Unit = { + var remainingCharacters = characters.filterNot(_ == character) + } + } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index 10fc61c..f53ade2 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -29,6 +29,8 @@ object Game extends App { gameBoard.printCharacterNames() + + //Run example of the game //Call methods diff --git a/src/main/scala/GuessWhoGame/GameBoard.scala b/src/main/scala/GuessWhoGame/GameBoard.scala index fbd132f..48c9806 100644 --- a/src/main/scala/GuessWhoGame/GameBoard.scala +++ b/src/main/scala/GuessWhoGame/GameBoard.scala @@ -10,9 +10,7 @@ class GameBoard(val characters: List[Character]) { def getRemainingCharacters: List[Character] = remainingCharacters - def eliminateCharacter(character: Character): Unit = { - remainingCharacters = remainingCharacters.filterNot(_ == character) - } + def resetBoard(): Unit = { remainingCharacters = characters diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala index 5afe613..c65ebbf 100644 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ b/src/main/scala/GuessWhoGame/GameLogic.scala @@ -2,15 +2,14 @@ package GuessWhoGame import scala.util.Random -class GuessWhoGame(characters: List[Character]) { - private val board = new GameBoard(characters) - private val selectedCharacter = selectRandomCharacter(characters) +class GameLogic (board: Board) { + private val selectedCharacter: Character = selectRandomCharacter(board.characters) + private var remainingCharacters: List[Character] = board.characters private def selectRandomCharacter(characters: List[Character]): Character = { characters(Random.nextInt(characters.size)) } - def getSelectedCharacter: Character = selectedCharacter //Testing only, delete once game running clearly @@ -19,33 +18,110 @@ class GuessWhoGame(characters: List[Character]) { } //ABOVE = TESTING ONLY + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { + attribute match { + case "name" => + value match { + case Left(value) => + if (selectedCharacter.name == value) { + remainingCharacters.filter(_.name == value) + //endGame() + } else { + remainingCharacters.filterNot(_.name == value) + } + case _ => println("Invalid name value added. Try again") + } + case "gender" => + value match { + case Left(value) => + if (selectedCharacter.gender == value) { + remainingCharacters.filter(_.gender == value) + } else { + remainingCharacters.filterNot(_.gender == value) + } + case _ => println("Invalid gender value added. Try again") + } + case "hairColor" => + value match { + case Left(value) => + if (selectedCharacter.hairColor == value) { + remainingCharacters.filter(_.hairColor == value) + } + else { + remainingCharacters.filterNot(_.hairColor == value) + } + case _ => println("Invalid hair colour value added. Try again") + } + case "eyeColor" => + value match { + case Left(value) => + if (selectedCharacter.eyeColor == value) { + remainingCharacters.filter(_.eyeColor == value) + } + else { + remainingCharacters.filterNot(_.eyeColor == value) + } + case _ => println("Invalid eye colour value added. Try again") + } + case "wearsGlasses" => + value match { + case Right(value) => + if (selectedCharacter.wearsGlasses == value) { + remainingCharacters.filter(_.wearsGlasses == value) + } + else { + remainingCharacters.filterNot(_.wearsGlasses == value) + } + case _ => println("Invalid glasses value added. Try again") + } + case "hasFacialHair" => + value match { + case Right(value) => + if (selectedCharacter.facialHair == value) { + remainingCharacters.filter(_.facialHair == value) + } + else { + remainingCharacters.filterNot(_.facialHair == value) + } + case _ => println("Invalid facial hair value added. Try again") + } + handleQuestion("hairColor", Left("brown")) + handleQuestion("wearsGlasses", Right(true)) + handleQuestion("name", Left("joe")) + } + } +} +//TESTING IN RUNTHROUGH ONLY +val gameLogic = new GameLogic(gameBoard) +gameLogic.printSelectedCharacter() +//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER +//Not touched yet + def askQuestion(question: Character => Boolean): Boolean = { + val answer = question(selectedCharacter) + board.getRemainingCharacters.foreach { character => + if (question(character) != answer) board.eliminateCharacter(character) + } + answer - //Not touched yet + // The askQuestion method should take a function as a parameter def askQuestion(question: Character => Boolean): Boolean = { val answer = question(selectedCharacter) board.getRemainingCharacters.foreach { character => if (question(character) != answer) board.eliminateCharacter(character) + } answer - - // The askQuestion method should take a function as a parameter - def askQuestion(question: Character => Boolean): Boolean = { - val answer = question(selectedCharacter) - board.getRemainingCharacters.foreach { character => - if (question(character) != answer) board.eliminateCharacter(character) - } - answer - } - def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 + def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 - def getSelectedCharacter: Character = selectedCharacter + def getSelectedCharacter: Character = selectedCharacter - def getRemainingCharacters: List[Character] = board.getRemainingCharacters -} + def getRemainingCharacters: List[Character] = board.getRemainingCharacters + } +} \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc b/src/main/scala/GuessWhoGame/runthroughTestingGround.sc index 6e2156c..c3bcc99 100644 --- a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc +++ b/src/main/scala/GuessWhoGame/runthroughTestingGround.sc @@ -2,9 +2,9 @@ import scala.util.Random case class Character(val name: String, val gender: String, val hairColor: String, val eyeColor: String, val wearsGlasses: Boolean, val facialHair: Boolean) -case class Board (Characters: List[Character]) { +case class Board (characters: List[Character]) { def printCharacterNames(): Unit = { - Characters.foreach(Character => println(Character.name)) + characters.foreach(Character => println(Character.name)) } } @@ -36,7 +36,8 @@ gameBoard.printCharacterNames() //working so far class GameLogic (board: Board) { - private val selectedCharacter = selectRandomCharacter(board.Characters) + private val selectedCharacter: Character = selectRandomCharacter(board.characters) + private var remainingCharacters: List[Character] = board.characters private def selectRandomCharacter(characters: List[Character]): Character = { characters(Random.nextInt(characters.size)) @@ -50,9 +51,83 @@ class GameLogic (board: Board) { } //ABOVE = TESTING ONLY + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { + attribute match { + case "name" => + value match { + case Left(value) => + if (selectedCharacter.name == value) { + remainingCharacters.filter(_.name == value) + //endGame() + } else { + remainingCharacters.filterNot(_.name == value) + } + case _ => println("Invalid name value added. Try again") + } + case "gender" => + value match { + case Left(value) => + if (selectedCharacter.gender == value) { + remainingCharacters.filter(_.gender == value) + } else { + remainingCharacters.filterNot(_.gender == value) + } + case _ => println("Invalid gender value added. Try again") + } + case "hairColor" => + value match { + case Left(value) => + if (selectedCharacter.hairColor == value) { + remainingCharacters.filter(_.hairColor == value) + } + else { + remainingCharacters.filterNot(_.hairColor == value) + } + case _ => println("Invalid hair colour value added. Try again") + } + case "eyeColor" => + value match { + case Left(value) => + if (selectedCharacter.eyeColor == value) { + remainingCharacters.filter(_.eyeColor == value) + } + else { + remainingCharacters.filterNot(_.eyeColor == value) + } + case _ => println("Invalid eye colour value added. Try again") + } + case "wearsGlasses" => + value match { + case Right(value) => + if (selectedCharacter.wearsGlasses == value) { + remainingCharacters.filter(_.wearsGlasses == value) + } + else { + remainingCharacters.filterNot(_.wearsGlasses == value) + } + case _ => println("Invalid glasses value added. Try again") + } + case "hasFacialHair" => + value match { + case Right(value) => + if (selectedCharacter.facialHair == value) { + remainingCharacters.filter(_.facialHair == value) + } + else { + remainingCharacters.filterNot(_.facialHair == value) + } + case _ => println("Invalid facial hair value added. Try again") + } + handleQuestion("hairColor", Left("brown")) + handleQuestion("wearsGlasses", Right(true)) + handleQuestion("name", Left("joe")) + } + } + } //TESTING IN RUNTHROUGH ONLY val gameLogic = new GameLogic(gameBoard) gameLogic.printSelectedCharacter() -//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER \ No newline at end of file +//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER + From 3571f984c3dd8bf7a2ee56258638e98eac82f7e7 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 13:04:02 +0100 Subject: [PATCH 09/36] Team refactoring --- src/main/scala/GuessWhoGame/Board.scala | 101 +++++++++++++- src/main/scala/GuessWhoGame/GameBoard.scala | 18 --- src/main/scala/GuessWhoGame/GameLogic.scala | 132 +++--------------- .../scala/GuessWhoGame/GuessWhoGame.scala | 47 ------- src/main/scala/GuessWhoGame/Plan.sc | 24 ++++ src/main/scala/GuessWhoGame/Plan1.sc | 22 --- src/main/scala/GuessWhoGame/Questions.scala | 71 +--------- src/main/scala/GuessWhoGame/Sandbox.sc | 21 --- src/main/scala/GuessWhoGame/Tests.scala | 48 ------- .../scala/GuessWhoGameSpec/BoardSpec.scala | 88 ++++++++++++ .../GuessWhoGameSpec/CharacterSpec.scala | 16 +-- .../GuessWhoGameSpec/GameBoardSpec.scala | 41 ------ .../GuessWhoGameSpec/GameLogicSpec.scala | 77 +--------- 13 files changed, 230 insertions(+), 476 deletions(-) delete mode 100644 src/main/scala/GuessWhoGame/GameBoard.scala delete mode 100644 src/main/scala/GuessWhoGame/GuessWhoGame.scala delete mode 100644 src/main/scala/GuessWhoGame/Plan1.sc delete mode 100644 src/main/scala/GuessWhoGame/Sandbox.sc delete mode 100644 src/main/scala/GuessWhoGame/Tests.scala create mode 100644 src/test/scala/GuessWhoGameSpec/BoardSpec.scala delete mode 100644 src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 8dd13b7..5e3577c 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -1,12 +1,109 @@ package GuessWhoGame +import scala.util.Random + case class Board (characters: List[Character]) { def printCharacterNames(): Unit = { characters.foreach(Character => println(Character.name)) } - def eliminateCharacter(character: Character): Unit = { - var remainingCharacters = characters.filterNot(_ == character) + private val selectedCharacter: Character = selectRandomCharacter(characters) + private var remainingCharacters: List[Character] = characters + + private def selectRandomCharacter(characters: List[Character]): Character = { + characters(Random.nextInt(characters.size)) + } + + def getSelectedCharacter: Character = selectedCharacter + + //Testing only, delete once game running clearly + def printSelectedCharacter(): Unit = { + println(selectedCharacter.name) } + //ABOVE = TESTING ONLY + + def getRemainingCharacters: List[Character] = remainingCharacters + + def checkWinCondition: Boolean = getRemainingCharacters.size == 1 + + // def eliminateCharacter(character: Character): Unit = { + // var remainingCharacters = characters.filterNot(_ == character) + // } + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { + attribute match { + case "name" => + value match { + case Left(value) => + if (selectedCharacter.name == value) { + remainingCharacters.filter(_.name == value) + //endGame() + } else { + remainingCharacters.filterNot(_.name == value) + } + case _ => println("Invalid name value added. Try again") + } + case "gender" => + value match { + case Left(value) => + if (selectedCharacter.gender == value) { + remainingCharacters.filter(_.gender == value) + } else { + remainingCharacters.filterNot(_.gender == value) + } + case _ => println("Invalid gender value added. Try again") + } + case "hairColor" => + value match { + case Left(value) => + if (selectedCharacter.hairColor == value) { + remainingCharacters.filter(_.hairColor == value) + } + else { + remainingCharacters.filterNot(_.hairColor == value) + } + case _ => println("Invalid hair colour value added. Try again") + } + case "eyeColor" => + value match { + case Left(value) => + if (selectedCharacter.eyeColor == value) { + remainingCharacters.filter(_.eyeColor == value) + } + else { + remainingCharacters.filterNot(_.eyeColor == value) + } + case _ => println("Invalid eye colour value added. Try again") + } + case "wearsGlasses" => + value match { + case Right(value) => + if (selectedCharacter.wearsGlasses == value) { + remainingCharacters.filter(_.wearsGlasses == value) + } + else { + remainingCharacters.filterNot(_.wearsGlasses == value) + } + case _ => println("Invalid glasses value added. Try again") + } + case "hasFacialHair" => + value match { + case Right(value) => + if (selectedCharacter.facialHair == value) { + remainingCharacters.filter(_.facialHair == value) + } + else { + remainingCharacters.filterNot(_.facialHair == value) + } + case _ => println("Invalid facial hair value added. Try again") + } + handleQuestion("hairColor", Left("brown")) + handleQuestion("wearsGlasses", Right(true)) + handleQuestion("name", Left("joe")) + } + + def resetBoard(): Unit = { + remainingCharacters = characters + } + } } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/GameBoard.scala b/src/main/scala/GuessWhoGame/GameBoard.scala deleted file mode 100644 index 48c9806..0000000 --- a/src/main/scala/GuessWhoGame/GameBoard.scala +++ /dev/null @@ -1,18 +0,0 @@ -package GuessWhoGame - -//full list of characters -//printed to user -//calling the list filter function -//reprinting to adaptations - -class GameBoard(val characters: List[Character]) { - private var remainingCharacters: List[Character] = characters - - def getRemainingCharacters: List[Character] = remainingCharacters - - - - def resetBoard(): Unit = { - remainingCharacters = characters - } -} \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala index c65ebbf..bef3fba 100644 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ b/src/main/scala/GuessWhoGame/GameLogic.scala @@ -3,125 +3,25 @@ package GuessWhoGame import scala.util.Random class GameLogic (board: Board) { - private val selectedCharacter: Character = selectRandomCharacter(board.characters) - private var remainingCharacters: List[Character] = board.characters - - private def selectRandomCharacter(characters: List[Character]): Character = { - characters(Random.nextInt(characters.size)) - } - - def getSelectedCharacter: Character = selectedCharacter - - //Testing only, delete once game running clearly - def printSelectedCharacter(): Unit = { - println(selectedCharacter.name) - } - //ABOVE = TESTING ONLY - - def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { - attribute match { - case "name" => - value match { - case Left(value) => - if (selectedCharacter.name == value) { - remainingCharacters.filter(_.name == value) - //endGame() - } else { - remainingCharacters.filterNot(_.name == value) - } - case _ => println("Invalid name value added. Try again") - } - case "gender" => - value match { - case Left(value) => - if (selectedCharacter.gender == value) { - remainingCharacters.filter(_.gender == value) - } else { - remainingCharacters.filterNot(_.gender == value) - } - case _ => println("Invalid gender value added. Try again") - } - case "hairColor" => - value match { - case Left(value) => - if (selectedCharacter.hairColor == value) { - remainingCharacters.filter(_.hairColor == value) - } - else { - remainingCharacters.filterNot(_.hairColor == value) - } - case _ => println("Invalid hair colour value added. Try again") - } - case "eyeColor" => - value match { - case Left(value) => - if (selectedCharacter.eyeColor == value) { - remainingCharacters.filter(_.eyeColor == value) - } - else { - remainingCharacters.filterNot(_.eyeColor == value) - } - case _ => println("Invalid eye colour value added. Try again") - } - case "wearsGlasses" => - value match { - case Right(value) => - if (selectedCharacter.wearsGlasses == value) { - remainingCharacters.filter(_.wearsGlasses == value) - } - else { - remainingCharacters.filterNot(_.wearsGlasses == value) - } - case _ => println("Invalid glasses value added. Try again") - } - case "hasFacialHair" => - value match { - case Right(value) => - if (selectedCharacter.facialHair == value) { - remainingCharacters.filter(_.facialHair == value) - } - else { - remainingCharacters.filterNot(_.facialHair == value) - } - case _ => println("Invalid facial hair value added. Try again") - } - handleQuestion("hairColor", Left("brown")) - handleQuestion("wearsGlasses", Right(true)) - handleQuestion("name", Left("joe")) - } - } } -//TESTING IN RUNTHROUGH ONLY -val gameLogic = new GameLogic(gameBoard) -gameLogic.printSelectedCharacter() -//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER - //Not touched yet - def askQuestion(question: Character => Boolean): Boolean = { - val answer = question(selectedCharacter) - board.getRemainingCharacters.foreach { character => - if (question(character) != answer) board.eliminateCharacter(character) - } - answer - - // The askQuestion method should take a function as a parameter - def askQuestion(question: Character => Boolean): Boolean = { - val answer = question(selectedCharacter) - board.getRemainingCharacters.foreach { character => - if (question(character) != answer) board.eliminateCharacter(character) - - } - answer - } - - def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 - - def getSelectedCharacter: Character = selectedCharacter - - def getRemainingCharacters: List[Character] = board.getRemainingCharacters - } -} \ No newline at end of file +// def askQuestion(question: Character => Boolean): Boolean = { +// val answer = question(selectedCharacter) +// board.getRemainingCharacters.foreach { character => +// if (question(character) != answer) board.eliminateCharacter(character) +// } +// answer +// +// // The askQuestion method should take a function as a parameter +// def askQuestion(question: Character => Boolean): Boolean = { +// val answer = question(selectedCharacter) +// board.getRemainingCharacters.foreach { character => +// if (question(character) != answer) board.eliminateCharacter(character) +// +// } +// answer +// } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/GuessWhoGame.scala b/src/main/scala/GuessWhoGame/GuessWhoGame.scala deleted file mode 100644 index 0aef1bc..0000000 --- a/src/main/scala/GuessWhoGame/GuessWhoGame.scala +++ /dev/null @@ -1,47 +0,0 @@ -import scala.util.Random - -case class Character( - name: String, - gender: String, - hairColor: String, - eyeColor: String, - wearsGlasses: Boolean, - facialHair: Boolean - ) - -class GameBoard(val characters: List[GuessWhoGame.Character]) { - private var remainingCharacters: List[GuessWhoGame.Character] = characters - - def getRemainingCharacters: List[GuessWhoGame.Character] = remainingCharacters - - def eliminateCharacter(character: GuessWhoGame.Character): Unit = { - remainingCharacters = remainingCharacters.filterNot(_ == character) - } - - def resetBoard(): Unit = { - remainingCharacters = characters - } -} - -class GuessWhoGame(characters: List[GuessWhoGame.Character]) { - private val board = new GameBoard(characters) - private val selectedCharacter = selectRandomCharacter(characters) - - private def selectRandomCharacter(characters: List[GuessWhoGame.Character]): GuessWhoGame.Character = { - characters(Random.nextInt(characters.size)) - } - - def askQuestion(question: GuessWhoGame.Character => Boolean): Boolean = { - val answer = question(selectedCharacter) - board.getRemainingCharacters.foreach { character => - if (question(character) != answer) board.eliminateCharacter(character) - } - answer - } - - def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 - - def getSelectedCharacter: GuessWhoGame.Character = selectedCharacter - - def getRemainingCharacters: List[GuessWhoGame.Character] = board.getRemainingCharacters -} diff --git a/src/main/scala/GuessWhoGame/Plan.sc b/src/main/scala/GuessWhoGame/Plan.sc index b6098c5..4155a88 100644 --- a/src/main/scala/GuessWhoGame/Plan.sc +++ b/src/main/scala/GuessWhoGame/Plan.sc @@ -36,3 +36,27 @@ FIND THE LESSON WHERE EXTENSION WAS TALKING TO THE TERMINAL Last Step - ReadMe file + + //Game end method? + // def gameEnd: Boolean = remainingCharacters.size == 1 + + //Reveal secret character (only to support testing) + // def revealSecretCharacter: GuessWhoGame.Character = selectedCharacter + + + + //First thing Monday: + //Make sure the selected character is being selected + //Make sure the selected character is still represented on the game board + //Take input questions + //Amend list based on input questions + //Triggering end result + + //4. TDD + //- Write tests for each part of the logic + //- Test character creation with attributes + //- Test random selection + //- Test Yes/No Questions + //- Test state changes of the board after each questions + //- Test conditions in which the game ends + diff --git a/src/main/scala/GuessWhoGame/Plan1.sc b/src/main/scala/GuessWhoGame/Plan1.sc deleted file mode 100644 index ed12cbe..0000000 --- a/src/main/scala/GuessWhoGame/Plan1.sc +++ /dev/null @@ -1,22 +0,0 @@ -//Game end method? -// def gameEnd: Boolean = remainingCharacters.size == 1 - -//Reveal secret character (only to support testing) -// def revealSecretCharacter: GuessWhoGame.Character = selectedCharacter - - - -//First thing Monday: - //Make sure the selected character is being selected - //Make sure the selected character is still represented on the game board - //Take input questions - //Amend list based on input questions - //Triggering end result - -//4. TDD - //- Write tests for each part of the logic - //- Test character creation with attributes - //- Test random selection - //- Test Yes/No Questions - //- Test state changes of the board after each questions - //- Test conditions in which the game ends diff --git a/src/main/scala/GuessWhoGame/Questions.scala b/src/main/scala/GuessWhoGame/Questions.scala index f792f9e..fecd4df 100644 --- a/src/main/scala/GuessWhoGame/Questions.scala +++ b/src/main/scala/GuessWhoGame/Questions.scala @@ -1,72 +1,3 @@ class Questions { - def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { - attribute match { - case "name" => - value match { - case Left(value) => - if (selectedCharacter.name == value) { - remainingCharacters.filter(_.name == value) // game end here! - endGame() - } else { - remainingCharacters = remainingCharacters.filterNot(_.name == value) - } - case _ => println("Invalid name value added. Try again") - } - case "gender" => - value match { - case Left(value) => - if (selectedCharacter.gender == value) { - remainingCharacters.filter(_.gender == value) - } else { - remainingCharacters = remainingCharacters.filterNot(_.gender == value) - } - case _ => println("Invalid gender value added. Try again") - } - case "hairColor" => - value match { - case Left(value) => - if (selectedCharacter.hairColor == value) { - remainingCharacters.filter(_.hairColor == value) - } - else { - remainingCharacters = remainingCharacters.filterNot(_.hairColor == value) - } - case _ => println("Invalid hair colour value added. Try again") - } - case "eyeColor" => - value match { - case Left(value) => - if (selectedCharacter.eyeColor == value) { - remainingCharacters.filter(_.eyeColor == value) - } - else { - remainingCharacters = remainingCharacters.filterNot(_.eyeColor == value) - } - case _ => println("Invalid eye colour value added. Try again") - } - case "wearsGlasses" => - value match { - case Right(value) => - if (selectedCharacter.wearsGlasses == value) { - remainingCharacters.filter(_.wearsGlasses == value) - } - else { - remainingCharacters = remainingCharacters.filterNot(_.wearsGlasses == value) - } - case _ => println("Invalid glasses value added. Try again") - } - case "hasFacialHair" => - value match { - case Right(value) => - if (selectedCharacter.hasFacialHair == value) { - remainingCharacters.filter(_.hasFacialHair == value) - } - else { - remainingCharacters = remainingCharacters.filterNot(_.hasFacialHair == value) - } - case _ => println("Invalid facial hair value added. Try again") - } - } - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/Sandbox.sc b/src/main/scala/GuessWhoGame/Sandbox.sc deleted file mode 100644 index 09519ad..0000000 --- a/src/main/scala/GuessWhoGame/Sandbox.sc +++ /dev/null @@ -1,21 +0,0 @@ - -//package GuessWhoGame - -class GameBoard(val characters: List[Character]) { - private var remainingCharacters: List[Character] = characters - - def getRemainingCharacters: List[Character] = remainingCharacters - - def printGameBoard(): Unit = { - println("Remaining Characters:") - characters.foreach(character => println(character.name)) - } - - def eliminateCharacter(character: Character): Unit = { - remainingCharacters = remainingCharacters.filterNot(_ == character) - } - - def resetBoard(): Unit = { - remainingCharacters = characters - } -} diff --git a/src/main/scala/GuessWhoGame/Tests.scala b/src/main/scala/GuessWhoGame/Tests.scala deleted file mode 100644 index 19a87a5..0000000 --- a/src/main/scala/GuessWhoGame/Tests.scala +++ /dev/null @@ -1,48 +0,0 @@ -package GuessWhoGame - -import org.scalatest.flatspec.FlatSpec -import org.scalatest.matchers.should.Matchers._ - -class CharacterSpec extends FlatSpec { - val characters = List( - Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), - Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), - Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), - Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), - Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), - Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), - Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), - Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), - Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), - Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), - Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), - Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), - Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) - ) - - "Character" should "initialise with 20 characters on the board" in { - val game = new GuessWhoGame(characters) - game.getRemainingCharacters.size shouldEqual 20 - } - - "GuessWhoGame" should "eliminate characters correctly based on questions" in { - val game = new GuessWhoGame(characters) - game.askQuestion(_.gender == "male") - game.getRemainingCharacters.forall(_.gender == "male") shouldBe true - } - - it should "check win condition correctly" in { - val game = new GuessWhoGame(characters) - while (game.getRemainingCharacters.size > 1) { - game.askQuestion(_.gender == "male") // adjust questions as needed - } - game.checkWinCondition shouldBe true - } -} diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala new file mode 100644 index 0000000..54c21b7 --- /dev/null +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -0,0 +1,88 @@ +package GuessWhoGameSpec + +import GuessWhoGame._ +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers._ + +class BoardSpec extends AnyFlatSpec { + + val characters = List( + Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + ) + + //prints out characters onto the board + "GameBoard" should "initialise with the provided characters" in { + val gameBoard = new Board(characters) + gameBoard.getRemainingCharacters shouldEqual characters + } + + // Selects a character + +// it should "select a random character at the start of the game" in { +// val game = new Board(characters) +// val selectedCharacter = getSelectedCharacter +// } +// +// it should "keep the character in the list" in { +// val game = new Board(characters) +// val selectedCharacter = gameLogic.getSelectedCharacter +// characters should contain(selectedCharacter) +// } + + // Stores remaining characters + + //Watches for the win condition + +// it should "check win condition correctly" in { +// val game = new Board(characters) +// while (game.getRemainingCharacters.size > 1) { +// gameLogic.askQuestion(_.gender == "male") +// } +// game.checkWinCondition shouldBe true +// } + + //Handles questions, rerenders based on question result + +// it should "eliminate characters correctly based on questions" in { +// val game = new Board(characters) +// val initialSize = game.getRemainingCharacters.size +// gameLogic.handleQuestion(character => character.gender == "male") +// val newSize = game.getRemainingCharacters.size +// newSize should be < initialSize +// game.getRemainingCharacters.forall(_.gender == "male") shouldBe true +// } +// +// it should "eliminate characters correctly based on questions" in { +// val game = new Board(characters) +// gameLogic.handleQuestion(_.gender == "male") +// board.getRemainingCharacters.forall(_.gender == "male") shouldBe true +// } + + // Updates based on filters applied to questions + + //Resets board +// it should "reset the game board correctly" in { +// val game = new Board(characters) +// gameLogic.handleQuestion(character => character.gender == "male") +// game.getRemainingCharacters.size should be < characters.size +// game.resetBoard() +// game.getRemainingCharacters.size shouldEqual characters.size +// } +// +// // to revisit if needed +// it should "eliminate a character correctly" in { +// val gameBoard = new Board(characters) +// val characterToEliminate = characters.head +// gameBoard.eliminateCharacter(characterToEliminate) +// gameBoard.getRemainingCharacters should not contain characterToEliminate +// gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) +// } +// +// it should "return an empty list if all characters are eliminated" in { +// val gameBoard = Board(characters) +// characters.foreach(gameBoard.eliminateCharacter) +// gameBoard.getRemainingCharacters shouldBe empty +// } +} diff --git a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala index a0d8ea1..58b19d6 100644 --- a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala @@ -28,21 +28,7 @@ class CharacterSpec extends AnyFlatSpec { ) "GuessWhoGame" should "initialise with 20 characters on the board" in { - val game = new GuessWhoGame(characters) + val game = new Board(characters) game.getRemainingCharacters.size shouldEqual 20 } - - it should "eliminate characters correctly based on questions" in { - val game = new GuessWhoGame(characters) - game.askQuestion(_.gender == "male") - game.getRemainingCharacters.forall(_.gender == "male") shouldBe true - } - - it should "check win condition correctly" in { - val game = new GuessWhoGame(characters) - while (game.getRemainingCharacters.size > 1) { - game.askQuestion(_.gender == "male") // adjust questions as needed - } - game.checkWinCondition shouldBe true - } } diff --git a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala b/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala deleted file mode 100644 index 6241450..0000000 --- a/src/test/scala/GuessWhoGameSpec/GameBoardSpec.scala +++ /dev/null @@ -1,41 +0,0 @@ -package GuessWhoGameSpec - -import GuessWhoGame._ -import org.scalatest.flatspec.AnyFlatSpec -import org.scalatest.matchers.should.Matchers._ - -class GameBoardSpec extends AnyFlatSpec { - - val characters = List( - Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) - ) - - "GameBoard" should "initialize with the provided characters" in { - val gameBoard = new GameBoard(characters) - gameBoard.getRemainingCharacters shouldEqual characters - } - - it should "eliminate a character correctly" in { - val gameBoard = new GameBoard(characters) - val characterToEliminate = characters.head - gameBoard.eliminateCharacter(characterToEliminate) - gameBoard.getRemainingCharacters should not contain characterToEliminate - gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) - } - - it should "reset the board correctly" in { - val gameBoard = new GameBoard(characters) - val characterToEliminate = characters.head - gameBoard.eliminateCharacter(characterToEliminate) - gameBoard.resetBoard() - gameBoard.getRemainingCharacters shouldEqual characters - } - - it should "return an empty list if all characters are eliminated" in { - val gameBoard = new GameBoard(characters) - characters.foreach(gameBoard.eliminateCharacter) - gameBoard.getRemainingCharacters shouldBe empty - } -} diff --git a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala index e2c6994..3650728 100644 --- a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala @@ -9,85 +9,10 @@ class GuessWhoGameSpec extends AnyFlatSpec { val characters = List( Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), - Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), - Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), - Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), - Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), - Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), - Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), - Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), - Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), - Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), - Character("john", "male", "black", "brown", wearsGlasses = true, facialHair = false), - Character("kate", "female", "blonde", "green", wearsGlasses = false, facialHair = true), - Character("mike", "male", "brown", "blue", wearsGlasses = true, facialHair = true), - Character("lucy", "female", "black", "brown", wearsGlasses = false, facialHair = false) + Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) ) - - "GuessWhoGame" should "initialize with the correct number of characters" in { - val game = new GuessWhoGame(characters) - game.getRemainingCharacters.size shouldEqual characters.size - } - - it should "select a random character at the start of the game" in { - val game = new GuessWhoGame(characters) - val selectedCharacter = game.getSelectedCharacter - characters should contain(selectedCharacter) - } - - it should "eliminate characters correctly based on questions" in { - val game = new GuessWhoGame(characters) - val initialSize = game.getRemainingCharacters.size - game.askQuestion(character => character.gender == "male") - val newSize = game.getRemainingCharacters.size - newSize should be < initialSize - game.getRemainingCharacters.forall(_.gender == "male") shouldBe true - } - - it should "check win condition correctly" in { - val game = new GuessWhoGame(characters) - while (game.getRemainingCharacters.size > 1) { - game.askQuestion(character => character.gender == "male") - } - game.checkWinCondition shouldBe true - } - - it should "reset the game board correctly" in { - val game = new GuessWhoGame(characters) - game.askQuestion(character => character.gender == "male") - game.getRemainingCharacters.size should be < characters.size - game.resetBoard() - game.getRemainingCharacters.size shouldEqual characters.size - } } -//class GameLogic (characters: List[Character]) { -// private val board = new GameBoard(characters) -// private val selectedCharacter = selectRandomCharacter(characters) -// -// private def selectRandomCharacter(characters: List[Character]): Character = { -// characters(Random.nextInt(characters.size)) -// } -// -// def askQuestion(question: Character => Boolean): Boolean = { -// val answer = question(selectedCharacter) -// board.getRemainingCharacters.foreach { character => -// if (question(character) != answer) board.eliminateCharacter(character) -// } -// answer -// } -// -// def checkWinCondition: Boolean = board.getRemainingCharacters.size == 1 -// -// def getSelectedCharacter: Character = selectedCharacter -// -// def getRemainingCharacters: List[Character] = board.getRemainingCharacters -//} From 69c1f53129ebdbe395b7c082442316f7536aa56a Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 15:11:05 +0100 Subject: [PATCH 10/36] Initialisation tests --- src/main/scala/GuessWhoGame/Board.scala | 12 +- .../scala/GuessWhoGameSpec/BoardSpec.scala | 117 +++++++++--------- 2 files changed, 63 insertions(+), 66 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 5e3577c..39668ef 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -7,10 +7,10 @@ case class Board (characters: List[Character]) { characters.foreach(Character => println(Character.name)) } - private val selectedCharacter: Character = selectRandomCharacter(characters) - private var remainingCharacters: List[Character] = characters + val selectedCharacter: Character = selectRandomCharacter(characters) + var remainingCharacters: List[Character] = characters - private def selectRandomCharacter(characters: List[Character]): Character = { + def selectRandomCharacter(characters: List[Character]): Character = { characters(Random.nextInt(characters.size)) } @@ -27,9 +27,9 @@ case class Board (characters: List[Character]) { def checkWinCondition: Boolean = getRemainingCharacters.size == 1 - // def eliminateCharacter(character: Character): Unit = { - // var remainingCharacters = characters.filterNot(_ == character) - // } + def eliminateCharacter(character: Character): Unit = { + var remainingCharacters = characters.filterNot(_ == character) + } def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { attribute match { case "name" => diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index 54c21b7..e7de1a5 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -13,76 +13,73 @@ class BoardSpec extends AnyFlatSpec { ) //prints out characters onto the board - "GameBoard" should "initialise with the provided characters" in { - val gameBoard = new Board(characters) - gameBoard.getRemainingCharacters shouldEqual characters - } + "gameBoard" should "initialise with the provided characters" in { + val gameBoard = new Board(characters) + gameBoard.getRemainingCharacters shouldEqual characters + } // Selects a character -// it should "select a random character at the start of the game" in { -// val game = new Board(characters) -// val selectedCharacter = getSelectedCharacter -// } -// -// it should "keep the character in the list" in { -// val game = new Board(characters) -// val selectedCharacter = gameLogic.getSelectedCharacter -// characters should contain(selectedCharacter) -// } + it should "select a random character at the start of the game and keeps this character in the list" in { + val gameBoard = new Board(characters) + characters should contain(gameBoard.getSelectedCharacter) + gameBoard.getSelectedCharacter shouldEqual (gameBoard.selectedCharacter) + //assert(gameBoard.selectRandomCharacter(characters: List[Character]) == gameBoard.selectedCharacter) + } // Stores remaining characters - //Watches for the win condition + //Watches for the win condition -// it should "check win condition correctly" in { -// val game = new Board(characters) -// while (game.getRemainingCharacters.size > 1) { -// gameLogic.askQuestion(_.gender == "male") -// } -// game.checkWinCondition shouldBe true -// } + it should "check win condition correctly" in { + val gameBoard = new Board(characters) + if (characters.size <= 1) { + assert(gameBoard.checkWinCondition) + } else { + assert(!gameBoard.checkWinCondition) + } + } - //Handles questions, rerenders based on question result + //Handles questions, rerenders based on question result -// it should "eliminate characters correctly based on questions" in { -// val game = new Board(characters) -// val initialSize = game.getRemainingCharacters.size -// gameLogic.handleQuestion(character => character.gender == "male") -// val newSize = game.getRemainingCharacters.size -// newSize should be < initialSize -// game.getRemainingCharacters.forall(_.gender == "male") shouldBe true -// } -// -// it should "eliminate characters correctly based on questions" in { -// val game = new Board(characters) -// gameLogic.handleQuestion(_.gender == "male") -// board.getRemainingCharacters.forall(_.gender == "male") shouldBe true -// } + // it should "eliminate characters correctly based on questions" in { + // val game = new Board(characters) + // val initialSize = game.getRemainingCharacters.size + // gameLogic.handleQuestion(character => character.gender == "male") + // val newSize = game.getRemainingCharacters.size + // newSize should be < initialSize + // game.getRemainingCharacters.forall(_.gender == "male") shouldBe true + // } + // + // it should "eliminate characters correctly based on questions" in { + // val game = new Board(characters) + // gameLogic.handleQuestion(_.gender == "male") + // board.getRemainingCharacters.forall(_.gender == "male") shouldBe true + // } // Updates based on filters applied to questions - //Resets board -// it should "reset the game board correctly" in { -// val game = new Board(characters) -// gameLogic.handleQuestion(character => character.gender == "male") -// game.getRemainingCharacters.size should be < characters.size -// game.resetBoard() -// game.getRemainingCharacters.size shouldEqual characters.size -// } -// -// // to revisit if needed -// it should "eliminate a character correctly" in { -// val gameBoard = new Board(characters) -// val characterToEliminate = characters.head -// gameBoard.eliminateCharacter(characterToEliminate) -// gameBoard.getRemainingCharacters should not contain characterToEliminate -// gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) -// } -// -// it should "return an empty list if all characters are eliminated" in { -// val gameBoard = Board(characters) -// characters.foreach(gameBoard.eliminateCharacter) -// gameBoard.getRemainingCharacters shouldBe empty -// } + //Resets board + // it should "reset the game board correctly" in { + // val game = new Board(characters) + // gameLogic.handleQuestion(character => character.gender == "male") + // game.getRemainingCharacters.size should be < characters.size + // game.resetBoard() + // game.getRemainingCharacters.size shouldEqual characters.size + // } + // + // // to revisit if needed + // it should "eliminate a character correctly" in { + // val gameBoard = new Board(characters) + // val characterToEliminate = characters.head + // gameBoard.eliminateCharacter(characterToEliminate) + // gameBoard.getRemainingCharacters should not contain characterToEliminate + // gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) + // } + // + // it should "return an empty list if all characters are eliminated" in { + // val gameBoard = Board(characters) + // characters.foreach(gameBoard.eliminateCharacter) + // gameBoard.getRemainingCharacters shouldBe empty + // } } From 8e7a77304282c79ba2e8fa9c1790071bd5645644 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 15:29:15 +0100 Subject: [PATCH 11/36] Handles questions test --- src/main/scala/GuessWhoGame/Board.scala | 11 +++++--- .../scala/GuessWhoGameSpec/BoardSpec.scala | 28 +++++++++---------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 39668ef..5757ae1 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -31,7 +31,7 @@ case class Board (characters: List[Character]) { var remainingCharacters = characters.filterNot(_ == character) } def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { - attribute match { + remainingCharacters = attribute match { case "name" => value match { case Left(value) => @@ -42,6 +42,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.name == value) } case _ => println("Invalid name value added. Try again") + remainingCharacters } case "gender" => value match { @@ -52,6 +53,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.gender == value) } case _ => println("Invalid gender value added. Try again") + remainingCharacters } case "hairColor" => value match { @@ -63,6 +65,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.hairColor == value) } case _ => println("Invalid hair colour value added. Try again") + remainingCharacters } case "eyeColor" => value match { @@ -74,6 +77,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.eyeColor == value) } case _ => println("Invalid eye colour value added. Try again") + remainingCharacters } case "wearsGlasses" => value match { @@ -85,6 +89,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.wearsGlasses == value) } case _ => println("Invalid glasses value added. Try again") + remainingCharacters } case "hasFacialHair" => value match { @@ -96,10 +101,8 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.facialHair == value) } case _ => println("Invalid facial hair value added. Try again") + remainingCharacters } - handleQuestion("hairColor", Left("brown")) - handleQuestion("wearsGlasses", Right(true)) - handleQuestion("name", Left("joe")) } def resetBoard(): Unit = { diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index e7de1a5..12d2314 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -42,20 +42,20 @@ class BoardSpec extends AnyFlatSpec { //Handles questions, rerenders based on question result - // it should "eliminate characters correctly based on questions" in { - // val game = new Board(characters) - // val initialSize = game.getRemainingCharacters.size - // gameLogic.handleQuestion(character => character.gender == "male") - // val newSize = game.getRemainingCharacters.size - // newSize should be < initialSize - // game.getRemainingCharacters.forall(_.gender == "male") shouldBe true - // } - // - // it should "eliminate characters correctly based on questions" in { - // val game = new Board(characters) - // gameLogic.handleQuestion(_.gender == "male") - // board.getRemainingCharacters.forall(_.gender == "male") shouldBe true - // } + it should "eliminate characters correctly based on questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("gender", Left("male")) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + +// it should "eliminate characters correctly based on questions" in { +// val game = new Board(characters) +// gameLogic.handleQuestion(_.gender == "male") +// board.getRemainingCharacters.forall(_.gender == "male") shouldBe true +// } // Updates based on filters applied to questions From 3fcdfcfdcc49e05870d7c1ef49829cee71ab9c50 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 15:54:39 +0100 Subject: [PATCH 12/36] Testing tests --- src/main/scala/GuessWhoGame/Board.scala | 9 ++- .../scala/GuessWhoGameSpec/BoardSpec.scala | 65 +++++++++++++++---- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 5757ae1..d95bcf7 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -24,7 +24,9 @@ case class Board (characters: List[Character]) { def getRemainingCharacters: List[Character] = remainingCharacters - + def resetBoard(): Unit = { + remainingCharacters = characters + } def checkWinCondition: Boolean = getRemainingCharacters.size == 1 def eliminateCharacter(character: Character): Unit = { @@ -38,6 +40,7 @@ case class Board (characters: List[Character]) { if (selectedCharacter.name == value) { remainingCharacters.filter(_.name == value) //endGame() + //resetBoard() } else { remainingCharacters.filterNot(_.name == value) } @@ -104,9 +107,5 @@ case class Board (characters: List[Character]) { remainingCharacters } } - - def resetBoard(): Unit = { - remainingCharacters = characters - } } } \ No newline at end of file diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index 12d2314..ea3448f 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -27,8 +27,6 @@ class BoardSpec extends AnyFlatSpec { //assert(gameBoard.selectRandomCharacter(characters: List[Character]) == gameBoard.selectedCharacter) } - // Stores remaining characters - //Watches for the win condition it should "check win condition correctly" in { @@ -40,9 +38,9 @@ class BoardSpec extends AnyFlatSpec { } } - //Handles questions, rerenders based on question result + //Handles questions, rerenders based on question result || Stores remaining characters - it should "eliminate characters correctly based on questions" in { + it should "eliminate characters correctly based on gender questions" in { val gameBoard = new Board(characters) val initialSize = gameBoard.remainingCharacters.size gameBoard.handleQuestion("gender", Left("male")) @@ -51,6 +49,51 @@ class BoardSpec extends AnyFlatSpec { //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } + it should "eliminate characters correctly based on name questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("name", Left("muhammad")) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "eliminate characters correctly based on hairColor questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("hairColor", Left("blonde")) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "eliminate characters correctly based on eyeColor questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("eyeColor", Left("blue")) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "eliminate characters correctly based on wearsGlasses questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("wearsGlasses", Right(false)) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "eliminate characters correctly based on HasFacialHair questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("hasFacialHair", Right(false)) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + // it should "eliminate characters correctly based on questions" in { // val game = new Board(characters) // gameLogic.handleQuestion(_.gender == "male") @@ -60,13 +103,13 @@ class BoardSpec extends AnyFlatSpec { // Updates based on filters applied to questions //Resets board - // it should "reset the game board correctly" in { - // val game = new Board(characters) - // gameLogic.handleQuestion(character => character.gender == "male") - // game.getRemainingCharacters.size should be < characters.size - // game.resetBoard() - // game.getRemainingCharacters.size shouldEqual characters.size - // } +// it should "reset the game board correctly" in { +// val gameBoard = new Board(characters) +// gameBoard.handleQuestion(character => character.gender == "male") +// gameBoard.getRemainingCharacters.size should be < characters.size +// gameBoard.resetBoard() +// gameBoard.getRemainingCharacters.size shouldEqual characters.size +// } // // // to revisit if needed // it should "eliminate a character correctly" in { From f8565066576eed34274c801c56e02f2a4a355aa6 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 15:57:39 +0100 Subject: [PATCH 13/36] BoardSpec hair colour test fixed --- src/test/scala/GuessWhoGameSpec/BoardSpec.scala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index ea3448f..2df4cf2 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -9,6 +9,23 @@ class BoardSpec extends AnyFlatSpec { val characters = List( Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), + Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), + Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), + Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), + Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), + Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), + Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), + Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), + Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), + Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), + Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), + Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) ) From 151cb537ab4238d1bdd6e5a24b89f8c58ba09437 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Mon, 15 Jul 2024 16:35:21 +0100 Subject: [PATCH 14/36] new tests added --- .../scala/GuessWhoGameSpec/BoardSpec.scala | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index 2df4cf2..bceacc6 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -111,6 +111,31 @@ class BoardSpec extends AnyFlatSpec { //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } + it should "handle incorrect attribute values cleanly" in { + val gameBoard = Board(characters) + val initialSize = gameBoard.getRemainingCharacters.size + gameBoard.handleQuestion("gender", Left("nonexistent gender")) + val newSize = gameBoard.getRemainingCharacters.size + + newSize shouldEqual initialSize + } + + it should "fail to eliminate characters with incorrect gender" in { + val gameBoard = Board(characters) + gameBoard.handleQuestion("gender", Left("female")) + gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } + + it should "handle edge case where all characters have the same attribute" in { + val sameGenderCharacters = List( + Character("john", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + Character("paul", "male", "black", "green", wearsGlasses = true, facialHair = true) + ) + val gameBoard = Board(sameGenderCharacters) + gameBoard.handleQuestion("gender", Left("male")) + gameBoard.getRemainingCharacters.size shouldEqual 2 + } + // it should "eliminate characters correctly based on questions" in { // val game = new Board(characters) // gameLogic.handleQuestion(_.gender == "male") From 6fb900065e13bc84fff3f38dd465cfcdcb0bf4bd Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 11:49:03 +0100 Subject: [PATCH 15/36] File cleanup --- src/main/scala/GuessWhoGame/Game.scala | 50 ------- src/main/scala/GuessWhoGame/GameLogic.scala | 27 ---- src/main/scala/GuessWhoGame/Plan.sc | 62 -------- src/main/scala/GuessWhoGame/Questions.scala | 3 - .../GuessWhoGame/runthroughTestingGround.sc | 133 ------------------ src/test/TestPlan.sc | 102 -------------- src/test/TestPlan2.sc | 0 .../GuessWhoGameSpec/GameLogicSpec.scala | 18 --- .../GuessWhoGameSpec/QuestionsSpec.scala | 45 ------ 9 files changed, 440 deletions(-) delete mode 100644 src/main/scala/GuessWhoGame/GameLogic.scala delete mode 100644 src/main/scala/GuessWhoGame/Plan.sc delete mode 100644 src/main/scala/GuessWhoGame/Questions.scala delete mode 100644 src/main/scala/GuessWhoGame/runthroughTestingGround.sc delete mode 100644 src/test/TestPlan.sc delete mode 100644 src/test/TestPlan2.sc delete mode 100644 src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala delete mode 100644 src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index f53ade2..ed77358 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -28,55 +28,5 @@ object Game extends App { gameBoard.printCharacterNames() - - - - //Run example of the game - //Call methods - - /** game start - random character selected (private), characterlist printed to screen - * yes / no question asked - * list filtered based on fulfilment of criteria - * list reprinted to screen - * loop through all options, filtering and reprinting each time - * trigger game end when length of list is 1 ------- could end anytime, defined/earlier in code - * */ - - - -// case class GuessWhoGame.Character( -// name: String, -// gender: String, -// hairColor: String, -// eyeColor: String, -// wearsGlasses: Boolean, -// facialHair: Boolean -// ) - - - - - - - - - } - - - -//package Week2.Monday.AfternoonTaskSolution -// -//object Sanctuary extends App { -// -// def feedAnimal(animal: Animal) = println(s"You fed ${animal.name} some ${animal.dietType.eats}!") -// -// val hedwigTheSnowyOwl = new Owl("Hedwig", "Snowy Owl", 8, 2, "White", 150) -// val pumbaTheWarthog = new Warthog("Pumbaa", "Common Warthog", 4, "Brown", true) -// val jeffTheDragonfly = new Dragonfly("Jeff", "Blue Eyed Darner", 1, 12, 10, 1) -// -// feedAnimal(hedwigTheSnowyOwl) -// -//} - diff --git a/src/main/scala/GuessWhoGame/GameLogic.scala b/src/main/scala/GuessWhoGame/GameLogic.scala deleted file mode 100644 index bef3fba..0000000 --- a/src/main/scala/GuessWhoGame/GameLogic.scala +++ /dev/null @@ -1,27 +0,0 @@ -package GuessWhoGame - -import scala.util.Random - -class GameLogic (board: Board) { - -} - - - -//Not touched yet -// def askQuestion(question: Character => Boolean): Boolean = { -// val answer = question(selectedCharacter) -// board.getRemainingCharacters.foreach { character => -// if (question(character) != answer) board.eliminateCharacter(character) -// } -// answer -// -// // The askQuestion method should take a function as a parameter -// def askQuestion(question: Character => Boolean): Boolean = { -// val answer = question(selectedCharacter) -// board.getRemainingCharacters.foreach { character => -// if (question(character) != answer) board.eliminateCharacter(character) -// -// } -// answer -// } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/Plan.sc b/src/main/scala/GuessWhoGame/Plan.sc deleted file mode 100644 index 4155a88..0000000 --- a/src/main/scala/GuessWhoGame/Plan.sc +++ /dev/null @@ -1,62 +0,0 @@ -/** - 1. Classes, Case Classes, Traits - - Classes and Case Classes for character representation - (name: String, gender: String, hairColour: String (hasHair - potential trait), eyeColour: String, wearing Glasses: Boolean, - facialHair: Boolean) - Attributes of each character - gender, hairColour etc - - // Define GuessWhoGame.Character class - case class GuessWhoGame.Character(name: String, gender: String, hairColor: String, eyeColor: String) - - // Define Game class - class GuessWhoGame(characters: List[GuessWhoGame.Character]) { - - 2. Trait for game logic - random character selection - Method for random selection - private val - - 3. Questions and Answers - Method for Yes/No questions - boolean - Use List to show characters - after each question characters are removed - - if correct character guessed = end the game (endGameMethod) - if not correct character = new list is generated and game continues - - 4. TDD - - Write tests for each part of the logic - - Test character creation with attributes - - Test random selection - - Test Yes/No Questions - - Test state changes of the board after each questions - - Test conditions in which the game ends - - - Game will end when the correct character is guessed - - FIND THE LESSON WHERE EXTENSION WAS TALKING TO THE TERMINAL - - Last Step - ReadMe file - - //Game end method? - // def gameEnd: Boolean = remainingCharacters.size == 1 - - //Reveal secret character (only to support testing) - // def revealSecretCharacter: GuessWhoGame.Character = selectedCharacter - - - - //First thing Monday: - //Make sure the selected character is being selected - //Make sure the selected character is still represented on the game board - //Take input questions - //Amend list based on input questions - //Triggering end result - - //4. TDD - //- Write tests for each part of the logic - //- Test character creation with attributes - //- Test random selection - //- Test Yes/No Questions - //- Test state changes of the board after each questions - //- Test conditions in which the game ends - diff --git a/src/main/scala/GuessWhoGame/Questions.scala b/src/main/scala/GuessWhoGame/Questions.scala deleted file mode 100644 index fecd4df..0000000 --- a/src/main/scala/GuessWhoGame/Questions.scala +++ /dev/null @@ -1,3 +0,0 @@ -class Questions { - - } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc b/src/main/scala/GuessWhoGame/runthroughTestingGround.sc deleted file mode 100644 index c3bcc99..0000000 --- a/src/main/scala/GuessWhoGame/runthroughTestingGround.sc +++ /dev/null @@ -1,133 +0,0 @@ -import scala.util.Random - -case class Character(val name: String, val gender: String, val hairColor: String, val eyeColor: String, val wearsGlasses: Boolean, val facialHair: Boolean) - -case class Board (characters: List[Character]) { - def printCharacterNames(): Unit = { - characters.foreach(Character => println(Character.name)) - } -} - -val char1: Character = Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false) -val char2: Character = Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true) -val char3: Character = Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) -val char4: Character = Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true) -val char5: Character = Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true) -val char6: Character = Character("gemma", "female", "ginger", "Blue", wearsGlasses = true, facialHair = false) -val char7: Character = Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true) -val char8: Character = Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false) -val char9: Character = Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true) -val char10: Character = Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false) -val char11: Character = Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false) -val char12: Character = Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false) -val char13: Character = Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true) -val char14: Character = Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false) -val char15: Character = Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false) -val char16: Character = Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true) -val char17: Character = Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false) -val char18: Character = Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false) -val char19: Character = Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false) -val char20: Character = Character("bobbiana", "female", "Brown", "Blue", wearsGlasses = true, facialHair = false) - -var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) - -gameBoard.printCharacterNames() - -//working so far - -class GameLogic (board: Board) { - private val selectedCharacter: Character = selectRandomCharacter(board.characters) - private var remainingCharacters: List[Character] = board.characters - - private def selectRandomCharacter(characters: List[Character]): Character = { - characters(Random.nextInt(characters.size)) - } - - def getSelectedCharacter: Character = selectedCharacter - - //Testing only, delete once game running clearly - def printSelectedCharacter(): Unit = { - println(selectedCharacter.name) - } - //ABOVE = TESTING ONLY - - def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { - attribute match { - case "name" => - value match { - case Left(value) => - if (selectedCharacter.name == value) { - remainingCharacters.filter(_.name == value) - //endGame() - } else { - remainingCharacters.filterNot(_.name == value) - } - case _ => println("Invalid name value added. Try again") - } - case "gender" => - value match { - case Left(value) => - if (selectedCharacter.gender == value) { - remainingCharacters.filter(_.gender == value) - } else { - remainingCharacters.filterNot(_.gender == value) - } - case _ => println("Invalid gender value added. Try again") - } - case "hairColor" => - value match { - case Left(value) => - if (selectedCharacter.hairColor == value) { - remainingCharacters.filter(_.hairColor == value) - } - else { - remainingCharacters.filterNot(_.hairColor == value) - } - case _ => println("Invalid hair colour value added. Try again") - } - case "eyeColor" => - value match { - case Left(value) => - if (selectedCharacter.eyeColor == value) { - remainingCharacters.filter(_.eyeColor == value) - } - else { - remainingCharacters.filterNot(_.eyeColor == value) - } - case _ => println("Invalid eye colour value added. Try again") - } - case "wearsGlasses" => - value match { - case Right(value) => - if (selectedCharacter.wearsGlasses == value) { - remainingCharacters.filter(_.wearsGlasses == value) - } - else { - remainingCharacters.filterNot(_.wearsGlasses == value) - } - case _ => println("Invalid glasses value added. Try again") - } - case "hasFacialHair" => - value match { - case Right(value) => - if (selectedCharacter.facialHair == value) { - remainingCharacters.filter(_.facialHair == value) - } - else { - remainingCharacters.filterNot(_.facialHair == value) - } - case _ => println("Invalid facial hair value added. Try again") - } - handleQuestion("hairColor", Left("brown")) - handleQuestion("wearsGlasses", Right(true)) - handleQuestion("name", Left("joe")) - } - } - -} - -//TESTING IN RUNTHROUGH ONLY -val gameLogic = new GameLogic(gameBoard) -gameLogic.printSelectedCharacter() -//DON'T ADD TO CLASS //ADD TO GAME WITHOUT PRINTSELECTEDCHARACTER - diff --git a/src/test/TestPlan.sc b/src/test/TestPlan.sc deleted file mode 100644 index 5f98de1..0000000 --- a/src/test/TestPlan.sc +++ /dev/null @@ -1,102 +0,0 @@ -//Examples from earlier: -// -//import org.scalatest.wordspec.AnyWordSpec -// -//class TaxCalculatorSpec extends AnyWordSpec { -// -// val taxCalculator: TaxCalculator = new TaxCalculator -// -// // I've done the first test for you! -// "TaxCalculator.calculateTax" should { -// "return the total amount of tax to pay" when { -// "the income is below the personal tax limit" in { -// val result: Double = taxCalculator.calculateTax(5000) -// -// assert(result == 0) -// } -// "the income is within the basic rate limit" in { -// val result: Double = taxCalculator.calculateTax(20000) -// -// assert(result == 2000) -// } -// "the income is within the higher rate limit" in { -// val result: Double = taxCalculator.calculateTax(60000) -// -// assert(result == 12000) -// } -// "the income is above the higher rate limit" in { -// val result: Double = taxCalculator.calculateTax(150000) -// -// assert(result == 51250) -// } -// } -// } -// -// //Second Test -// "TaxCalculator.isHigherRateTaxpayer" should { -// "return whether the payee is a higher rate tax payer" when { -// "the income is below the higher rate tax limit" in { -// val result: Boolean = taxCalculator.isHigherRateTaxpayer(25000) -// -// assert(!result) -// } -// "the income is above the higher rate tax limit" in { -// val result: Boolean = taxCalculator.isHigherRateTaxpayer(95000) -// -// assert(result) -// } -// } -// } -// -// //Third Test -// "TaxCalculator.calculateTax" should { -// "return a string with the income limit of the payee's current tax band" when { -// "the income is below 0" in { -// val result: String = taxCalculator.formattedCurrentTaxAllowance(-4) -// -// assert(result == "Invalid Input") -// } -// "the income is below the personal tax limit" in { -// val result: String = taxCalculator.formattedCurrentTaxAllowance(5000) -// -// assert(result == "£10,000") -// } -// "the income is within the basic rate limit" in { -// val result: String = taxCalculator.formattedCurrentTaxAllowance(20000) -// -// assert(result == "£50,000") -// } -// "the income is within the higher rate limit" in { -// val result: String = taxCalculator.formattedCurrentTaxAllowance(60000) -// -// assert(result == "£125,000") -// } -// "the income is above the higher rate limit" in { -// val result: String = taxCalculator.formattedCurrentTaxAllowance(150000) -// -// assert(result == "No Limit") -// } -// } -// } -// -// //Extension -// "TaxCalculator.calculateCapitalGainsTax" should { -// "return the total amount of capital gains tax to pay" when { -// "the gains are below the personal gains limit" in { -// val result: Double = taxCalculator.calculateCapitalGainsTax(2000) -// -// assert(result == 0) -// } -// "the gains are within the basic rate limit" in { -// val result: Double = taxCalculator.calculateCapitalGainsTax(30000) -// -// assert(result == 2700) -// } -// "the gains are above the basic rate limit" in { -// val result: Double = taxCalculator.calculateCapitalGainsTax(60000) -// -// assert(result == 11400) -// } -// } -// } -//} \ No newline at end of file diff --git a/src/test/TestPlan2.sc b/src/test/TestPlan2.sc deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala b/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala deleted file mode 100644 index 3650728..0000000 --- a/src/test/scala/GuessWhoGameSpec/GameLogicSpec.scala +++ /dev/null @@ -1,18 +0,0 @@ -package GuessWhoGameSpec - -import GuessWhoGame._ -import org.scalatest.flatspec.AnyFlatSpec -import org.scalatest.matchers.should.Matchers._ - -class GuessWhoGameSpec extends AnyFlatSpec { - - val characters = List( - Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) - ) -} - - - - diff --git a/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala b/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala deleted file mode 100644 index 77ee96e..0000000 --- a/src/test/scala/GuessWhoGameSpec/QuestionsSpec.scala +++ /dev/null @@ -1,45 +0,0 @@ -import org.scalatest.flatspec.AnyFlatSpec - -/** - //naming convention: same as file with spec at the end - class TwoNumbersSpec extends FlatSpec{ - "add" should "add numbers" in { //method name and expected functionality - val nums = new TwoNumbers(1,2) - assert(nums.add==3) //block of code that performs the test, assert is keyword (this and line above) - } //assert gives Boolean value, must evaluate 'true' for test to pass, - } //however sometimes we want it to fail. - */ - -class QuestionsSpec extends AnyFlatSpec { - -} - - - -//class Questions { -// def askQuestion(attribute: String, value: Either[String, Boolean]): Unit = { -// attribute match { -// case "name" => -// if (selectedCharacter.name == value) remainingCharacters.filter(_.name == value) // game end here! -// else remainingCharacters = remainingCharacters.filterNot(_.name == value) -// //trigger game end -// case "gender" => -// if (selectedCharacter.gender == value) remainingCharacters.filter(_.gender == value) -// else remainingCharacters = remainingCharacters.filterNot(_.gender == value) -// case "hairColor" => -// if (selectedCharacter.hairColor == value) remainingCharacters.filter(_.hairColor == value) -// else remainingCharacters = remainingCharacters.filterNot(_.hairColor == value) -// case "eyeColor" => -// if (selectedCharacter.eyeColor == value) remainingCharacters.filter(_.eyeColor == value) -// else remainingCharacters = remainingCharacters.filterNot(_.eyeColor == value) -// case "wearsGlasses" => -// if (selectedCharacter.wearsGlasses == value) remainingCharacters.filter(_.wearsGlasses == value) -// else remainingCharacters = remainingCharacters.filterNot(_.wearsGlasses == value) -// case "hasFacialHair" => -// if (selectedCharacter.hasFacialHair == value) remainingCharacters.filter(_.hasFacialHair == value) -// else remainingCharacters = remainingCharacters.filterNot(_.hasFacialHair == value) -// -// //need for an error case here?? -// } -// } -//} From 9ad8fa48ce901cb06836d44320c4f6ad7c470002 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 11:50:52 +0100 Subject: [PATCH 16/36] Added type to characters --- src/test/scala/GuessWhoGameSpec/CharacterSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala index 58b19d6..5e28221 100644 --- a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala @@ -4,7 +4,7 @@ import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers._ class CharacterSpec extends AnyFlatSpec { - val characters = List( + val characters: List[Character] = List( Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), From 6fd6ad8e1e93e2cd2be396ceab9ae742643bbe4d Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 12:05:23 +0100 Subject: [PATCH 17/36] Test refactor --- src/main/scala/GuessWhoGame/Board.scala | 16 ++++++--- .../scala/GuessWhoGameSpec/BoardSpec.scala | 35 +++++-------------- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index d95bcf7..3d01721 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -7,6 +7,7 @@ case class Board (characters: List[Character]) { characters.foreach(Character => println(Character.name)) } + //storing selected character, remaining characters for updating state val selectedCharacter: Character = selectRandomCharacter(characters) var remainingCharacters: List[Character] = characters @@ -14,24 +15,29 @@ case class Board (characters: List[Character]) { characters(Random.nextInt(characters.size)) } + //For testing cases def getSelectedCharacter: Character = selectedCharacter - //Testing only, delete once game running clearly def printSelectedCharacter(): Unit = { println(selectedCharacter.name) } - //ABOVE = TESTING ONLY + //fetching remaining characters for state change def getRemainingCharacters: List[Character] = remainingCharacters def resetBoard(): Unit = { remainingCharacters = characters } + + def checkWinCondition: Boolean = getRemainingCharacters.size == 1 - def eliminateCharacter(character: Character): Unit = { - var remainingCharacters = characters.filterNot(_ == character) - } + + //Further development +// def eliminateCharacter(character: Character): Unit = { +// var remainingCharacters = characters.filterNot(_ == character) +// } + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { remainingCharacters = attribute match { case "name" => diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index bceacc6..916c908 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -6,7 +6,7 @@ import org.scalatest.matchers.should.Matchers._ class BoardSpec extends AnyFlatSpec { - val characters = List( + val characters: List[Character] = List( Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), @@ -63,7 +63,8 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("gender", Left("male")) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + //Future testcases +// gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe false } it should "eliminate characters correctly based on name questions" in { @@ -72,7 +73,6 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("name", Left("muhammad")) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } it should "eliminate characters correctly based on hairColor questions" in { @@ -81,7 +81,6 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("hairColor", Left("blonde")) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } it should "eliminate characters correctly based on eyeColor questions" in { @@ -90,7 +89,6 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("eyeColor", Left("blue")) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } it should "eliminate characters correctly based on wearsGlasses questions" in { @@ -99,7 +97,6 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("wearsGlasses", Right(false)) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } it should "eliminate characters correctly based on HasFacialHair questions" in { @@ -108,7 +105,6 @@ class BoardSpec extends AnyFlatSpec { gameBoard.handleQuestion("hasFacialHair", Right(false)) val newSize = gameBoard.remainingCharacters.size newSize should be < initialSize - //gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true } it should "handle incorrect attribute values cleanly" in { @@ -136,24 +132,11 @@ class BoardSpec extends AnyFlatSpec { gameBoard.getRemainingCharacters.size shouldEqual 2 } -// it should "eliminate characters correctly based on questions" in { -// val game = new Board(characters) -// gameLogic.handleQuestion(_.gender == "male") -// board.getRemainingCharacters.forall(_.gender == "male") shouldBe true -// } - - // Updates based on filters applied to questions - - //Resets board -// it should "reset the game board correctly" in { -// val gameBoard = new Board(characters) -// gameBoard.handleQuestion(character => character.gender == "male") -// gameBoard.getRemainingCharacters.size should be < characters.size -// gameBoard.resetBoard() -// gameBoard.getRemainingCharacters.size shouldEqual characters.size -// } - // - // // to revisit if needed +} + + + + // future development // it should "eliminate a character correctly" in { // val gameBoard = new Board(characters) // val characterToEliminate = characters.head @@ -167,4 +150,4 @@ class BoardSpec extends AnyFlatSpec { // characters.foreach(gameBoard.eliminateCharacter) // gameBoard.getRemainingCharacters shouldBe empty // } -} + From 1496ec2eb944d81f8916d22bdc5908b50689302f Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 12:06:42 +0100 Subject: [PATCH 18/36] Presentation notes --- src/main/scala/GuessWhoGame/Game.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index ed77358..6ec0772 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -28,5 +28,9 @@ object Game extends App { gameBoard.printCharacterNames() + //Building out game to terminal + //Separation of concerns regarding game logic + //Calling of methods from other sections + } From 2679ef7332b52fdfe175873f6b883a8ac924db9a Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 12:10:21 +0100 Subject: [PATCH 19/36] Moved one note to bottom of board --- src/main/scala/GuessWhoGame/Board.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 3d01721..695b4c7 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -33,11 +33,6 @@ case class Board (characters: List[Character]) { def checkWinCondition: Boolean = getRemainingCharacters.size == 1 - //Further development -// def eliminateCharacter(character: Character): Unit = { -// var remainingCharacters = characters.filterNot(_ == character) -// } - def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { remainingCharacters = attribute match { case "name" => @@ -114,4 +109,8 @@ case class Board (characters: List[Character]) { } } } + //Further development + // def eliminateCharacter(character: Character): Unit = { + // var remainingCharacters = characters.filterNot(_ == character) + // } } \ No newline at end of file From 1764ed0eb6ebaa79b51a87f76c25cc9c5b52a096 Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Tue, 16 Jul 2024 12:10:55 +0100 Subject: [PATCH 20/36] few changes --- src/main/scala/GuessWhoGame/Board.scala | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index d95bcf7..77c0fd4 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -2,12 +2,12 @@ package GuessWhoGame import scala.util.Random -case class Board (characters: List[Character]) { +case class Board(characters: List[Character]) { def printCharacterNames(): Unit = { characters.foreach(Character => println(Character.name)) } - val selectedCharacter: Character = selectRandomCharacter(characters) + val selectedCharacter: Character = selectRandomCharacter(characters) var remainingCharacters: List[Character] = characters def selectRandomCharacter(characters: List[Character]): Character = { @@ -24,14 +24,17 @@ case class Board (characters: List[Character]) { def getRemainingCharacters: List[Character] = remainingCharacters + def resetBoard(): Unit = { remainingCharacters = characters } + def checkWinCondition: Boolean = getRemainingCharacters.size == 1 - def eliminateCharacter(character: Character): Unit = { - var remainingCharacters = characters.filterNot(_ == character) - } + def eliminateCharacter(character: Character): Unit = { + var remainingCharacters = characters.filterNot(_ == character) + } + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { remainingCharacters = attribute match { case "name" => @@ -45,7 +48,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.name == value) } case _ => println("Invalid name value added. Try again") - remainingCharacters + remainingCharacters } case "gender" => value match { @@ -56,7 +59,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.gender == value) } case _ => println("Invalid gender value added. Try again") - remainingCharacters + remainingCharacters } case "hairColor" => value match { From de39d12029da12e9a6d2dad305fbc3b5dd499ab1 Mon Sep 17 00:00:00 2001 From: Joe Higgs <147166151+nonebula@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:53:06 +0100 Subject: [PATCH 21/36] Ext1 (#8) * Terminal game prompts added * Terminal game working and looping --------- Co-authored-by: Joe Higgs --- src/main/scala/GuessWhoGame/Board.scala | 6 +- src/main/scala/GuessWhoGame/Game.scala | 68 ++++++++++++++++-- .../guesswhogame_2.12-0.1.0-SNAPSHOT.jar | Bin 0 -> 18411 bytes .../target/scala-2.12/sync/copy-resource | 1 + .../update/update_cache_2.12/inputs | 1 + .../update/update_cache_2.12/output | 1 + .../scala-2.12/zinc/inc_compile_2.12.zip | Bin 0 -> 4381 bytes .../_global/_global/_global/streams/out | 0 .../csrConfiguration/_global/streams/out | 0 .../_global/csrProject/_global/streams/out | 0 .../streams/update_cache_2.12/input_dsp | 1 + .../streams/update_cache_2.12/output_dsp | 1 + .../ivyConfiguration/_global/streams/out | 0 .../_global/ivySbt/_global/streams/out | 0 .../moduleSettings/_global/streams/out | 0 .../projectDescriptors/_global/streams/out | 0 .../_global/streams/out | 0 .../_global/update/_global/streams/out | 3 + .../_global/_global/compileOutputs/previous | 1 + .../_global/discoveredMainClasses/data | 1 + .../compile/bspReporter/_global/streams/out | 0 .../compile/compile/_global/streams/out | 0 .../compileIncremental/_global/streams/export | 0 .../compileIncremental/_global/streams/out | 6 ++ .../compile/copyResources/_global/streams/out | 2 + .../_global/streams/export | 1 + .../_global/streams/export | 1 + .../exportedProducts/_global/streams/export | 1 + .../_global/streams/export | 1 + .../compile/incOptions/_global/streams/out | 2 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../compile/mainClass/_global/streams/out | 0 .../managedClasspath/_global/streams/export | 1 + .../compile/packageBin/_global/streams/inputs | 1 + .../compile/packageBin/_global/streams/out | 19 +++++ .../compile/packageBin/_global/streams/output | 1 + .../compile/scalacOptions/_global/streams/out | 0 .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../unmanagedJars/_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/export | 1 + .../_global/streams/out | 0 .../managedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/export | 1 + .../unmanagedClasspath/_global/streams/out | 0 .../unmanagedJars/_global/streams/export | 1 + 51 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar create mode 100644 src/main/scala/GuessWhoGame/target/scala-2.12/sync/copy-resource create mode 100644 src/main/scala/GuessWhoGame/target/scala-2.12/update/update_cache_2.12/inputs create mode 100644 src/main/scala/GuessWhoGame/target/scala-2.12/update/update_cache_2.12/output create mode 100644 src/main/scala/GuessWhoGame/target/scala-2.12/zinc/inc_compile_2.12.zip create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/_global/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/csrConfiguration/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/csrProject/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/ivyConfiguration/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/ivySbt/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/moduleSettings/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/projectDescriptors/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/_global/update/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/compileOutputs/previous create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/discoveredMainClasses/data create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/bspReporter/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/compile/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/copyResources/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/dependencyClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/exportedProductJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/exportedProducts/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/externalDependencyClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/incOptions/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/mainClass/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/managedClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/inputs create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/output create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/scalacOptions/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/compile/unmanagedJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/dependencyClasspathAsJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/exportedProductJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/externalDependencyClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/fullClasspathAsJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/managedClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/export create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/out create mode 100644 src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedJars/_global/streams/export diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index d95bcf7..94c69d0 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -10,6 +10,10 @@ case class Board (characters: List[Character]) { val selectedCharacter: Character = selectRandomCharacter(characters) var remainingCharacters: List[Character] = characters + def printRemainingCharacters(): Unit = { + remainingCharacters.foreach(Character => println(Character.name)) + } + def selectRandomCharacter(characters: List[Character]): Character = { characters(Random.nextInt(characters.size)) } @@ -40,7 +44,7 @@ case class Board (characters: List[Character]) { if (selectedCharacter.name == value) { remainingCharacters.filter(_.name == value) //endGame() - //resetBoard() +// resetBoard() } else { remainingCharacters.filterNot(_.name == value) } diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index 6ec0772..3c7bb58 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -1,5 +1,6 @@ package GuessWhoGame import scala.util.Random +import scala.io.StdIn object Game extends App { @@ -26,11 +27,70 @@ object Game extends App { var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) - gameBoard.printCharacterNames() + def startGame(): Unit = { + gameBoard.printCharacterNames() - //Building out game to terminal - //Separation of concerns regarding game logic - //Calling of methods from other sections + //Building out game to terminal + println("Welcome to the Guess Who game!") + println("Try to guess the character by asking some questions...") + + playGame() + + println("\nDo you want to play again? (yes/no)") + val playAgain = scala.io.StdIn.readLine().toLowerCase() + if (playAgain == "yes" || playAgain == "y") { + gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) + startGame() + } else { + println("Thanks for playing Guess Who!") + } + } + + //Game loop + def playGame(): Unit = { + while (!gameBoard.checkWinCondition) { + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() + + println("\nEnter a hair colour that you want to guess:") + val hairInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("hairColor", Left(hairInput)) + + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() + + println("\nEnter an eye colour that you want to guess:") + val eyeInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("eyeColor", Left(eyeInput)) + + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() + println("\nEnter a gender that you want to guess (male/female):") + val genderInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("gender", Left(genderInput)) + + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() + + if (!gameBoard.checkWinCondition) { + println("\nEnter a name that you want to guess:") + val nameInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("name", Left(nameInput)) + + if (gameBoard.checkWinCondition && gameBoard.getSelectedCharacter.name == (nameInput)) { + println(s"\nCongratulations, You guessed correctly. The character was ${gameBoard.getSelectedCharacter.name}.") + } else { + println(s"\nGame over, you guessed incorrectly. The character was ${gameBoard.getSelectedCharacter.name}.") + } + } + } + } + + startGame() } + + //Separation of concerns regarding game logic + //Calling of methods from other sections + diff --git a/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar b/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..d4beef4c428aadbdd6d8cf27282d2ed5004db10a GIT binary patch literal 18411 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 GrhfqlYB>A= literal 0 HcmV?d00001 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/_global/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/_global/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/csrConfiguration/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/csrConfiguration/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/csrProject/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/csrProject/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp b/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp new file mode 100644 index 0000000..f8519e7 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/input_dsp @@ -0,0 +1 @@ +-957851064 \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp b/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp new file mode 100644 index 0000000..a67b9cd --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/_global/dependencyPositions/_global/streams/update_cache_2.12/output_dsp @@ -0,0 +1 @@ +{"{\"organization\":\"org.scala-lang\",\"name\":\"scala-library\",\"revision\":\"2.12.19\",\"isChanging\":false,\"isTransitive\":true,\"isForce\":false,\"explicitArtifacts\":[],\"inclusions\":[],\"exclusions\":[],\"extraAttributes\":{},\"crossVersion\":{\"type\":\"Disabled\"}}":{"value":{"$fields":["path","startLine"],"path":"(sbt.Classpaths.jvmBaseSettings) Defaults.scala","startLine":3407},"type":"LinePosition"}} \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/ivyConfiguration/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/ivyConfiguration/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/ivySbt/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/ivySbt/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/moduleSettings/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/moduleSettings/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/projectDescriptors/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/projectDescriptors/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/scalaCompilerBridgeScope/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/_global/update/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/_global/update/_global/streams/out new file mode 100644 index 0000000..58b0a88 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/_global/update/_global/streams/out @@ -0,0 +1,3 @@ +[debug] not up to date. inChanged = true, force = false +[debug] Updating ... +[debug] Done updating  diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/compileOutputs/previous b/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/compileOutputs/previous new file mode 100644 index 0000000..8629d42 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/compileOutputs/previous @@ -0,0 +1 @@ +["sbt.Task[scala.collection.Seq[java.nio.file.Path]]",["/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Character$.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Board.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game$delayedInit$body.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game$.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Board$.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Character.class","/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/zinc/inc_compile_2.12.zip"]] \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/discoveredMainClasses/data b/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/discoveredMainClasses/data new file mode 100644 index 0000000..50b9cf4 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/_global/_global/discoveredMainClasses/data @@ -0,0 +1 @@ +["GuessWhoGame.Game"] \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/bspReporter/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/bspReporter/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/compile/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/compile/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/export new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/out new file mode 100644 index 0000000..1b20dc1 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/compileIncremental/_global/streams/out @@ -0,0 +1,6 @@ +[debug] [zinc] IncrementalCompile ----------- +[debug] IncrementalCompile.incrementalCompile +[debug] previous = Stamps for: 7 products, 3 sources, 1 libraries +[debug] current source = Set(${BASE}/Board.scala, ${BASE}/Game.scala, ${BASE}/Character.scala) +[debug] > initialChanges = InitialChanges(Changes(added = Set(), removed = Set(), changed = Set(), unmodified = ...),Set(),Set(),API Changes: Set()) +[debug] No changes diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/copyResources/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/copyResources/_global/streams/out new file mode 100644 index 0000000..f25042f --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/copyResources/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Copy resource mappings:  +[debug]   diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/dependencyClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/dependencyClasspath/_global/streams/export new file mode 100644 index 0000000..d8fd838 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/dependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/exportedProductJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/exportedProductJars/_global/streams/export new file mode 100644 index 0000000..fa0e545 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/exportedProductJars/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/exportedProducts/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/exportedProducts/_global/streams/export new file mode 100644 index 0000000..bcbd58e --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/exportedProducts/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/externalDependencyClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/externalDependencyClasspath/_global/streams/export new file mode 100644 index 0000000..d8fd838 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/incOptions/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/incOptions/_global/streams/out new file mode 100644 index 0000000..6b902b1 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/incOptions/_global/streams/out @@ -0,0 +1,2 @@ +[debug] Created transactional ClassFileManager with tempDir = /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes.bak +[debug] Removing the temporary directory used for backing up class files: /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes.bak diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/export new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/internalDependencyClasspath/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/mainClass/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/mainClass/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/managedClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/managedClasspath/_global/streams/export new file mode 100644 index 0000000..d8fd838 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/inputs b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/inputs new file mode 100644 index 0000000..c04dfaa --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/inputs @@ -0,0 +1 @@ +268969852 \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/out new file mode 100644 index 0000000..669808e --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/out @@ -0,0 +1,19 @@ +[debug] Packaging /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar ... +[debug] Input file mappings: +[debug]  GuessWhoGame +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame +[debug]  GuessWhoGame/Board.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Board.class +[debug]  GuessWhoGame/Game.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game.class +[debug]  GuessWhoGame/Character.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Character.class +[debug]  GuessWhoGame/Game$.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game$.class +[debug]  GuessWhoGame/Character$.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Character$.class +[debug]  GuessWhoGame/Game$delayedInit$body.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Game$delayedInit$body.class +[debug]  GuessWhoGame/Board$.class +[debug]  /Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/classes/GuessWhoGame/Board$.class +[debug] Done packaging. diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/output b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/output new file mode 100644 index 0000000..a9628db --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/packageBin/_global/streams/output @@ -0,0 +1 @@ +-1552160931 \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/scalacOptions/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/scalacOptions/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/export new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedClasspath/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedJars/_global/streams/export new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/compile/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/dependencyClasspathAsJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/dependencyClasspathAsJars/_global/streams/export new file mode 100644 index 0000000..400fb70 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/dependencyClasspathAsJars/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar:/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/exportedProductJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/exportedProductJars/_global/streams/export new file mode 100644 index 0000000..fa0e545 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/exportedProductJars/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/externalDependencyClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/externalDependencyClasspath/_global/streams/export new file mode 100644 index 0000000..d8fd838 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/externalDependencyClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/fullClasspathAsJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/fullClasspathAsJars/_global/streams/export new file mode 100644 index 0000000..400fb70 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/fullClasspathAsJars/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar:/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/export new file mode 100644 index 0000000..fa0e545 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/Documents/Training/GuessWho/src/main/scala/GuessWhoGame/target/scala-2.12/guesswhogame_2.12-0.1.0-SNAPSHOT.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/runtime/internalDependencyAsJars/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/managedClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/managedClasspath/_global/streams/export new file mode 100644 index 0000000..d8fd838 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/managedClasspath/_global/streams/export @@ -0,0 +1 @@ +/Users/joe.higgs/.sbt/boot/scala-2.12.19/lib/scala-library.jar diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/export new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/export @@ -0,0 +1 @@ + diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/out b/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedClasspath/_global/streams/out new file mode 100644 index 0000000..e69de29 diff --git a/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedJars/_global/streams/export b/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedJars/_global/streams/export new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/scala/GuessWhoGame/target/streams/runtime/unmanagedJars/_global/streams/export @@ -0,0 +1 @@ + From 7002bbaabf988e3f8aac20b2a39e51227a33059d Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 13:56:58 +0100 Subject: [PATCH 22/36] Minor styling --- src/main/scala/GuessWhoGame/Game.scala | 59 ++++++++++++-------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index 3c7bb58..4d57828 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -1,4 +1,5 @@ package GuessWhoGame + import scala.util.Random import scala.io.StdIn @@ -48,49 +49,45 @@ object Game extends App { //Game loop def playGame(): Unit = { - while (!gameBoard.checkWinCondition) { - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() + while (!gameBoard.checkWinCondition) { + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() - println("\nEnter a hair colour that you want to guess:") - val hairInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("hairColor", Left(hairInput)) + println("\nEnter a hair colour that you want to guess:") + val hairInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("hairColor", Left(hairInput)) - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() - println("\nEnter an eye colour that you want to guess:") - val eyeInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("eyeColor", Left(eyeInput)) + println("\nEnter an eye colour that you want to guess:") + val eyeInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("eyeColor", Left(eyeInput)) - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() - println("\nEnter a gender that you want to guess (male/female):") - val genderInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("gender", Left(genderInput)) + println("\nEnter a gender that you want to guess (male/female):") + val genderInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("gender", Left(genderInput)) - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() + println("\nRemaining characters:") + gameBoard.printRemainingCharacters() - if (!gameBoard.checkWinCondition) { - println("\nEnter a name that you want to guess:") - val nameInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("name", Left(nameInput)) + if (!gameBoard.checkWinCondition) { + println("\nEnter a name that you want to guess:") + val nameInput = scala.io.StdIn.readLine().toLowerCase() + gameBoard.handleQuestion("name", Left(nameInput)) - if (gameBoard.checkWinCondition && gameBoard.getSelectedCharacter.name == (nameInput)) { - println(s"\nCongratulations, You guessed correctly. The character was ${gameBoard.getSelectedCharacter.name}.") - } else { - println(s"\nGame over, you guessed incorrectly. The character was ${gameBoard.getSelectedCharacter.name}.") + if (gameBoard.checkWinCondition && gameBoard.getSelectedCharacter.name == (nameInput)) { + println(s"\nCongratulations, You guessed correctly. The character was ${gameBoard.getSelectedCharacter.name}.") + } else { + println(s"\nGame over, you guessed incorrectly. The character was ${gameBoard.getSelectedCharacter.name}.") + } } } } - } startGame() } - - //Separation of concerns regarding game logic - //Calling of methods from other sections - From 4507c3925ef1d5a0f02e95a65840a10c3af0cce4 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 14:28:12 +0100 Subject: [PATCH 23/36] Final touches --- src/main/scala/GuessWhoGame/Board.scala | 30 ++++----- src/main/scala/GuessWhoGame/Game.scala | 4 +- .../scala/GuessWhoGameSpec/BoardSpec.scala | 62 +++++++++---------- 3 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 94c69d0..2255cea 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -2,12 +2,12 @@ package GuessWhoGame import scala.util.Random -case class Board (characters: List[Character]) { +case class Board(characters: List[Character]) { def printCharacterNames(): Unit = { characters.foreach(Character => println(Character.name)) } - val selectedCharacter: Character = selectRandomCharacter(characters) + val selectedCharacter: Character = selectRandomCharacter(characters) var remainingCharacters: List[Character] = characters def printRemainingCharacters(): Unit = { @@ -18,24 +18,26 @@ case class Board (characters: List[Character]) { characters(Random.nextInt(characters.size)) } + //Testing purposes def getSelectedCharacter: Character = selectedCharacter - //Testing only, delete once game running clearly def printSelectedCharacter(): Unit = { println(selectedCharacter.name) } - //ABOVE = TESTING ONLY - def getRemainingCharacters: List[Character] = remainingCharacters - def resetBoard(): Unit = { - remainingCharacters = characters - } + def checkWinCondition: Boolean = getRemainingCharacters.size == 1 - def eliminateCharacter(character: Character): Unit = { - var remainingCharacters = characters.filterNot(_ == character) - } + //Future development + // def resetBoard(): Unit = { + // remainingCharacters = characters + // } + + // def eliminateCharacter(character: Character): Unit = { + // var remainingCharacters = characters.filterNot(_ == character) + // } + def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { remainingCharacters = attribute match { case "name" => @@ -43,13 +45,11 @@ case class Board (characters: List[Character]) { case Left(value) => if (selectedCharacter.name == value) { remainingCharacters.filter(_.name == value) - //endGame() -// resetBoard() } else { remainingCharacters.filterNot(_.name == value) } case _ => println("Invalid name value added. Try again") - remainingCharacters + remainingCharacters } case "gender" => value match { @@ -60,7 +60,7 @@ case class Board (characters: List[Character]) { remainingCharacters.filterNot(_.gender == value) } case _ => println("Invalid gender value added. Try again") - remainingCharacters + remainingCharacters } case "hairColor" => value match { diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index 4d57828..b761206 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -10,7 +10,7 @@ object Game extends App { val char3: Character = Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) val char4: Character = Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true) val char5: Character = Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true) - val char6: Character = Character("gemma", "female", "ginger", "Blue", wearsGlasses = true, facialHair = false) + val char6: Character = Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false) val char7: Character = Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true) val char8: Character = Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false) val char9: Character = Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true) @@ -24,7 +24,7 @@ object Game extends App { val char17: Character = Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false) val char18: Character = Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false) val char19: Character = Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false) - val char20: Character = Character("bobbiana", "female", "Brown", "Blue", wearsGlasses = true, facialHair = false) + val char20: Character = Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index 916c908..d7dc240 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -36,7 +36,6 @@ class BoardSpec extends AnyFlatSpec { } // Selects a character - it should "select a random character at the start of the game and keeps this character in the list" in { val gameBoard = new Board(characters) characters should contain(gameBoard.getSelectedCharacter) @@ -45,7 +44,6 @@ class BoardSpec extends AnyFlatSpec { } //Watches for the win condition - it should "check win condition correctly" in { val gameBoard = new Board(characters) if (characters.size <= 1) { @@ -55,17 +53,16 @@ class BoardSpec extends AnyFlatSpec { } } - //Handles questions, rerenders based on question result || Stores remaining characters - - it should "eliminate characters correctly based on gender questions" in { - val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size - gameBoard.handleQuestion("gender", Left("male")) - val newSize = gameBoard.remainingCharacters.size - newSize should be < initialSize - //Future testcases -// gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe false - } + //Handles questions, re-renders based on question result && Stores remaining characters + it should "eliminate characters correctly based on gender questions" in { + val gameBoard = new Board(characters) + val initialSize = gameBoard.remainingCharacters.size + gameBoard.handleQuestion("gender", Left("male")) + val newSize = gameBoard.remainingCharacters.size + newSize should be < initialSize + //Future testcases + // gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe false + } it should "eliminate characters correctly based on name questions" in { val gameBoard = new Board(characters) @@ -116,12 +113,6 @@ class BoardSpec extends AnyFlatSpec { newSize shouldEqual initialSize } - it should "fail to eliminate characters with incorrect gender" in { - val gameBoard = Board(characters) - gameBoard.handleQuestion("gender", Left("female")) - gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true - } - it should "handle edge case where all characters have the same attribute" in { val sameGenderCharacters = List( Character("john", "male", "brown", "blue", wearsGlasses = false, facialHair = false), @@ -132,22 +123,27 @@ class BoardSpec extends AnyFlatSpec { gameBoard.getRemainingCharacters.size shouldEqual 2 } + it should "fail to eliminate characters with incorrect gender" in { + val gameBoard = Board(characters) + gameBoard.handleQuestion("gender", Left("female")) + gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + } } - // future development - // it should "eliminate a character correctly" in { - // val gameBoard = new Board(characters) - // val characterToEliminate = characters.head - // gameBoard.eliminateCharacter(characterToEliminate) - // gameBoard.getRemainingCharacters should not contain characterToEliminate - // gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) - // } - // - // it should "return an empty list if all characters are eliminated" in { - // val gameBoard = Board(characters) - // characters.foreach(gameBoard.eliminateCharacter) - // gameBoard.getRemainingCharacters shouldBe empty - // } +// future development +// it should "eliminate a character correctly" in { +// val gameBoard = new Board(characters) +// val characterToEliminate = characters.head +// gameBoard.eliminateCharacter(characterToEliminate) +// gameBoard.getRemainingCharacters should not contain characterToEliminate +// gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) +// } +// +// it should "return an empty list if all characters are eliminated" in { +// val gameBoard = Board(characters) +// characters.foreach(gameBoard.eliminateCharacter) +// gameBoard.getRemainingCharacters shouldBe empty +// } From 286cc467ad23f6b152ff32f715e54f740bfad47b Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 16 Jul 2024 15:37:11 +0100 Subject: [PATCH 24/36] Notes from presentation added --- src/main/scala/GuessWhoGame/Board.scala | 1 + src/main/scala/GuessWhoGame/Game.scala | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 2255cea..0b907e4 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -2,6 +2,7 @@ package GuessWhoGame import scala.util.Random +//values could be more domain specific, name/selecting could be within character case class, then able to test separately case class Board(characters: List[Character]) { def printCharacterNames(): Unit = { characters.foreach(Character => println(Character.name)) diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index b761206..fba3da0 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -4,7 +4,7 @@ import scala.util.Random import scala.io.StdIn object Game extends App { - + //stored cases for all different types are allowed - certain restricted numbers of colours etc that could be stored and matched val char1: Character = Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false) val char2: Character = Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true) val char3: Character = Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) @@ -26,6 +26,7 @@ object Game extends App { val char19: Character = Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false) val char20: Character = Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + //would remain the same throughout var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) def startGame(): Unit = { From aab8b75665fe8c610c4d5b8303913d6d215fa4d3 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 12:23:57 +0100 Subject: [PATCH 25/36] Character refactoring (Chunky) --- src/main/scala/GuessWhoGame/Character.scala | 4 --- src/main/scala/GuessWhoGame/Game.scala | 21 +----------- .../GuessWhoGame/character/Character.scala | 11 +++++++ .../character/CharacterManager.scala | 32 +++++++++++++++++++ .../GuessWhoGame/character/EyeColor.scala | 6 ++++ .../scala/GuessWhoGame/character/Gender.scala | 6 ++++ .../GuessWhoGame/character/HairColor.scala | 6 ++++ .../character/PersonWithFacialHair.scala | 4 +++ .../character/PersonWithGlasses.scala | 5 +++ 9 files changed, 71 insertions(+), 24 deletions(-) delete mode 100644 src/main/scala/GuessWhoGame/Character.scala create mode 100644 src/main/scala/GuessWhoGame/character/Character.scala create mode 100644 src/main/scala/GuessWhoGame/character/CharacterManager.scala create mode 100644 src/main/scala/GuessWhoGame/character/EyeColor.scala create mode 100644 src/main/scala/GuessWhoGame/character/Gender.scala create mode 100644 src/main/scala/GuessWhoGame/character/HairColor.scala create mode 100644 src/main/scala/GuessWhoGame/character/PersonWithFacialHair.scala create mode 100644 src/main/scala/GuessWhoGame/character/PersonWithGlasses.scala diff --git a/src/main/scala/GuessWhoGame/Character.scala b/src/main/scala/GuessWhoGame/Character.scala deleted file mode 100644 index 00a7363..0000000 --- a/src/main/scala/GuessWhoGame/Character.scala +++ /dev/null @@ -1,4 +0,0 @@ -package GuessWhoGame - -case class Character(val name: String, val gender: String, val hairColor: String, val eyeColor: String, val wearsGlasses: Boolean, val facialHair: Boolean) - diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index fba3da0..fb41192 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -5,26 +5,7 @@ import scala.io.StdIn object Game extends App { //stored cases for all different types are allowed - certain restricted numbers of colours etc that could be stored and matched - val char1: Character = Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false) - val char2: Character = Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true) - val char3: Character = Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false) - val char4: Character = Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true) - val char5: Character = Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true) - val char6: Character = Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false) - val char7: Character = Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true) - val char8: Character = Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false) - val char9: Character = Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true) - val char10: Character = Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false) - val char11: Character = Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false) - val char12: Character = Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false) - val char13: Character = Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true) - val char14: Character = Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false) - val char15: Character = Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false) - val char16: Character = Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true) - val char17: Character = Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false) - val char18: Character = Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false) - val char19: Character = Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false) - val char20: Character = Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + object Characters extends Enumeration //would remain the same throughout var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) diff --git a/src/main/scala/GuessWhoGame/character/Character.scala b/src/main/scala/GuessWhoGame/character/Character.scala new file mode 100644 index 0000000..3b0672a --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/Character.scala @@ -0,0 +1,11 @@ +package GuessWhoGame.character + +import GuessWhoGame.character.Gender._ +import GuessWhoGame.character.HairColor._ +import GuessWhoGame.character.EyeColor._ +import GuessWhoGame.character.PersonWithGlasses._ +import GuessWhoGame.character.PersonWithFacialHair._ + + +case class Character(name: String, gender: Gender, hairColor: HairColor, eyeColor: EyeColor, wearsGlasses: Option[PersonWithGlasses], facialHair: Option[PersonWithFacialHair]) + diff --git a/src/main/scala/GuessWhoGame/character/CharacterManager.scala b/src/main/scala/GuessWhoGame/character/CharacterManager.scala new file mode 100644 index 0000000..5eb1f6d --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/CharacterManager.scala @@ -0,0 +1,32 @@ +package GuessWhoGame.character + +object CharacterManager { + + import GuessWhoGame.character._ + + def createCharacters(): List[Character] = { + List( + Character("Joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None), + Character("Muhammad", Gender.Male, HairColor.Black, EyeColor.Blue, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), + Character("April", Gender.Female, HairColor.Blonde, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Sally", Gender.Female, HairColor.Blue, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), + Character("Spencer", Gender.Male, HairColor.Blue, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), + Character("Gemma", Gender.Female, HairColor.Red, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Jamie", Gender.Male, HairColor.None, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), + Character("Jessica", Gender.Female, HairColor.Green, EyeColor.Green, None, None), + Character("Bilal", Gender.Male, HairColor.Blue, EyeColor.Green, None, Some(PersonWithFacialHair(true))), + Character("Lisa", Gender.Female, HairColor.Black, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Tom", Gender.Male, HairColor.Blue, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Cheryl", Gender.Female, HairColor.Blonde, EyeColor.Green, None, None), + Character("Arei", Gender.Male, HairColor.Blue, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), + Character("Kelly", Gender.Female, HairColor.None, EyeColor.Green, None, None), + Character("Tayamul", Gender.Male, HairColor.Blue, EyeColor.Blue, None, None), + Character("Elaine", Gender.Female, HairColor.Red, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), + Character("Roshan", Gender.Male, HairColor.Blue, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Patricia", Gender.Female, HairColor.Purple, EyeColor.Yellow, None, None), + Character("Dave", Gender.Male, HairColor.None, EyeColor.Yellow, None, None), + Character("Bobbiana", Gender.Female, HairColor.Blue, EyeColor.Blue, Some(PersonWithGlasses(true)), None) + ) + } + +} diff --git a/src/main/scala/GuessWhoGame/character/EyeColor.scala b/src/main/scala/GuessWhoGame/character/EyeColor.scala new file mode 100644 index 0000000..fbafec2 --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/EyeColor.scala @@ -0,0 +1,6 @@ +package GuessWhoGame.character + +object EyeColor extends Enumeration { + type EyeColor = Value + val Blue, Green, Brown, Yellow = Value +} diff --git a/src/main/scala/GuessWhoGame/character/Gender.scala b/src/main/scala/GuessWhoGame/character/Gender.scala new file mode 100644 index 0000000..c3d3151 --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/Gender.scala @@ -0,0 +1,6 @@ +package GuessWhoGame.character + +object Gender extends Enumeration { + type Gender = Value + val Male, Female = Value +} \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/character/HairColor.scala b/src/main/scala/GuessWhoGame/character/HairColor.scala new file mode 100644 index 0000000..bf712ae --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/HairColor.scala @@ -0,0 +1,6 @@ +package GuessWhoGame.character + +object HairColor extends Enumeration { + type HairColor = Value + val Blonde, Brown, Black, Red, Blue, Green, Purple, None = Value +} \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/character/PersonWithFacialHair.scala b/src/main/scala/GuessWhoGame/character/PersonWithFacialHair.scala new file mode 100644 index 0000000..3bc4f97 --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/PersonWithFacialHair.scala @@ -0,0 +1,4 @@ +package GuessWhoGame.character + +case class PersonWithFacialHair(value: Boolean) { +} diff --git a/src/main/scala/GuessWhoGame/character/PersonWithGlasses.scala b/src/main/scala/GuessWhoGame/character/PersonWithGlasses.scala new file mode 100644 index 0000000..2e599c8 --- /dev/null +++ b/src/main/scala/GuessWhoGame/character/PersonWithGlasses.scala @@ -0,0 +1,5 @@ +package GuessWhoGame.character + +case class PersonWithGlasses(value: Boolean) { + +} From 851ee315bb8b1b69cb4b02e9a18bef6dd7a62035 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 13:12:13 +0100 Subject: [PATCH 26/36] Board logic refactored --- src/main/scala/GuessWhoGame/Board.scala | 174 ++++++++++++------------ 1 file changed, 86 insertions(+), 88 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 0b907e4..4577c37 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -1,34 +1,38 @@ package GuessWhoGame import scala.util.Random +import GuessWhoGame.character._ //values could be more domain specific, name/selecting could be within character case class, then able to test separately -case class Board(characters: List[Character]) { - def printCharacterNames(): Unit = { - characters.foreach(Character => println(Character.name)) +class Board(private val characters: List[Character], private val selectedCharacter: Character) { + def printCharacterNames(): List[String] = { + // characters.foreach(Character => println(Character.name)) + characters.map(_.name) } - val selectedCharacter: Character = selectRandomCharacter(characters) - var remainingCharacters: List[Character] = characters + // val selectedCharacter: Character = selectRandomCharacter(characters) + // var remainingCharacters: List[Character] = characters - def printRemainingCharacters(): Unit = { - remainingCharacters.foreach(Character => println(Character.name)) + def printRemainingCharacters(remainingCharacters: List[Character]): Unit = { + // remainingCharacters.foreach(Character => println(Character.name)) + remainingCharacters.map(_.name) } - def selectRandomCharacter(characters: List[Character]): Character = { - characters(Random.nextInt(characters.size)) - } + def getRemainingCharacters(remainingCharacters: List[Character]): List[Character] = remainingCharacters - //Testing purposes - def getSelectedCharacter: Character = selectedCharacter + def checkWinCondition(remainingCharacters: List[Character]): Boolean = remainingCharacters.size == 1 - def printSelectedCharacter(): Unit = { - println(selectedCharacter.name) + def selectRandomCharacter(characters: List[Character]): Character = { + characters(Random.nextInt(characters.size)) } - def getRemainingCharacters: List[Character] = remainingCharacters + // //Testing purposes + // def getSelectedCharacter: Character = selectedCharacter + // + // def printSelectedCharacter(): Unit = { + // println(selectedCharacter.name) + // } - def checkWinCondition: Boolean = getRemainingCharacters.size == 1 //Future development // def resetBoard(): Unit = { @@ -39,78 +43,72 @@ case class Board(characters: List[Character]) { // var remainingCharacters = characters.filterNot(_ == character) // } - def handleQuestion(attribute: String, value: Either[String, Boolean]): Unit = { - remainingCharacters = attribute match { - case "name" => - value match { - case Left(value) => - if (selectedCharacter.name == value) { - remainingCharacters.filter(_.name == value) - } else { - remainingCharacters.filterNot(_.name == value) - } - case _ => println("Invalid name value added. Try again") - remainingCharacters - } - case "gender" => - value match { - case Left(value) => - if (selectedCharacter.gender == value) { - remainingCharacters.filter(_.gender == value) - } else { - remainingCharacters.filterNot(_.gender == value) - } - case _ => println("Invalid gender value added. Try again") - remainingCharacters - } - case "hairColor" => - value match { - case Left(value) => - if (selectedCharacter.hairColor == value) { - remainingCharacters.filter(_.hairColor == value) - } - else { - remainingCharacters.filterNot(_.hairColor == value) - } - case _ => println("Invalid hair colour value added. Try again") - remainingCharacters - } - case "eyeColor" => - value match { - case Left(value) => - if (selectedCharacter.eyeColor == value) { - remainingCharacters.filter(_.eyeColor == value) - } - else { - remainingCharacters.filterNot(_.eyeColor == value) - } - case _ => println("Invalid eye colour value added. Try again") - remainingCharacters - } - case "wearsGlasses" => - value match { - case Right(value) => - if (selectedCharacter.wearsGlasses == value) { - remainingCharacters.filter(_.wearsGlasses == value) - } - else { - remainingCharacters.filterNot(_.wearsGlasses == value) - } - case _ => println("Invalid glasses value added. Try again") - remainingCharacters - } - case "hasFacialHair" => - value match { - case Right(value) => - if (selectedCharacter.facialHair == value) { - remainingCharacters.filter(_.facialHair == value) - } - else { - remainingCharacters.filterNot(_.facialHair == value) - } - case _ => println("Invalid facial hair value added. Try again") - remainingCharacters - } + def handleQuestion(attribute: String, value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + attribute match { + case "name" => filterByName(value, remainingCharacters) + case "gender" => filterByGender(value, remainingCharacters) + case "hairColor" => filterByHairColor(value, remainingCharacters) + case "eyeColor" => filterByEyeColor(value, remainingCharacters) + case "wearsGlasses" => filterByWearGlasses(value, remainingCharacters) + case "hasFacialHair" => filterByFacialHair(value, remainingCharacters) + case _ => + println("Invalid attribute. Try again.") + remainingCharacters } } + + private def filterByName(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Left(name) => remainingCharacters.filter(_.name == name) + case _ => + println("Invalid name value added. Try again.") + remainingCharacters + } + } + + private def filterByGender(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Left(gender) => remainingCharacters.filter(_.gender.toString == gender) + case _ => + println("Invalid gender value added. Try again.") + remainingCharacters + } + } + + private def filterByHairColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Left(hairColor) => remainingCharacters.filter(_.hairColor.toString == hairColor) + case _ => + println("Invalid hair color value added. Try again.") + remainingCharacters + } + } + + private def filterByEyeColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Left(eyeColor) => remainingCharacters.filter(_.eyeColor.toString == eyeColor) + case _ => + println("Invalid eye color value added. Try again.") + remainingCharacters + } + } + + private def filterByWearGlasses(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Right(wearsGlasses) => remainingCharacters.filter(_.wearsGlasses.exists(_.value == wearsGlasses)) + case _ => + println("Invalid glasses value added. Try again.") + remainingCharacters + } + } + + private def filterByFacialHair(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + value match { + case Right(facialHair) => remainingCharacters.filter(_.facialHair.exists(_.value == facialHair)) + case _ => + println("Invalid facial hair value added. Try again.") + remainingCharacters + } + } + } \ No newline at end of file From 2c78d5ca9774152b6657a651c7f2ebcc617cecc2 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 13:44:36 +0100 Subject: [PATCH 27/36] Game object refactored --- src/main/scala/GuessWhoGame/Board.scala | 2 +- src/main/scala/GuessWhoGame/Game.scala | 114 ++++++++++++++---------- 2 files changed, 67 insertions(+), 49 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 4577c37..6e00290 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -4,7 +4,7 @@ import scala.util.Random import GuessWhoGame.character._ //values could be more domain specific, name/selecting could be within character case class, then able to test separately -class Board(private val characters: List[Character], private val selectedCharacter: Character) { +class Board(val characters: List[Character], val selectedCharacter: Character) { def printCharacterNames(): List[String] = { // characters.foreach(Character => println(Character.name)) characters.map(_.name) diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index fb41192..52b4292 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -2,74 +2,92 @@ package GuessWhoGame import scala.util.Random import scala.io.StdIn +import GuessWhoGame.character._ +import GuessWhoGame._ -object Game extends App { - //stored cases for all different types are allowed - certain restricted numbers of colours etc that could be stored and matched - object Characters extends Enumeration +import scala.annotation.tailrec - //would remain the same throughout - var gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) +object Game extends App { - def startGame(): Unit = { - gameBoard.printCharacterNames() + def createGameBoard(): Board = { + val characters = CharacterManager.createCharacters() + val selectedCharacter = Board.selectRandomCharacter(characters) + new Board(characters, selectedCharacter) + } - //Building out game to terminal + def startGame(board: Board): Board = { println("Welcome to the Guess Who game!") println("Try to guess the character by asking some questions...") + println("Available characters:") + board.printCharacterNames().foreach(println) - playGame() + val remainingCharacters = playGame(board, board.characters) println("\nDo you want to play again? (yes/no)") - val playAgain = scala.io.StdIn.readLine().toLowerCase() + val playAgain = StdIn.readLine().toLowerCase() if (playAgain == "yes" || playAgain == "y") { - gameBoard = Board(List(char1, char2, char3, char4, char5, char6, char7, char8, char9, char10, char11, char12, char13, char14, char15, char16, char17, char18, char19, char20)) - startGame() + createGameBoard() } else { println("Thanks for playing Guess Who!") + board } } - //Game loop - def playGame(): Unit = { - while (!gameBoard.checkWinCondition) { - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() - - println("\nEnter a hair colour that you want to guess:") - val hairInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("hairColor", Left(hairInput)) - - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() - - println("\nEnter an eye colour that you want to guess:") - val eyeInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("eyeColor", Left(eyeInput)) - - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() - - println("\nEnter a gender that you want to guess (male/female):") - val genderInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("gender", Left(genderInput)) + @tailrec + def playGame(board: Board, remainingCharacters: List[Character]): List[Character] = { + if (board.checkWinCondition(remainingCharacters)) { + println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") + remainingCharacters + } else { + println("\nRemaining Characters:") + board.printRemainingCharacters(remainingCharacters).foreach(println) - println("\nRemaining characters:") - gameBoard.printRemainingCharacters() + val newRemainingCharacters = askQuestion(board, remainingCharacters) - if (!gameBoard.checkWinCondition) { - println("\nEnter a name that you want to guess:") - val nameInput = scala.io.StdIn.readLine().toLowerCase() - gameBoard.handleQuestion("name", Left(nameInput)) + playGame(board, newRemainingCharacters) + } + } - if (gameBoard.checkWinCondition && gameBoard.getSelectedCharacter.name == (nameInput)) { - println(s"\nCongratulations, You guessed correctly. The character was ${gameBoard.getSelectedCharacter.name}.") + def askQuestion(board: Board, characters: List[Character]): List[Character] = { + println("\nEnter an attribute (hairColor, eyeColor, gender, wearsGlasses, hasFacialHair) to guess or 'name' to guess the character:") + val attribute = StdIn.readLine().toLowerCase() + attribute match { + case "haircolor" => + println("Enter the hair color:") + val hairColor = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(hairColor), remainingCharacters) + case "eyecolor" => + println("Enter the eye color:") + val eyeColor = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(eyeColor), remainingCharacters) + case "gender" => + println("Enter the gender (male/female):") + val gender = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(gender), remainingCharacters) + case "wearsglasses" => + println("Does the character wear glasses? (true/false):") + val wearsGlasses = StdIn.readLine().toLowerCase().toBoolean + board.handleQuestion(attribute, Right(wearsGlasses), remainingCharacters) + case "hasfacialhair" => + println("Does the character have facial hair? (true/false):") + val hasFacialHair = StdIn.readLine().toLowerCase().toBoolean + board.handleQuestion(attribute, Right(hasFacialHair), remainingCharacters) + case "name" => + println("Enter the name of the character:") + val name = StdIn.readLine().toLowerCase() + val newRemainingCharacters = board.handleQuestion(attribute, Left(name), remainingCharacters) + if (board.checkWinCondition(newRemainingCharacters) && board.selectedCharacter.name.equalsIgnoreCase(name)) { + println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") } else { - println(s"\nGame over, you guessed incorrectly. The character was ${gameBoard.getSelectedCharacter.name}.") + println(s"\nGame over, you guessed incorrectly. The character was ${board.selectedCharacter.name}.") } - } + newRemainingCharacters + case _ => + println("Invalid attribute. Try again.") + remainingCharacters } } - startGame() -} - + val initialBoard = createGameBoard() + startGame(initialBoard) +} \ No newline at end of file From 7060122f151fc6c5331720c8247b31cd07503e95 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 14:31:26 +0100 Subject: [PATCH 28/36] Game refactor --- src/main/scala/GuessWhoGame/Board.scala | 82 +++-------- src/main/scala/GuessWhoGame/Game.scala | 133 +++++++++--------- .../character/CharacterManager.scala | 5 + 3 files changed, 95 insertions(+), 125 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Board.scala b/src/main/scala/GuessWhoGame/Board.scala index 6e00290..c850c87 100644 --- a/src/main/scala/GuessWhoGame/Board.scala +++ b/src/main/scala/GuessWhoGame/Board.scala @@ -3,18 +3,12 @@ package GuessWhoGame import scala.util.Random import GuessWhoGame.character._ -//values could be more domain specific, name/selecting could be within character case class, then able to test separately class Board(val characters: List[Character], val selectedCharacter: Character) { def printCharacterNames(): List[String] = { - // characters.foreach(Character => println(Character.name)) characters.map(_.name) } - // val selectedCharacter: Character = selectRandomCharacter(characters) - // var remainingCharacters: List[Character] = characters - - def printRemainingCharacters(remainingCharacters: List[Character]): Unit = { - // remainingCharacters.foreach(Character => println(Character.name)) + def printRemainingCharacters(remainingCharacters: List[Character]): List[String] = { remainingCharacters.map(_.name) } @@ -22,93 +16,59 @@ class Board(val characters: List[Character], val selectedCharacter: Character) { def checkWinCondition(remainingCharacters: List[Character]): Boolean = remainingCharacters.size == 1 - def selectRandomCharacter(characters: List[Character]): Character = { - characters(Random.nextInt(characters.size)) - } - - // //Testing purposes - // def getSelectedCharacter: Character = selectedCharacter - // - // def printSelectedCharacter(): Unit = { - // println(selectedCharacter.name) - // } - - - //Future development - // def resetBoard(): Unit = { - // remainingCharacters = characters - // } - - // def eliminateCharacter(character: Character): Unit = { - // var remainingCharacters = characters.filterNot(_ == character) - // } - def handleQuestion(attribute: String, value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { attribute match { case "name" => filterByName(value, remainingCharacters) case "gender" => filterByGender(value, remainingCharacters) - case "hairColor" => filterByHairColor(value, remainingCharacters) - case "eyeColor" => filterByEyeColor(value, remainingCharacters) - case "wearsGlasses" => filterByWearGlasses(value, remainingCharacters) - case "hasFacialHair" => filterByFacialHair(value, remainingCharacters) + case "haircolor" => filterByHairColor(value, remainingCharacters) + case "eyecolor" => filterByEyeColor(value, remainingCharacters) + case "wearsglasses" => filterByWearGlasses(value, remainingCharacters) + case "hasfacialhair" => filterByFacialHair(value, remainingCharacters) case _ => println("Invalid attribute. Try again.") remainingCharacters } } - private def filterByName(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByName(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { - case Left(name) => remainingCharacters.filter(_.name == name) - case _ => - println("Invalid name value added. Try again.") - remainingCharacters + case Left(name) => remainingCharacters.filter(_.name.equalsIgnoreCase(name)) + case _ => remainingCharacters } } - private def filterByGender(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByGender(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { - case Left(gender) => remainingCharacters.filter(_.gender.toString == gender) - case _ => - println("Invalid gender value added. Try again.") - remainingCharacters + case Left(gender) => remainingCharacters.filter(_.gender.toString.equalsIgnoreCase(gender)) + case _ => remainingCharacters } } - private def filterByHairColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByHairColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { - case Left(hairColor) => remainingCharacters.filter(_.hairColor.toString == hairColor) - case _ => - println("Invalid hair color value added. Try again.") - remainingCharacters + case Left(hairColor) => remainingCharacters.filter(_.hairColor.toString.equalsIgnoreCase(hairColor)) + case _ => remainingCharacters } } - private def filterByEyeColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByEyeColor(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { - case Left(eyeColor) => remainingCharacters.filter(_.eyeColor.toString == eyeColor) - case _ => - println("Invalid eye color value added. Try again.") - remainingCharacters + case Left(eyeColor) => remainingCharacters.filter(_.eyeColor.toString.equalsIgnoreCase(eyeColor)) + case _ => remainingCharacters } } - private def filterByWearGlasses(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByWearGlasses(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { case Right(wearsGlasses) => remainingCharacters.filter(_.wearsGlasses.exists(_.value == wearsGlasses)) - case _ => - println("Invalid glasses value added. Try again.") - remainingCharacters + case _ => remainingCharacters } } - private def filterByFacialHair(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { + def filterByFacialHair(value: Either[String, Boolean], remainingCharacters: List[Character]): List[Character] = { value match { case Right(facialHair) => remainingCharacters.filter(_.facialHair.exists(_.value == facialHair)) - case _ => - println("Invalid facial hair value added. Try again.") - remainingCharacters + case _ => remainingCharacters } } - } \ No newline at end of file diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index 52b4292..eeb6ee4 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -3,91 +3,96 @@ package GuessWhoGame import scala.util.Random import scala.io.StdIn import GuessWhoGame.character._ -import GuessWhoGame._ - import scala.annotation.tailrec object Game extends App { def createGameBoard(): Board = { val characters = CharacterManager.createCharacters() - val selectedCharacter = Board.selectRandomCharacter(characters) + val selectedCharacter = CharacterManager.selectRandomCharacter(characters) new Board(characters, selectedCharacter) } - def startGame(board: Board): Board = { + def startGame(board: Board): Unit = { println("Welcome to the Guess Who game!") println("Try to guess the character by asking some questions...") println("Available characters:") board.printCharacterNames().foreach(println) - val remainingCharacters = playGame(board, board.characters) + @tailrec + def playGame(remainingCharacters: List[Character]): Unit = { + if (board.checkWinCondition(remainingCharacters)) { + println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") + } else { + println("\nRemaining Characters:") + board.printRemainingCharacters(remainingCharacters).foreach(println) - println("\nDo you want to play again? (yes/no)") - val playAgain = StdIn.readLine().toLowerCase() - if (playAgain == "yes" || playAgain == "y") { - createGameBoard() - } else { - println("Thanks for playing Guess Who!") - board + val newRemainingCharacters = askQuestion(remainingCharacters) + playGame(newRemainingCharacters) + } } - } - - @tailrec - def playGame(board: Board, remainingCharacters: List[Character]): List[Character] = { - if (board.checkWinCondition(remainingCharacters)) { - println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") - remainingCharacters - } else { - println("\nRemaining Characters:") - board.printRemainingCharacters(remainingCharacters).foreach(println) - val newRemainingCharacters = askQuestion(board, remainingCharacters) - - playGame(board, newRemainingCharacters) + def askQuestion(remainingCharacters: List[Character]): List[Character] = { + println("\nEnter an attribute (hairColor, eyeColor, gender, wearsGlasses, hasFacialHair) to guess or 'name' to guess the character:") + val attribute = StdIn.readLine().toLowerCase() + attribute match { + case "haircolor" => + println("Enter the hair color:") + val hairColor = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(hairColor), remainingCharacters) + case "eyecolor" => + println("Enter the eye color:") + val eyeColor = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(eyeColor), remainingCharacters) + case "gender" => + println("Enter the gender (male/female):") + val gender = StdIn.readLine().toLowerCase() + board.handleQuestion(attribute, Left(gender), remainingCharacters) + case "wearsglasses" => + println("Does the character wear glasses? (true/false):") + val wearsGlasses = StdIn.readLine().toLowerCase().toBoolean + board.handleQuestion(attribute, Right(wearsGlasses), remainingCharacters) + case "hasfacialhair" => + println("Does the character have facial hair? (true/false):") + val hasFacialHair = StdIn.readLine().toLowerCase().toBoolean + board.handleQuestion(attribute, Right(hasFacialHair), remainingCharacters) + case "name" => + println("Enter the name of the character:") + val name = StdIn.readLine().toLowerCase() + val newRemainingCharacters = board.handleQuestion(attribute, Left(name), remainingCharacters) + if (board.checkWinCondition(newRemainingCharacters) && board.selectedCharacter.name.equalsIgnoreCase(name)) { + println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") + } else { + println(s"\nGame over, you guessed incorrectly. The character was ${board.selectedCharacter.name}.") + } + newRemainingCharacters + case _ => + println("Invalid attribute. Try again.") + remainingCharacters + } } - } - def askQuestion(board: Board, characters: List[Character]): List[Character] = { - println("\nEnter an attribute (hairColor, eyeColor, gender, wearsGlasses, hasFacialHair) to guess or 'name' to guess the character:") - val attribute = StdIn.readLine().toLowerCase() - attribute match { - case "haircolor" => - println("Enter the hair color:") - val hairColor = StdIn.readLine().toLowerCase() - board.handleQuestion(attribute, Left(hairColor), remainingCharacters) - case "eyecolor" => - println("Enter the eye color:") - val eyeColor = StdIn.readLine().toLowerCase() - board.handleQuestion(attribute, Left(eyeColor), remainingCharacters) - case "gender" => - println("Enter the gender (male/female):") - val gender = StdIn.readLine().toLowerCase() - board.handleQuestion(attribute, Left(gender), remainingCharacters) - case "wearsglasses" => - println("Does the character wear glasses? (true/false):") - val wearsGlasses = StdIn.readLine().toLowerCase().toBoolean - board.handleQuestion(attribute, Right(wearsGlasses), remainingCharacters) - case "hasfacialhair" => - println("Does the character have facial hair? (true/false):") - val hasFacialHair = StdIn.readLine().toLowerCase().toBoolean - board.handleQuestion(attribute, Right(hasFacialHair), remainingCharacters) - case "name" => - println("Enter the name of the character:") - val name = StdIn.readLine().toLowerCase() - val newRemainingCharacters = board.handleQuestion(attribute, Left(name), remainingCharacters) - if (board.checkWinCondition(newRemainingCharacters) && board.selectedCharacter.name.equalsIgnoreCase(name)) { - println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") - } else { - println(s"\nGame over, you guessed incorrectly. The character was ${board.selectedCharacter.name}.") - } - newRemainingCharacters - case _ => - println("Invalid attribute. Try again.") - remainingCharacters + @tailrec + def replayOrExit(): Unit = { + println("\nDo you want to play again? (yes/no)") + val playAgain = StdIn.readLine().toLowerCase() + playAgain match { + case "yes" | "y" => + println("Starting a new game...") + val newBoard = createGameBoard() + startGame(newBoard) + case "no" | "n" => + println("Thanks for playing Guess Who!") + case _ => + println("Invalid response. Please type 'yes' or 'no'.") + replayOrExit() + } } + + playGame(board.characters) + replayOrExit() } val initialBoard = createGameBoard() startGame(initialBoard) -} \ No newline at end of file +} diff --git a/src/main/scala/GuessWhoGame/character/CharacterManager.scala b/src/main/scala/GuessWhoGame/character/CharacterManager.scala index 5eb1f6d..b6f9b2c 100644 --- a/src/main/scala/GuessWhoGame/character/CharacterManager.scala +++ b/src/main/scala/GuessWhoGame/character/CharacterManager.scala @@ -1,5 +1,7 @@ package GuessWhoGame.character +import scala.util.Random + object CharacterManager { import GuessWhoGame.character._ @@ -29,4 +31,7 @@ object CharacterManager { ) } + def selectRandomCharacter(characters: List[Character]): Character = { + characters(Random.nextInt(characters.size)) + } } From f313ae07abdc012c59ce644c2c4e211d6c8ae4df Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 14:46:35 +0100 Subject: [PATCH 29/36] update --- src/main/scala/GuessWhoGame/Game.scala | 6 +++--- .../GuessWhoGame/character/CharacterManager.scala | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/scala/GuessWhoGame/Game.scala b/src/main/scala/GuessWhoGame/Game.scala index eeb6ee4..94b57d7 100644 --- a/src/main/scala/GuessWhoGame/Game.scala +++ b/src/main/scala/GuessWhoGame/Game.scala @@ -58,9 +58,9 @@ object Game extends App { board.handleQuestion(attribute, Right(hasFacialHair), remainingCharacters) case "name" => println("Enter the name of the character:") - val name = StdIn.readLine().toLowerCase() - val newRemainingCharacters = board.handleQuestion(attribute, Left(name), remainingCharacters) - if (board.checkWinCondition(newRemainingCharacters) && board.selectedCharacter.name.equalsIgnoreCase(name)) { + val nameInput = StdIn.readLine().toLowerCase() + val newRemainingCharacters = board.handleQuestion(attribute, Left(nameInput), remainingCharacters) + if (board.checkWinCondition(newRemainingCharacters) && board.selectedCharacter.name.equalsIgnoreCase(nameInput)) { println(s"\nCongratulations, You guessed correctly. The character was ${board.selectedCharacter.name}.") } else { println(s"\nGame over, you guessed incorrectly. The character was ${board.selectedCharacter.name}.") diff --git a/src/main/scala/GuessWhoGame/character/CharacterManager.scala b/src/main/scala/GuessWhoGame/character/CharacterManager.scala index b6f9b2c..473d2ff 100644 --- a/src/main/scala/GuessWhoGame/character/CharacterManager.scala +++ b/src/main/scala/GuessWhoGame/character/CharacterManager.scala @@ -11,16 +11,16 @@ object CharacterManager { Character("Joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None), Character("Muhammad", Gender.Male, HairColor.Black, EyeColor.Blue, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), Character("April", Gender.Female, HairColor.Blonde, EyeColor.Blue, Some(PersonWithGlasses(true)), None), - Character("Sally", Gender.Female, HairColor.Blue, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), - Character("Spencer", Gender.Male, HairColor.Blue, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), + Character("Sally", Gender.Female, HairColor.Black, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), + Character("Spencer", Gender.Male, HairColor.Black, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), Character("Gemma", Gender.Female, HairColor.Red, EyeColor.Blue, Some(PersonWithGlasses(true)), None), Character("Jamie", Gender.Male, HairColor.None, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))), Character("Jessica", Gender.Female, HairColor.Green, EyeColor.Green, None, None), - Character("Bilal", Gender.Male, HairColor.Blue, EyeColor.Green, None, Some(PersonWithFacialHair(true))), + Character("Bilal", Gender.Male, HairColor.Black, EyeColor.Green, None, Some(PersonWithFacialHair(true))), Character("Lisa", Gender.Female, HairColor.Black, EyeColor.Blue, Some(PersonWithGlasses(true)), None), - Character("Tom", Gender.Male, HairColor.Blue, EyeColor.Blue, Some(PersonWithGlasses(true)), None), + Character("Tom", Gender.Male, HairColor.Black, EyeColor.Blue, Some(PersonWithGlasses(true)), None), Character("Cheryl", Gender.Female, HairColor.Blonde, EyeColor.Green, None, None), - Character("Arei", Gender.Male, HairColor.Blue, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), + Character("Arei", Gender.Male, HairColor.Black, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), Character("Kelly", Gender.Female, HairColor.None, EyeColor.Green, None, None), Character("Tayamul", Gender.Male, HairColor.Blue, EyeColor.Blue, None, None), Character("Elaine", Gender.Female, HairColor.Red, EyeColor.Blue, None, Some(PersonWithFacialHair(true))), From a28e99eb708d34d55da5825962b087684912da6c Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Tue, 23 Jul 2024 14:55:55 +0100 Subject: [PATCH 30/36] tests added --- .../scala/GuessWhoGameSpec/GameSpec.scala | 89 ++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/src/test/scala/GuessWhoGameSpec/GameSpec.scala b/src/test/scala/GuessWhoGameSpec/GameSpec.scala index 8d8fcdc..55dd7d5 100644 --- a/src/test/scala/GuessWhoGameSpec/GameSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameSpec.scala @@ -1,6 +1,93 @@ package GuessWhoGameSpec + import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers +import GuessWhoGame.character._ +import GuessWhoGame._ +import scala.util.Random + +class GameSpec extends AnyFlatSpec with Matchers { + + "A Character" should "have correct attributes" in { + val char = Character("joe", Male, Brown, BlueEye, PersonWithGlasses(false), PersonWithFacialHair(false)) + char.name should be ("joe") + char.gender should be (Male) + char.hairColor should be (Brown) + char.eyeColor should be (BlueEye) + char.wearsGlasses.value should be (false) + char.facialHair.value should be (false) + } + + "CharacterManager" should "create a list of characters" in { + val characters = CharacterManager.createCharacters() + characters should have size 20 + } + + it should "select a random character from the list" in { + val characters = CharacterManager.createCharacters() + val selectedCharacter = CharacterManager.selectRandomCharacter(characters) + characters should contain (selectedCharacter) + } + + "Board" should "print character names" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + board.printCharacterNames().length should be (20) + } + + it should "handle hair color question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("hairColor", Left("brown"), characters) + remainingCharacters shouldBe a [List[_]] + } + + it should "handle eye color question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("eyeColor", Left("blue"), characters) + remainingCharacters shouldBe a [List[_]] + } + + it should "handle gender question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("gender", Left("male"), characters) + remainingCharacters shouldBe a [List[_]] + } + + it should "handle wears glasses question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("wearsGlasses", Right(true), characters) + remainingCharacters shouldBe a [List[_]] + } + + it should "handle facial hair question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("hasFacialHair", Right(true), characters) + remainingCharacters shouldBe a [List[_]] + } + + it should "handle name guess correctly" in { + val characters = CharacterManager.createCharacters() + val selectedCharacter = characters.head + val board = new Board(characters, selectedCharacter) + val remainingCharacters = board.handleQuestion("name", Left(selectedCharacter.name.toLowerCase()), characters) + board.checkWinCondition(remainingCharacters) should be (true) + } -object GameSpec extends AnyFlatSpec { + "Game" should "create a game board" in { + val board = Game.createGameBoard() + board.characters should have size 20 + board.selectedCharacter should not be null + } + it should "start and play the game" in { + noException should be thrownBy { + val board = Game.createGameBoard() + Game.startGame(board) + } + } } From c90cb8043d4cfcd5f4072990e83e69d33c13cadd Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 15:26:44 +0100 Subject: [PATCH 31/36] Test edit --- .../scala/GuessWhoGameSpec/GameSpec.scala | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/scala/GuessWhoGameSpec/GameSpec.scala b/src/test/scala/GuessWhoGameSpec/GameSpec.scala index 55dd7d5..94af262 100644 --- a/src/test/scala/GuessWhoGameSpec/GameSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameSpec.scala @@ -9,13 +9,13 @@ import scala.util.Random class GameSpec extends AnyFlatSpec with Matchers { "A Character" should "have correct attributes" in { - val char = Character("joe", Male, Brown, BlueEye, PersonWithGlasses(false), PersonWithFacialHair(false)) - char.name should be ("joe") - char.gender should be (Male) - char.hairColor should be (Brown) - char.eyeColor should be (BlueEye) - char.wearsGlasses.value should be (false) - char.facialHair.value should be (false) + val char = Character("joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None) + char.name should be("joe") + char.gender should be(Gender.Male) + char.hairColor should be(HairColor.Brown) + char.eyeColor should be(EyeColor.BlueEye) + char.wearsGlasses.value should be None + char.facialHair.value should be None } "CharacterManager" should "create a list of characters" in { @@ -26,48 +26,48 @@ class GameSpec extends AnyFlatSpec with Matchers { it should "select a random character from the list" in { val characters = CharacterManager.createCharacters() val selectedCharacter = CharacterManager.selectRandomCharacter(characters) - characters should contain (selectedCharacter) + characters should contain(selectedCharacter) } "Board" should "print character names" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) - board.printCharacterNames().length should be (20) + board.printCharacterNames().length should be(20) } it should "handle hair color question correctly" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) val remainingCharacters = board.handleQuestion("hairColor", Left("brown"), characters) - remainingCharacters shouldBe a [List[_]] + remainingCharacters shouldBe a[List[_]] } it should "handle eye color question correctly" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) val remainingCharacters = board.handleQuestion("eyeColor", Left("blue"), characters) - remainingCharacters shouldBe a [List[_]] + remainingCharacters shouldBe a[List[_]] } it should "handle gender question correctly" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) val remainingCharacters = board.handleQuestion("gender", Left("male"), characters) - remainingCharacters shouldBe a [List[_]] + remainingCharacters shouldBe a[List[_]] } it should "handle wears glasses question correctly" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) val remainingCharacters = board.handleQuestion("wearsGlasses", Right(true), characters) - remainingCharacters shouldBe a [List[_]] + remainingCharacters shouldBe a[List[_]] } it should "handle facial hair question correctly" in { val characters = CharacterManager.createCharacters() val board = new Board(characters, characters.head) val remainingCharacters = board.handleQuestion("hasFacialHair", Right(true), characters) - remainingCharacters shouldBe a [List[_]] + remainingCharacters shouldBe a[List[_]] } it should "handle name guess correctly" in { @@ -75,7 +75,7 @@ class GameSpec extends AnyFlatSpec with Matchers { val selectedCharacter = characters.head val board = new Board(characters, selectedCharacter) val remainingCharacters = board.handleQuestion("name", Left(selectedCharacter.name.toLowerCase()), characters) - board.checkWinCondition(remainingCharacters) should be (true) + board.checkWinCondition(remainingCharacters) should be(true) } "Game" should "create a game board" in { From c0cc4c59c4017daa1ed7d6e6e6af998fe46e0f7b Mon Sep 17 00:00:00 2001 From: Muhammad Mulla Date: Tue, 23 Jul 2024 15:30:16 +0100 Subject: [PATCH 32/36] EyeColor.Blue --- src/test/scala/GuessWhoGameSpec/GameSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/GuessWhoGameSpec/GameSpec.scala b/src/test/scala/GuessWhoGameSpec/GameSpec.scala index 94af262..bce203f 100644 --- a/src/test/scala/GuessWhoGameSpec/GameSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameSpec.scala @@ -13,7 +13,7 @@ class GameSpec extends AnyFlatSpec with Matchers { char.name should be("joe") char.gender should be(Gender.Male) char.hairColor should be(HairColor.Brown) - char.eyeColor should be(EyeColor.BlueEye) + char.eyeColor should be(EyeColor.Blue) char.wearsGlasses.value should be None char.facialHair.value should be None } From 31d73e5a3af8fbd48a01521d8fd0c50eb2abcde3 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 15:41:57 +0100 Subject: [PATCH 33/36] Testing for new elements --- .../CharacterManagerSpec.scala | 50 ++++++++++++++ .../GuessWhoGameSpec/CharacterSpec.scala | 66 +++++++++++-------- 2 files changed, 88 insertions(+), 28 deletions(-) create mode 100644 src/test/scala/GuessWhoGameSpec/CharacterManagerSpec.scala diff --git a/src/test/scala/GuessWhoGameSpec/CharacterManagerSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterManagerSpec.scala new file mode 100644 index 0000000..e750bf3 --- /dev/null +++ b/src/test/scala/GuessWhoGameSpec/CharacterManagerSpec.scala @@ -0,0 +1,50 @@ +package GuessWhoGameSpec + +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatest.matchers.should.Matchers._ +import GuessWhoGame.character._ + +class CharacterManagerSpec extends AnyFlatSpec { + + "createCharacters" should "return a list of 20 characters" in { + val characters = CharacterManager.createCharacters() + characters should have size 20 + } + + "createCharacters" should "return characters with unique names" in { + val characters = CharacterManager.createCharacters() + val names = characters.map(_.name) + names.distinct shouldEqual names + } + + "createCharacters" should "return characters with correct attributes" in { + val characters = CharacterManager.createCharacters() + + characters.find(_.name == "Muhammad") shouldBe defined + characters.find(_.name == "Muhammad").get.gender shouldEqual Gender.Male + characters.find(_.name == "Muhammad").get.hairColor shouldEqual HairColor.Black + characters.find(_.name == "Muhammad").get.eyeColor shouldEqual EyeColor.Blue + characters.find(_.name == "Muhammad").get.wearsGlasses shouldEqual Some(PersonWithGlasses(true)) + characters.find(_.name == "Muhammad").get.facialHair shouldEqual Some(PersonWithFacialHair(true)) + } + + "selectRandomCharacter" should "return a character from the list" in { + val characters = CharacterManager.createCharacters() + val selectedCharacter = CharacterManager.selectRandomCharacter(characters) + characters should contain(selectedCharacter) + } + + "selectRandomCharacter" should "return a different character on multiple calls" in { + val characters = CharacterManager.createCharacters() + val selectedCharacter1 = CharacterManager.selectRandomCharacter(characters) + val selectedCharacter2 = CharacterManager.selectRandomCharacter(characters) + selectedCharacter1 should not equal selectedCharacter2 + } + + "selectRandomCharacter" should "throw an exception if the list is empty" in { + val emptyList = List.empty[Character] + assertThrows[NoSuchElementException] { + CharacterManager.selectRandomCharacter(emptyList) + } + } +} \ No newline at end of file diff --git a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala index 5e28221..0e4ad3f 100644 --- a/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/CharacterSpec.scala @@ -1,34 +1,44 @@ -package GuessWhoGame - import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers._ +import GuessWhoGame.character._ +import GuessWhoGame.Board class CharacterSpec extends AnyFlatSpec { - val characters: List[Character] = List( - Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), - Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), - Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), - Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), - Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), - Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), - Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), - Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), - Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), - Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), - Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), - Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), - Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) - ) - "GuessWhoGame" should "initialise with 20 characters on the board" in { - val game = new Board(characters) - game.getRemainingCharacters.size shouldEqual 20 + // Test data for individual characters + val Joe = Character("Joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None) + val Muhammad = Character("Muhammad", Gender.Male, HairColor.Black, EyeColor.Brown, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))) + val April = Character("April", Gender.Female, HairColor.Blonde, EyeColor.Blue, Some(PersonWithGlasses(true)), None) + val Sally = Character("Sally", Gender.Female, HairColor.Blue, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))) + val Gemma = Character("Gemma", Gender.Female, HairColor.Red, EyeColor.Blue, Some(PersonWithGlasses(true)), None) + + "Board" should "initialise correctly with Joe" in { + val board = new Board(List(Joe), Joe) + board.characters should contain theSameElementsAs List(Joe) + board.selectedCharacter shouldBe Joe + } + + "Board" should "initialise correctly with Muhammad" in { + val board = new Board(List(Muhammad), Muhammad) + board.characters should contain theSameElementsAs List(Muhammad) + board.selectedCharacter shouldBe Muhammad + } + + "Board" should "initialise correctly with April" in { + val board = new Board(List(April), April) + board.characters should contain theSameElementsAs List(April) + board.selectedCharacter shouldBe April + } + + "Board" should "initialise correctly with Sally" in { + val board = new Board(List(Sally), Sally) + board.characters should contain theSameElementsAs List(Sally) + board.selectedCharacter shouldBe Sally + } + + "Board" should "initialise correctly with Gemma" in { + val board = new Board(List(Gemma), Gemma) + board.characters should contain theSameElementsAs List(Gemma) + board.selectedCharacter shouldBe Gemma } -} +} \ No newline at end of file From 3ce5ae1e18631e7e6160a65600e423f9dee889a0 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Tue, 23 Jul 2024 15:44:28 +0100 Subject: [PATCH 34/36] note added --- .../scala/GuessWhoGameSpec/BoardSpec.scala | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index d7dc240..061780b 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -6,28 +6,29 @@ import org.scalatest.matchers.should.Matchers._ class BoardSpec extends AnyFlatSpec { - val characters: List[Character] = List( - Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), - Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), - Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), - Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), - Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), - Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), - Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), - Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), - Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), - Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), - Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), - Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), - Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) - ) + //NOT NEEDED, CALL CREATECHARACTERS METHOD INSTEAD + // val characters: List[Character] = List( + // Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + // Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), + // Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), + // Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), + // Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + // Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), + // Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), + // Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), + // Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), + // Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), + // Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + // Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), + // Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), + // Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), + // Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), + // Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), + // Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), + // Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), + // Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), + // Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) + // ) //prints out characters onto the board "gameBoard" should "initialise with the provided characters" in { From 9745878723019b8fc8b299543522358aac9abbc1 Mon Sep 17 00:00:00 2001 From: Joe Higgs Date: Wed, 24 Jul 2024 09:50:08 +0100 Subject: [PATCH 35/36] Testing refinement (boardspec unfinished) --- .../scala/GuessWhoGameSpec/BoardSpec.scala | 82 +++++++++++++------ .../scala/GuessWhoGameSpec/GameSpec.scala | 64 ++------------- 2 files changed, 64 insertions(+), 82 deletions(-) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index 061780b..bc6cf6e 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -1,35 +1,12 @@ package GuessWhoGameSpec import GuessWhoGame._ +import GuessWhoGame.character.{CharacterManager, EyeColor, Gender, HairColor, PersonWithFacialHair, PersonWithGlasses} import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers._ class BoardSpec extends AnyFlatSpec { - - //NOT NEEDED, CALL CREATECHARACTERS METHOD INSTEAD - // val characters: List[Character] = List( - // Character("joe", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - // Character("muhammad", "male", "black", "brown", wearsGlasses = true, facialHair = true), - // Character("april", "female", "blonde", "blue", wearsGlasses = true, facialHair = false), - // Character("sally", "female", "blue", "green", wearsGlasses = true, facialHair = true), - // Character("spencer", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - // Character("gemma", "female", "ginger", "blue", wearsGlasses = true, facialHair = false), - // Character("jamie", "male", "none", "green", wearsGlasses = true, facialHair = true), - // Character("jessica", "female", "green", "green", wearsGlasses = false, facialHair = false), - // Character("bilal", "male", "brown", "green", wearsGlasses = false, facialHair = true), - // Character("lisa", "female", "black", "brown", wearsGlasses = true, facialHair = false), - // Character("tom", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - // Character("cheryl", "female", "blonde", "green", wearsGlasses = false, facialHair = false), - // Character("arei", "male", "brown", "brown", wearsGlasses = false, facialHair = true), - // Character("kelly", "female", "none", "green", wearsGlasses = false, facialHair = false), - // Character("tayamul", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - // Character("elaine", "female", "ginger", "blue", wearsGlasses = false, facialHair = true), - // Character("roshan", "male", "brown", "blue", wearsGlasses = true, facialHair = false), - // Character("patricia", "female", "purple", "yellow", wearsGlasses = false, facialHair = false), - // Character("dave", "male", "none", "yellow", wearsGlasses = false, facialHair = false), - // Character("bobbiana", "female", "brown", "blue", wearsGlasses = true, facialHair = false) - // ) - + //prints out characters onto the board "gameBoard" should "initialise with the provided characters" in { val gameBoard = new Board(characters) @@ -148,3 +125,58 @@ class BoardSpec extends AnyFlatSpec { // gameBoard.getRemainingCharacters shouldBe empty // } +"Board" should "print character names" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val characterNames = board.printCharacterNames() + characterNames.length should be(20) + characterNames should contain(characters.head.name) +} + +"Board" should "handle hair color question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("haircolor", Left("brown"), characters) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.hairColor)) shouldBe HairColor.Brown +} + +"Board" should "handle eye color question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("eyecolor", Left("blue"), characters) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.eyeColor)) shouldBe EyeColor.Blue +} + +"Board" should "handle gender question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("gender", Left("male"), characters) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.gender)) shouldBe Gender.Male +} + +"Board" should "handle wears glasses question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("wearsglasses", Right(true), characters) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.flatMap(_.wearsGlasses)) shouldBe PersonWithGlasses(true) +} + +"Board" should "handle facial hair question correctly" in { + val characters = CharacterManager.createCharacters() + val board = new Board(characters, characters.head) + val remainingCharacters = board.handleQuestion("hasfacialhair", Right(true), characters) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.flatMap(_.facialHair)) shouldBe PersonWithFacialHair(true) +} + +"Board" should "handle name guess correctly" in { + val characters = CharacterManager.createCharacters() + val selectedCharacter = characters.head + val board = new Board(characters, selectedCharacter) + val remainingCharacters = board.handleQuestion("name", Left(selectedCharacter.name.toLowerCase()), characters) + board.checkWinCondition(remainingCharacters) should be(true) +} \ No newline at end of file diff --git a/src/test/scala/GuessWhoGameSpec/GameSpec.scala b/src/test/scala/GuessWhoGameSpec/GameSpec.scala index bce203f..95fda46 100644 --- a/src/test/scala/GuessWhoGameSpec/GameSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/GameSpec.scala @@ -4,18 +4,17 @@ import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers import GuessWhoGame.character._ import GuessWhoGame._ -import scala.util.Random class GameSpec extends AnyFlatSpec with Matchers { "A Character" should "have correct attributes" in { - val char = Character("joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None) - char.name should be("joe") + val char = Character("Joe", Gender.Male, HairColor.Brown, EyeColor.Blue, None, None) + char.name should be("Joe") char.gender should be(Gender.Male) char.hairColor should be(HairColor.Brown) char.eyeColor should be(EyeColor.Blue) - char.wearsGlasses.value should be None - char.facialHair.value should be None + char.wearsGlasses shouldBe None + char.facialHair shouldBe None } "CharacterManager" should "create a list of characters" in { @@ -23,71 +22,22 @@ class GameSpec extends AnyFlatSpec with Matchers { characters should have size 20 } - it should "select a random character from the list" in { + "CharacterManager" should "select a random character from the list" in { val characters = CharacterManager.createCharacters() val selectedCharacter = CharacterManager.selectRandomCharacter(characters) characters should contain(selectedCharacter) } - "Board" should "print character names" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - board.printCharacterNames().length should be(20) - } - - it should "handle hair color question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("hairColor", Left("brown"), characters) - remainingCharacters shouldBe a[List[_]] - } - - it should "handle eye color question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("eyeColor", Left("blue"), characters) - remainingCharacters shouldBe a[List[_]] - } - - it should "handle gender question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("gender", Left("male"), characters) - remainingCharacters shouldBe a[List[_]] - } - - it should "handle wears glasses question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("wearsGlasses", Right(true), characters) - remainingCharacters shouldBe a[List[_]] - } - - it should "handle facial hair question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("hasFacialHair", Right(true), characters) - remainingCharacters shouldBe a[List[_]] - } - - it should "handle name guess correctly" in { - val characters = CharacterManager.createCharacters() - val selectedCharacter = characters.head - val board = new Board(characters, selectedCharacter) - val remainingCharacters = board.handleQuestion("name", Left(selectedCharacter.name.toLowerCase()), characters) - board.checkWinCondition(remainingCharacters) should be(true) - } - "Game" should "create a game board" in { val board = Game.createGameBoard() board.characters should have size 20 board.selectedCharacter should not be null } - it should "start and play the game" in { + "Game" should "start and play the game" in { noException should be thrownBy { val board = Game.createGameBoard() Game.startGame(board) } } -} +} \ No newline at end of file From 28c3fa4271c56aad2b23e0bed18dc07bef513050 Mon Sep 17 00:00:00 2001 From: joe <147166151+nonebula@users.noreply.github.com> Date: Mon, 9 Sep 2024 12:47:43 +0100 Subject: [PATCH 36/36] space --- .../scala/GuessWhoGameSpec/BoardSpec.scala | 191 ++++++++---------- 1 file changed, 84 insertions(+), 107 deletions(-) diff --git a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala index bc6cf6e..2ce86d0 100644 --- a/src/test/scala/GuessWhoGameSpec/BoardSpec.scala +++ b/src/test/scala/GuessWhoGameSpec/BoardSpec.scala @@ -1,182 +1,159 @@ package GuessWhoGameSpec import GuessWhoGame._ -import GuessWhoGame.character.{CharacterManager, EyeColor, Gender, HairColor, PersonWithFacialHair, PersonWithGlasses} +import GuessWhoGame.character.{CharacterManager, Character, EyeColor, Gender, HairColor, PersonWithFacialHair, PersonWithGlasses} import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers._ class BoardSpec extends AnyFlatSpec { - - //prints out characters onto the board - "gameBoard" should "initialise with the provided characters" in { + + // Sample characters for testing + val characters: List[Character] = CharacterManager.createCharacters() + + // Initializes the board with the provided characters + "Board" should "initialize with the provided characters" in { val gameBoard = new Board(characters) gameBoard.getRemainingCharacters shouldEqual characters } // Selects a character - it should "select a random character at the start of the game and keeps this character in the list" in { + it should "select a random character at the start of the game and keep this character in the list" in { val gameBoard = new Board(characters) characters should contain(gameBoard.getSelectedCharacter) - gameBoard.getSelectedCharacter shouldEqual (gameBoard.selectedCharacter) - //assert(gameBoard.selectRandomCharacter(characters: List[Character]) == gameBoard.selectedCharacter) } - //Watches for the win condition + // Checks the win condition it should "check win condition correctly" in { val gameBoard = new Board(characters) if (characters.size <= 1) { - assert(gameBoard.checkWinCondition) + assert(gameBoard.checkWinCondition()) } else { - assert(!gameBoard.checkWinCondition) + assert(!gameBoard.checkWinCondition()) } } - //Handles questions, re-renders based on question result && Stores remaining characters + // Handles questions and eliminates characters based on attributes it should "eliminate characters correctly based on gender questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size gameBoard.handleQuestion("gender", Left("male")) - val newSize = gameBoard.remainingCharacters.size + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize - //Future testcases - // gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe false } it should "eliminate characters correctly based on name questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size gameBoard.handleQuestion("name", Left("muhammad")) - val newSize = gameBoard.remainingCharacters.size + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize } - it should "eliminate characters correctly based on hairColor questions" in { + it should "eliminate characters correctly based on hair color questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size gameBoard.handleQuestion("hairColor", Left("blonde")) - val newSize = gameBoard.remainingCharacters.size + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize } - it should "eliminate characters correctly based on eyeColor questions" in { + it should "eliminate characters correctly based on eye color questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size gameBoard.handleQuestion("eyeColor", Left("blue")) - val newSize = gameBoard.remainingCharacters.size + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize } - it should "eliminate characters correctly based on wearsGlasses questions" in { + it should "eliminate characters correctly based on wears glasses questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size - gameBoard.handleQuestion("wearsGlasses", Right(false)) - val newSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size + gameBoard.handleQuestion("wearsGlasses", Right(true)) + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize } - it should "eliminate characters correctly based on HasFacialHair questions" in { + it should "eliminate characters correctly based on facial hair questions" in { val gameBoard = new Board(characters) - val initialSize = gameBoard.remainingCharacters.size - gameBoard.handleQuestion("hasFacialHair", Right(false)) - val newSize = gameBoard.remainingCharacters.size + val initialSize = gameBoard.getRemainingCharacters.size + gameBoard.handleQuestion("hasFacialHair", Right(true)) + val newSize = gameBoard.getRemainingCharacters.size newSize should be < initialSize } + // Handles incorrect attribute values cleanly it should "handle incorrect attribute values cleanly" in { - val gameBoard = Board(characters) + val gameBoard = new Board(characters) val initialSize = gameBoard.getRemainingCharacters.size gameBoard.handleQuestion("gender", Left("nonexistent gender")) val newSize = gameBoard.getRemainingCharacters.size - newSize shouldEqual initialSize } + // Handles edge case where all characters have the same attribute it should "handle edge case where all characters have the same attribute" in { val sameGenderCharacters = List( - Character("john", "male", "brown", "blue", wearsGlasses = false, facialHair = false), - Character("paul", "male", "black", "green", wearsGlasses = true, facialHair = true) + Character("john", Gender.Male, HairColor.Brown, EyeColor.Blue, Some(PersonWithGlasses(false)), Some(PersonWithFacialHair(false))), + Character("paul", Gender.Male, HairColor.Black, EyeColor.Green, Some(PersonWithGlasses(true)), Some(PersonWithFacialHair(true))) ) - val gameBoard = Board(sameGenderCharacters) + val gameBoard = new Board(sameGenderCharacters) gameBoard.handleQuestion("gender", Left("male")) gameBoard.getRemainingCharacters.size shouldEqual 2 } - it should "fail to eliminate characters with incorrect gender" in { - val gameBoard = Board(characters) - gameBoard.handleQuestion("gender", Left("female")) - gameBoard.getRemainingCharacters.forall(_.gender == "male") shouldBe true + // Prints character names + it should "print character names" in { + val gameBoard = new Board(characters) + val characterNames = gameBoard.printCharacterNames() + characterNames.length should be(20) + characterNames should contain(characters.head.name) } -} - + // Handles hair color question correctly + it should "handle hair color question correctly" in { + val gameBoard = new Board(characters) + val remainingCharacters = gameBoard.handleQuestion("hairColor", Left("brown")) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.hairColor)) shouldEqual HairColor.Brown + } -// future development -// it should "eliminate a character correctly" in { -// val gameBoard = new Board(characters) -// val characterToEliminate = characters.head -// gameBoard.eliminateCharacter(characterToEliminate) -// gameBoard.getRemainingCharacters should not contain characterToEliminate -// gameBoard.getRemainingCharacters.size shouldEqual (characters.size - 1) -// } -// -// it should "return an empty list if all characters are eliminated" in { -// val gameBoard = Board(characters) -// characters.foreach(gameBoard.eliminateCharacter) -// gameBoard.getRemainingCharacters shouldBe empty -// } - -"Board" should "print character names" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val characterNames = board.printCharacterNames() - characterNames.length should be(20) - characterNames should contain(characters.head.name) -} - -"Board" should "handle hair color question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("haircolor", Left("brown"), characters) - remainingCharacters shouldBe a[List[_]] - all(remainingCharacters.map(_.hairColor)) shouldBe HairColor.Brown -} + // Handles eye color question correctly + it should "handle eye color question correctly" in { + val gameBoard = new Board(characters) + val remainingCharacters = gameBoard.handleQuestion("eyeColor", Left("blue")) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.eyeColor)) shouldEqual EyeColor.Blue + } -"Board" should "handle eye color question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("eyecolor", Left("blue"), characters) - remainingCharacters shouldBe a[List[_]] - all(remainingCharacters.map(_.eyeColor)) shouldBe EyeColor.Blue -} + // Handles gender question correctly + it should "handle gender question correctly" in { + val gameBoard = new Board(characters) + val remainingCharacters = gameBoard.handleQuestion("gender", Left("male")) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.map(_.gender)) shouldEqual Gender.Male + } -"Board" should "handle gender question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("gender", Left("male"), characters) - remainingCharacters shouldBe a[List[_]] - all(remainingCharacters.map(_.gender)) shouldBe Gender.Male -} + // Handles wears glasses question correctly + it should "handle wears glasses question correctly" in { + val gameBoard = new Board(characters) + val remainingCharacters = gameBoard.handleQuestion("wearsGlasses", Right(true)) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.flatMap(_.wearsGlasses)) shouldEqual PersonWithGlasses(true) + } -"Board" should "handle wears glasses question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("wearsglasses", Right(true), characters) - remainingCharacters shouldBe a[List[_]] - all(remainingCharacters.flatMap(_.wearsGlasses)) shouldBe PersonWithGlasses(true) -} + // Handles facial hair question correctly + it should "handle facial hair question correctly" in { + val gameBoard = new Board(characters) + val remainingCharacters = gameBoard.handleQuestion("hasFacialHair", Right(true)) + remainingCharacters shouldBe a[List[_]] + all(remainingCharacters.flatMap(_.facialHair)) shouldEqual PersonWithFacialHair(true) + } -"Board" should "handle facial hair question correctly" in { - val characters = CharacterManager.createCharacters() - val board = new Board(characters, characters.head) - val remainingCharacters = board.handleQuestion("hasfacialhair", Right(true), characters) - remainingCharacters shouldBe a[List[_]] - all(remainingCharacters.flatMap(_.facialHair)) shouldBe PersonWithFacialHair(true) + // Handles name guess correctly + it should "handle name guess correctly" in { + val selectedCharacter = characters.head + val gameBoard = new Board(characters, selectedCharacter) + val remainingCharacters = gameBoard.handleQuestion("name", Left(selectedCharacter.name.toLowerCase())) + gameBoard.checkWinCondition(remainingCharacters) should be(true) + } } - -"Board" should "handle name guess correctly" in { - val characters = CharacterManager.createCharacters() - val selectedCharacter = characters.head - val board = new Board(characters, selectedCharacter) - val remainingCharacters = board.handleQuestion("name", Left(selectedCharacter.name.toLowerCase()), characters) - board.checkWinCondition(remainingCharacters) should be(true) -} \ No newline at end of file