diff --git a/src/main/kotlin/rps/Game.kt b/src/main/kotlin/rps/Game.kt index 2606fe5..a9e23f1 100644 --- a/src/main/kotlin/rps/Game.kt +++ b/src/main/kotlin/rps/Game.kt @@ -4,11 +4,17 @@ fun main() { println("Hello, world") } -/** A possible move in a game of rock-paper-scissors. */ -enum class Move { - ROCK, - PAPER, - SCISSORS +/** + * A possible move in a game of rock-paper-scissors. + * + * [strongAgainst] is a function for lazy evaluation because otherwise we can’t access SCISSORS before it’s been defined. + * If the game needs to be expanded (e.g. the somewhat common “rock, paper, scissors, salamander, spock”), + * this argument could be a List instead. + */ +enum class Move(val strongAgainst: () -> Move) { + ROCK({ SCISSORS }), + PAPER({ ROCK }), + SCISSORS({ PAPER }) } // purposely not calling this Result to avoid confusion with kotlin.Result and similar @@ -19,4 +25,8 @@ enum class Outcome { } /** Determine the [Outcome] of [first] vs [second] from the perspective of [first]. */ -fun determineOutcome(first: Move, second: Move): Outcome = TODO() \ No newline at end of file +fun determineOutcome(first: Move, second: Move): Outcome = when { + first.strongAgainst() == second -> Outcome.WIN + first == second -> Outcome.DRAW + else -> Outcome.LOSS +} \ No newline at end of file