Skip to content

Commit

Permalink
♻️ extract same logic into game. optimize imports
Browse files Browse the repository at this point in the history
  • Loading branch information
pfaffenrodt committed Nov 19, 2021
1 parent 09762a2 commit 7da7b4e
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 45 deletions.
22 changes: 22 additions & 0 deletions src/main/kotlin/Game.kt
Expand Up @@ -12,4 +12,26 @@ fun Hand.play(opponentHand: Hand): GameResult = when (opponentHand) {
this -> GameResult.DRAW
winnerMap[this] -> GameResult.WIN
else -> GameResult.LOSE
}

suspend fun GameScope.play(yourHand: Hand, opponentHand: Hand): GameResult {
delay(600)
printLine("*ROCK*")
delay(800)
printLine("*PAPER*")
delay(800)
printLine("*SCISSORS*")
delay(1200)
printLine("You choosed: $yourHand")
printLine("Opponent choosed: $opponentHand")

val gameResult = yourHand.play(opponentHand)
when(gameResult) {
GameResult.WIN -> printLine("You won")
GameResult.DRAW -> printLine("Its draw")
GameResult.LOSE -> printLine("You lost")
else -> printLine("no one")
}
delay(2400)
return gameResult
}
19 changes: 19 additions & 0 deletions src/main/kotlin/GameScope.kt
@@ -1,24 +1,43 @@
/**
* a scope that is required to print or read from system
*/
interface GameScope {
fun readLine(): String?
fun printLine(message: String)
fun print(message: String)
suspend fun delay(timeMillis: Long)
}

/**
* default scope use standard input output streams
*/
class DefaultGameScope(
): GameScope {
/**
* @see kotlin.io.readlnOrNull
*/
override fun readLine(): String? {
return readlnOrNull()
}

/**
* @see kotlin.io.println
*/
override fun printLine(message: String) {
kotlin.io.println(message)
}

/**
*
* @see kotlin.io.print
*/
override fun print(message: String) {
kotlin.io.print(message)
}

/**
* delay current coroutines by time in millis
*/
override suspend fun delay(timeMillis: Long) {
kotlinx.coroutines.delay(timeMillis)
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/kotlin/Hands.kt
@@ -1,6 +1,13 @@

sealed class Hand(
/**
* option used as input argument to pick a hand
*/
val option: String,

/**
* will be used to print
*/
val label: String,
) {

Expand Down
21 changes: 1 addition & 20 deletions src/main/kotlin/RockGame.kt
@@ -1,27 +1,8 @@
import kotlinx.coroutines.delay

suspend fun GameScope.againstARock(): GameResult {
printLine(HAND_CHOICES.trimIndent())
val option = readLine() ?: return GameResult.NONE
val yourHand = Hand.fromOption(option) ?: return GameResult.NONE
val opponentHand = Hand.Rock
delay(600)
printLine("*ROCK*")
delay(800)
printLine("*PAPER*")
delay(800)
printLine("*SCISSORS*")
delay(1200)
printLine("You choosed: ${yourHand.label}")
printLine("Opponent choosed: ${opponentHand.label}")

val gameResult = yourHand.play(opponentHand)
when(gameResult) {
GameResult.WIN -> printLine("You won")
GameResult.DRAW -> printLine("Its draw")
GameResult.LOSE -> printLine("You lost")
else -> printLine("no one")
}
delay(2400)
return gameResult
return play(yourHand, opponentHand)
}
26 changes: 4 additions & 22 deletions src/main/kotlin/SimpleGame.kt
@@ -1,25 +1,7 @@
import kotlinx.coroutines.delay


suspend fun GameScope.simpleGame() {
suspend fun GameScope.simpleGame(): GameResult {
printLine(HAND_CHOICES.trimIndent())
val option = readLine() ?: return
val yourHand = Hand.fromOption(option) ?: return
val option = readLine() ?: return GameResult.NONE
val yourHand = Hand.fromOption(option) ?: return GameResult.NONE
val opponentHand = Hand.randomHand()
delay(600)
printLine("*ROCK*")
delay(800)
printLine("*PAPER*")
delay(800)
printLine("*SCISSORS*")
delay(1200)
printLine("You choosed: ${yourHand.label}")
printLine("Opponent choosed: ${opponentHand.label}")

when(yourHand.play(opponentHand)) {
GameResult.WIN -> printLine("You won")
GameResult.DRAW -> printLine("Its draw")
GameResult.LOSE -> printLine("You lost")
}
delay(2400)
return play(yourHand, opponentHand)
}
4 changes: 3 additions & 1 deletion src/main/kotlin/SimulateGames.kt
Expand Up @@ -18,7 +18,9 @@ suspend fun simulateGames() {
delay(3000)
}


/**
* simulated scope were output is ignored and read is hardcoded by random hand
*/
class SimulatedGameScope: GameScope {
override fun readLine(): String? {
return Hand.randomHand().option
Expand Down
2 changes: 0 additions & 2 deletions src/main/kotlin/Text.kt
@@ -1,5 +1,3 @@
import kotlinx.coroutines.delay

const val HAND_CHOICES = """
* 1 - Rock
* 2 - Paper
Expand Down

0 comments on commit 7da7b4e

Please sign in to comment.