diff --git a/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/trivia/runner/GameRunner.kt b/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/trivia/runner/GameRunner.kt index 08c522e4..13a8eaf1 100644 --- a/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/trivia/runner/GameRunner.kt +++ b/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/trivia/runner/GameRunner.kt @@ -7,9 +7,9 @@ object GameRunner { fun main(args: Array) { val aGame = Game() - aGame.add("Chet") - aGame.add("Pat") - aGame.add("Sue") + aGame.addPlayer("Chet") + aGame.addPlayer("Pat") + aGame.addPlayer("Sue") val rand = Random(args[0].toLong()) @@ -18,7 +18,7 @@ object GameRunner { aGame.roll(rand.nextInt(5) + 1) if (rand.nextInt(9) == 7) { - GameRunner.notAWinner = aGame.wrongAnswer() + GameRunner.notAWinner = aGame.wasIncorrectlyAnswered() } else { GameRunner.notAWinner = aGame.wasCorrectlyAnswered() } diff --git a/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/uglytrivia/Game.kt b/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/uglytrivia/Game.kt index ce8e46cc..5faa4d28 100644 --- a/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/uglytrivia/Game.kt +++ b/exercises/kotlin/src/main/kotlin/com/adaptionsoft/games/uglytrivia/Game.kt @@ -2,164 +2,183 @@ package com.adaptionsoft.games.uglytrivia import java.util.* -class Game { - internal var players = ArrayList() - internal var places = IntArray(6) - internal var purses = IntArray(6) - internal var inPenaltyBox = BooleanArray(6) +class Board { + private val places = ArrayList() + private val boardSize = 12 - internal var popQuestions = LinkedList() - internal var scienceQuestions = LinkedList() - internal var sportsQuestions = LinkedList() - internal var rockQuestions = LinkedList() + init { + createBoard(boardSize) + } - internal var currentPlayer = 0 - internal var isGettingOutOfPenaltyBox: Boolean = false + private fun createBoard(boardSize: Int) { + for (i in 0..boardSize) { + places.add(Place(i)) + } + } + + fun getPlace(position: Int): Place { + return places[position] + } +} + +class Player (val name: String){ + var purse: Int = 0 + var isInPenaltyBox: Boolean = false + var position: Int = 0 + + fun addCoin() { + purse++ + println( + "$name now has $purse Gold Coins." + ) + } +} + +class Place (position: Int) { + private val questionCategory: Category init { - for (i in 0..49) { - popQuestions.addLast("Pop Question " + i) - scienceQuestions.addLast("Science Question " + i) - sportsQuestions.addLast("Sports Question " + i) - rockQuestions.addLast(createRockQuestion(i)) + questionCategory = when (position % 4) { + 0 -> Category.Pop + 1 -> Category.Science + 2 -> Category.Sports + else -> Category.Rock } } + fun category(): String { + return questionCategory.toString() + } +} + +class QuestionBank { + private val MAX_NUMBER_OF_QUESTIONS = 50 - fun createRockQuestion(index: Int): String { - return "Rock Question " + index + internal var pop = LinkedList() + internal var science = LinkedList() + internal var sports = LinkedList() + internal var rock = LinkedList() + + init { + for (questionIndex in 0..= 2 + fun askQuestion(place: Place) { + if (place.category() === "Pop") + println(pop.removeFirst()) + if (place.category() === "Science") + println(science.removeFirst()) + if (place.category() === "Sports") + println(sports.removeFirst()) + if (place.category() === "Rock") + println(rock.removeFirst()) } +} - fun add(playerName: String): Boolean { +enum class Category { + Pop, Science, Sports, Rock +} +class Game { + private val NUMBER_OF_PLACES = 12 + private val COINS_TO_WIN = 6 + + private val board = Board() + private val questionBank = QuestionBank() + private var players = ArrayList() - players.add(playerName) - places[howManyPlayers()] = 0 - purses[howManyPlayers()] = 0 - inPenaltyBox[howManyPlayers()] = false + private var currentPlayerIndex = 0 + private lateinit var currentPlayer: Player + private var isGettingOutOfPenaltyBox: Boolean = false - println(playerName + " was added") + fun addPlayer(playerName: String): Boolean { + players.add(Player(playerName)) + println("$playerName was added") println("They are player number " + players.size) + currentPlayer = players[currentPlayerIndex] return true } - fun howManyPlayers(): Int { - return players.size - } - fun roll(roll: Int) { - println(players[currentPlayer].toString() + " is the current player") - println("They have rolled a " + roll) + println(currentPlayer.name + " is the current player") + println("They have rolled a $roll") - if (inPenaltyBox[currentPlayer]) { - if (roll % 2 != 0) { + if (currentPlayer.isInPenaltyBox) { + if (isRollOdd(roll)) { isGettingOutOfPenaltyBox = true - - println(players[currentPlayer].toString() + " is getting out of the penalty box") - places[currentPlayer] = places[currentPlayer] + roll - if (places[currentPlayer] > 11) places[currentPlayer] = places[currentPlayer] - 12 - - println(players[currentPlayer].toString() - + "'s new location is " - + places[currentPlayer]) - println("The category is " + currentCategory()) - askQuestion() + println(currentPlayer.name + " is getting out of the penalty box") + movePlayer(roll) + questionBank.askQuestion(getCurrentPlace()) } else { - println(players[currentPlayer].toString() + " is not getting out of the penalty box") + println(currentPlayer.name + " is not getting out of the penalty box") isGettingOutOfPenaltyBox = false } - } else { - - places[currentPlayer] = places[currentPlayer] + roll - if (places[currentPlayer] > 11) places[currentPlayer] = places[currentPlayer] - 12 - - println(players[currentPlayer].toString() - + "'s new location is " - + places[currentPlayer]) - println("The category is " + currentCategory()) - askQuestion() + movePlayer(roll) + questionBank.askQuestion(getCurrentPlace()) } - } - private fun askQuestion() { - if (currentCategory() === "Pop") - println(popQuestions.removeFirst()) - if (currentCategory() === "Science") - println(scienceQuestions.removeFirst()) - if (currentCategory() === "Sports") - println(sportsQuestions.removeFirst()) - if (currentCategory() === "Rock") - println(rockQuestions.removeFirst()) - } + private fun isRollOdd(roll: Int) = roll % 2 != 0 + + private fun movePlayer(roll: Int) { + currentPlayer.position += roll + if (currentPlayer.position >= NUMBER_OF_PLACES) currentPlayer.position -= NUMBER_OF_PLACES - private fun currentCategory(): String { - if (places[currentPlayer] == 0) return "Pop" - if (places[currentPlayer] == 4) return "Pop" - if (places[currentPlayer] == 8) return "Pop" - if (places[currentPlayer] == 1) return "Science" - if (places[currentPlayer] == 5) return "Science" - if (places[currentPlayer] == 9) return "Science" - if (places[currentPlayer] == 2) return "Sports" - if (places[currentPlayer] == 6) return "Sports" - if (places[currentPlayer] == 10) return "Sports" - return "Rock" + println( + currentPlayer.name + + "'s new location is " + + currentPlayer.position + ) + println("The category is " + getCurrentPlace().category()) } + private fun getCurrentPlace() = board.getPlace(currentPlayer.position) + fun wasCorrectlyAnswered(): Boolean { - if (inPenaltyBox[currentPlayer]) { + if (currentPlayer.isInPenaltyBox) { if (isGettingOutOfPenaltyBox) { println("Answer was correct!!!!") - purses[currentPlayer]++ - println(players[currentPlayer].toString() - + " now has " - + purses[currentPlayer] - + " Gold Coins.") - - val winner = didPlayerWin() - currentPlayer++ - if (currentPlayer == players.size) currentPlayer = 0 - - return winner + currentPlayer.addCoin() + val shouldContinueGame = shouldContinueGame() + updateCurrentPlayer() + return shouldContinueGame } else { - currentPlayer++ - if (currentPlayer == players.size) currentPlayer = 0 + updateCurrentPlayer() return true } - - } else { - println("Answer was corrent!!!!") - purses[currentPlayer]++ - println(players[currentPlayer].toString() - + " now has " - + purses[currentPlayer] - + " Gold Coins.") - - val winner = didPlayerWin() - currentPlayer++ - if (currentPlayer == players.size) currentPlayer = 0 - - return winner + currentPlayer.addCoin() + val shouldContinueGame = shouldContinueGame() + updateCurrentPlayer() + return shouldContinueGame } } - fun wrongAnswer(): Boolean { + fun wasIncorrectlyAnswered(): Boolean { println("Question was incorrectly answered") - println(players[currentPlayer].toString() + " was sent to the penalty box") - inPenaltyBox[currentPlayer] = true - - currentPlayer++ - if (currentPlayer == players.size) currentPlayer = 0 + println(currentPlayer.name + " was sent to the penalty box") + currentPlayer.isInPenaltyBox = true + updateCurrentPlayer() return true } - private fun didPlayerWin(): Boolean { - return purses[currentPlayer] != 6 + private fun updateCurrentPlayer() { + currentPlayerIndex++ + if (currentPlayerIndex == players.size) currentPlayerIndex = 0 + currentPlayer = players[currentPlayerIndex] + } + + private fun shouldContinueGame(): Boolean { + return currentPlayer.purse != COINS_TO_WIN } } \ No newline at end of file diff --git a/exercises/kotlin/src/test/kotlin/com/adaptionsoft/games/trivia/SomeTest.kt b/exercises/kotlin/src/test/kotlin/com/adaptionsoft/games/trivia/SomeTest.kt deleted file mode 100644 index 33e7b557..00000000 --- a/exercises/kotlin/src/test/kotlin/com/adaptionsoft/games/trivia/SomeTest.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.adaptionsoft.games.trivia - -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test - - -class SomeTest { - - @Test - fun true_is_true() { - assertTrue(false) - } -}