Snake and ladder: Difference between revisions

(Added Kotlin)
Line 452:
Player 3 wins!</pre>
 
=={{header|Racket}}==
<lang racket>#lang racket/base
 
(define portals (hash 4 14 9 31 17 7 20 38 28 84 40 59 51 67 54 34 62 19 63 81 64 60 71 91 87 24 93 73 95 75 99 78))
 
(define (find-game-winner n-players reroll-on-six? (win values))
(let turn ((positions-map (for/hash ((p n-players)) (values p 1))) (player 0))
(newline)
(let ((die (add1 (random 6)))
(position (hash-ref positions-map player)))
(printf "player ~a at ~a rolls ~a: " (add1 player) position die)
(let* ((try-position (+ position die))
(new-position
(cond [(> try-position 100) (display "player can't move beyond the end.") position]
[(= try-position 100) (display "player wins!") try-position]
[(hash-ref portals try-position #f)
=> (λ (slide-to)
(printf "~a from ~a to ~a." (if (> slide-to try-position) "LADDER" "SNAKE") try-position slide-to)
slide-to)]
[else (printf "landed on ~a." try-position) try-position])))
(if (= new-position 100)
(win (add1 player))
(turn (hash-set positions-map player new-position)
(if (and (= 6 die) reroll-on-six?)
(begin0 player (display " [6] rolls again!"))
(modulo (add1 player) n-players))))))))
 
(module+ main
(find-game-winner 5 #t (λ (p) (printf "~%~%The winner of the game is player #~a" p))))</lang>
 
{{out}}
<pre>
player 1 at 1 rolls 2: landed on 3.
player 2 at 1 rolls 3: LADDER from 4 to 14.
player 3 at 1 rolls 6: landed on 7. [6] rolls again!
player 3 at 7 rolls 4: landed on 11.
player 4 at 1 rolls 3: LADDER from 4 to 14.
player 5 at 1 rolls 5: landed on 6.
player 1 at 3 rolls 1: LADDER from 4 to 14.
player 2 at 14 rolls 3: SNAKE from 17 to 7.
player 3 at 11 rolls 4: landed on 15.
...
player 3 at 86 rolls 5: landed on 91.
player 4 at 85 rolls 1: landed on 86.
player 5 at 68 rolls 6: landed on 74. [6] rolls again!
player 5 at 74 rolls 1: landed on 75.
player 1 at 59 rolls 1: landed on 60.
player 2 at 94 rolls 6: player wins!
 
The winner of the game is player #2</pre>
=={{header|Ruby}}==
<lang ruby>
569

edits