Rebol3 Code Examplex


Snake and ladder

Rebol [
    title: "Rosetta code: Snake and ladder"
    file:  %Snake_and_ladder.r3
    url:   https://rosettacode.org/wiki/Snake_and_ladder
]

snake-or-ladder: function/with [
    "Play a game of Snakes and Ladders with the given number of players."
    players [integer!] "Number of players (must be > 1)"
][
    assert [players > 1]
    random/seed now/time/precise
    print-hline/width 70
    print as-blue "== SNAKE AND LADDER =="
    repeat i players [positions/:i: 1]  ;; start all players on cell 1

    print "Game is starting...^/"
    player: 1
    forever [
        move-player roll-dice
        if positions/:player = 100 [
            print-hline/width 70
            print ["^/HURRAY, Player" as-green player "wins!!!"]
            break
        ]
        player: (player % players) + 1  ;; advance to next player (wrap around)
    ]
    print "Game ended."
][
    portals: #[    ;; map: landing cell -> destination
         4  14    9  31   20  38   28  84   ;; ladders
        40  59   51  67   63  81   71  91   ;; ladders
        17   7   54  34   62  19   64  60   ;; snakes
        87  24   93  73   95  75   99  78   ;; snakes
    ]
    positions: #[]                  ;; player index -> current cell
    player: 0                       ;; current player index

    roll-dice: does [1 + random 5]  ;; returns 1–6

    move-player: function [dice] [
        cell: positions/:player + dice
        prin [
            "Player" as-green player
            "rolled" as-yellow dice
            "--> Moved to" as-yellow pad cell 4
        ]
        if cell > 100 [             ;; overshoot: bounce back from 100
            cell: 100 - (cell - 100)
            prin [as-red "BUMPED to" as-yellow cell ""]
        ]
        positions/:player: either portal: portals/:cell [
            print either/only portal > cell [
                as-green "Climbed a LADDER to" as-yellow portal  ;; ladder up
            ][  as-red "A SNAKE carried to"    as-yellow portal] ;; snake down
            portal
        ][  print "" cell ]         ;; plain move, no portal
    ]
]

snake-or-ladder 2 ;- Start a game

Output:

----------------------------------------------------------------------
== SNAKE AND LADDER ==
Game is starting...

Player 1 rolled 6 --> Moved to 7   
Player 2 rolled 4 --> Moved to 5   
Player 1 rolled 5 --> Moved to 12  
Player 2 rolled 5 --> Moved to 10  
Player 1 rolled 4 --> Moved to 16  
Player 2 rolled 3 --> Moved to 13  
Player 1 rolled 4 --> Moved to 20  Climbed a LADDER to 38
Player 2 rolled 4 --> Moved to 17  A SNAKE carried to 7
Player 1 rolled 3 --> Moved to 41  
Player 2 rolled 2 --> Moved to 9   Climbed a LADDER to 31
Player 1 rolled 3 --> Moved to 44  
Player 2 rolled 5 --> Moved to 36  
Player 1 rolled 4 --> Moved to 48  
Player 2 rolled 4 --> Moved to 40  Climbed a LADDER to 59
Player 1 rolled 3 --> Moved to 51  Climbed a LADDER to 67
Player 2 rolled 3 --> Moved to 62  A SNAKE carried to 19
Player 1 rolled 4 --> Moved to 71  Climbed a LADDER to 91
Player 2 rolled 5 --> Moved to 24  
Player 1 rolled 2 --> Moved to 93  A SNAKE carried to 73
Player 2 rolled 3 --> Moved to 27  
Player 1 rolled 5 --> Moved to 78  
Player 2 rolled 3 --> Moved to 30  
Player 1 rolled 2 --> Moved to 80  
Player 2 rolled 2 --> Moved to 32  
Player 1 rolled 3 --> Moved to 83  
Player 2 rolled 4 --> Moved to 36  
Player 1 rolled 5 --> Moved to 88  
Player 2 rolled 4 --> Moved to 40  Climbed a LADDER to 59
Player 1 rolled 4 --> Moved to 92  
Player 2 rolled 2 --> Moved to 61  
Player 1 rolled 4 --> Moved to 96  
Player 2 rolled 3 --> Moved to 64  A SNAKE carried to 60
Player 1 rolled 6 --> Moved to 102 BUMPED to 98 
Player 2 rolled 5 --> Moved to 65  
Player 1 rolled 3 --> Moved to 101 BUMPED to 99 A SNAKE carried to 78
Player 2 rolled 4 --> Moved to 69  
Player 1 rolled 3 --> Moved to 81  
Player 2 rolled 5 --> Moved to 74  
Player 1 rolled 5 --> Moved to 86  
Player 2 rolled 3 --> Moved to 77  
Player 1 rolled 4 --> Moved to 90  
Player 2 rolled 5 --> Moved to 82  
Player 1 rolled 4 --> Moved to 94  
Player 2 rolled 4 --> Moved to 86  
Player 1 rolled 6 --> Moved to 100 
----------------------------------------------------------------------

HURRAY, Player 1 wins!!!
Game ended.