Snake and ladder: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
m (return -> exit)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(28 intermediate revisions by 19 users not shown)
Line 10:
 
For a board example you can use this image here: [http://paulo-jorente.de/text/snakes_ledders.jpg snakes & ledders].
 
<small>(A '''ledder''' is the Old English word for a '''ladder'''.)</small>
 
 
The way you'll represent the board and the players' tokens is totally up to you: graphics or ASCII graphics or even just text.
Line 15 ⟶ 18:
Happy coding.
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V snl = [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]
 
V sixesRollAgain = 1B
 
F turn(player, =square)
L
V roll = random:(1 .. 6)
print(‘Player #. on square #., rolls a #.’.format(player, square, roll), end' ‘’)
I square + roll > 100
print(‘ but cannot move.’)
E
square += roll
print(‘ and moves to square #.’.format(square))
I square == 100
R 100
V next = :snl.get(square, square)
I square < next
print(‘Yay! landed on a ladder. Climb up to #..’.format(next))
I square == 100
R 100
square = next
E I square > next
print(‘Oops! Landed on a snake. Slither down to #..’.format(next))
square = next
I roll < 6 | !:sixesRollAgain
R square
print(‘Rolled a 6 so roll again.’)
 
F main()
V players = [1, 1, 1]
L
L(i) 0..2
V ns = turn(i + 1, players[i])
I ns == 100
print(‘Player #. wins!’.format(i + 1))
R
players[i] = ns
print()
 
main()</syntaxhighlight>
 
{{out}}
The same as in Python.
 
=={{header|ALGOL 68}}==
Fully automated game, the user is initially promoted for a number of players (up to 10, 0 or less exits without playing). The user is also prompted as to whether a player can win by reaching a square greater than the final one and also whether a player can throw again after throwing a 6.
<syntaxhighlight lang="algol68">BEGIN # Snakes and ladders game #
# create the board #
INT max square = 100;
[ 1 : max square ]INT board;
FOR i TO max square DO board[ i ] := 0 OD;
board[ 4 ] := 14;
board[ 9 ] := 31;
board[ 17 ] := 7;
board[ 20 ] := 38;
board[ 28 ] := 84;
board[ 40 ] := 59;
board[ 51 ] := 67;
board[ 54 ] := 34;
board[ 62 ] := 19;
board[ 63 ] := 81;
board[ 64 ] := 60;
board[ 71 ] := 91;
board[ 87 ] := 24;
board[ 93 ] := 73;
board[ 95 ] := 75;
board[ 99 ] := 78;
# get options #
INT players := 0;
WHILE print( ( "How many players ( 1-10, 0 or less to quit ) ? " ) );
read( ( players, newline ) );
players > 10
DO
print( ( "Too many players" ) )
OD;
IF players > 0 THEN
# the user does want to play #
BOOL win on gt max := FALSE;
WHILE print( ( "Allow position > ", whole( max square, 0 ), " to win [y/n] ? " ) );
CHAR c;
read( ( c, newline ) );
win on gt max := c = "y";
c /= "y" AND c /= "n"
DO SKIP OD;
BOOL extra roll for 6 := FALSE;
WHILE print( ( "Roll again on a 6 [y/n] ? " ) );
CHAR c;
read( ( c, newline ) );
extra roll for 6 := c = "y";
c /= "y" AND c /= "n"
DO SKIP OD;
[ 1 : players ]INT position;
FOR i TO players DO position[ i ] := 0 OD;
# play #
BOOL game over := FALSE;
WHILE NOT game over DO
# handle each players move #
print( ( newline ) );
FOR p TO players WHILE NOT game over DO
WHILE
INT roll = ENTIER ( next random * 6 ) + 1;
STRING player id = "Player " + whole( p, 0 );
print( ( player id
, IF position[ p ] < 1 THEN "" ELSE " (on square " + whole( position[ p ], 0 ) + ")" FI
, " rolls a "
, whole( roll, 0 )
, newline
)
);
IF position[ p ] + roll > max square
AND NOT win on gt max
THEN
# the player would be off the board #
print( ( " ", player id, " cannot move", newline ) )
ELSE
# the player can move roll squares #
position[ p ] +:= roll;
IF position[ p ] > max square THEN position[ p ] := max square FI;
print( ( " and moves to square ", whole( position[ p ], 0 ) ) );
IF board[ position[ p ] ] > position[ p ] THEN
# landed on a ladder #
position[ p ] := board[ position[ p ] ];
print( ( " - which is a ladder :) ", player id, " climbs to up ", whole( position[ p ], 0 ), newline ) )
ELIF board[ position[ p ] ] /= 0 THEN
# landed on a snake #
position[ p ] := board[ position[ p ] ];
print( ( " - which is a snake :( ", player id, " slides down to ", whole( position[ p ], 0 ), newline ) )
ELIF position[ p ] >= max square THEN
# the player has won #
print( ( " and wins the game!", newline ) );
game over := TRUE
ELSE
# not a ladder, snake or winning move #
print( ( newline ) )
FI
FI;
roll = 6 AND extra roll for 6 AND NOT game over
DO
print( ( player id, " can roll again...", newline ) )
OD
OD
OD
FI
END</syntaxhighlight>
{{out}}
Sample game.
<pre>
How many players ( 1-10, 0 or less to quit ) ? 4
Allow position > 100 to win [y/n] ? n
Roll again on a 6 [y/n] ? y
 
Player 1 rolls a 1
and moves to square 1
Player 2 rolls a 4
and moves to square 4 - which is a ladder :) Player 2 climbs to up 14
Player 3 rolls a 6
and moves to square 6
Player 3 can roll again...
Player 3 (on square 6) rolls a 3
and moves to square 9 - which is a ladder :) Player 3 climbs to up 31
Player 4 rolls a 2
and moves to square 2
...
Player 1 (on square 36) rolls a 2
and moves to square 38
Player 2 (on square 84) rolls a 3
and moves to square 87 - which is a snake :( Player 2 slides down to 24
Player 3 (on square 44) rolls a 1
and moves to square 45
Player 4 (on square 14) rolls a 6
and moves to square 20 - which is a ladder :) Player 4 climbs to up 38
Player 4 can roll again...
Player 4 (on square 38) rolls a 3
and moves to square 41
...
Player 1 (on square 79) rolls a 6
and moves to square 85
Player 1 can roll again...
Player 1 (on square 85) rolls a 4
and moves to square 89
Player 2 (on square 92) rolls a 6
and moves to square 98
Player 2 can roll again...
Player 2 (on square 98) rolls a 2
and moves to square 100 and wins the game!
</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f SNAKE_AND_LADDER.AWK [players]
# example: GAWK -f SNAKE_AND_LADDER.AWK 3
BEGIN {
players = (ARGV[1] ~ /^[0-9]+$/) ? ARGV[1] : 2
load_board()
show_board()
if (players == 0) { exit(0) }
for (i=1; i<=players; i++) {
sq_arr[i] = 1 # all players start on square 1
}
srand() # seed rand() with time of day
while (1) {
printf("\nTurn #%d\n",++turns)
for (i=1; i<=players; i++) {
ns = turn(i,sq_arr[i])
if (ns == 100) {
printf("Player %d wins after %d moves\n",i,moves)
exit(0)
}
sq_arr[i] = ns
}
}
}
function load_board() {
# index < value is a ladder
# index > value is a snake
sl_arr[ 4] = 14
sl_arr[ 9] = 31
sl_arr[17] = 7
sl_arr[20] = 38
sl_arr[28] = 84
sl_arr[40] = 59
sl_arr[51] = 67
sl_arr[54] = 34
sl_arr[62] = 19
sl_arr[63] = 81
sl_arr[64] = 60
sl_arr[71] = 91
sl_arr[87] = 24
sl_arr[93] = 73
sl_arr[95] = 75
sl_arr[99] = 78
}
function show_board( board_arr,i,pos,row,L,S) {
PROCINFO["sorted_in"] = "@ind_num_asc"
# populate board with cell numbers
for (i=1; i<=100; i++) {
board_arr[i] = i
}
# add in Snakes & Ladders
for (i in sl_arr) {
board_arr[sl_arr[i]] = board_arr[i] = (i+0 < sl_arr[i]) ? sprintf("L%02d",++L) : sprintf("S%02d",++S)
}
# print board
print("board: L=ladder S=snake")
for (row=10; row>=1; row--) {
if (row ~ /[02468]$/) {
pos = row * 10
for (i=1; i<=10; i++) {
printf("%5s",board_arr[pos--])
}
}
else {
pos = row * 10 - 9
for (i=1; i<=10; i++) {
printf("%5s",board_arr[pos++])
}
}
printf("\n")
}
}
function turn(player,square, position,roll) {
while (1) {
moves++
roll = int(rand() * 6) + 1 # roll die
printf("Player %d on square %d rolls a %d",player,square,roll)
if (square + roll > 100) {
printf(" but cannot move\n")
}
else {
square += roll
printf(" and moves to square %d\n",square)
if (square == 100) {
return(100)
}
position = (square in sl_arr) ? sl_arr[square] : square
if (square < position) {
printf("Yay! Landed on a ladder so climb up to %d\n",position)
}
else if (position < square) {
printf("Oops! Landed on a snake so slither down to %d\n",position)
}
square = position
}
if (roll < 6) {
return(square)
}
printf("Rolled a 6 so roll again\n")
}
}
</syntaxhighlight>
<p>Sample command and output:</p>
<pre>
GAWK -f SNAKE_AND_LADDER.AWK 3
 
board: L=ladder S=snake
100 S08 98 97 96 S07 94 S06 92 L08
L07 82 83 L04 85 86 S05 88 89 90
80 79 S08 77 76 S07 74 S06 72 L08
61 S03 L07 S04 65 66 L06 68 69 70
S04 L05 58 57 56 55 S02 53 52 L06
41 42 43 44 45 46 47 48 49 50
L05 39 L03 37 36 35 S02 33 32 L02
21 22 23 S05 25 26 27 L04 29 30
L03 S03 18 S01 16 15 L01 13 12 11
1 2 3 L01 5 6 S01 8 L02 10
 
Turn #1
Player 1 on square 1 rolls a 4 and moves to square 5
Player 2 on square 1 rolls a 5 and moves to square 6
Player 3 on square 1 rolls a 3 and moves to square 4
Yay! Landed on a ladder so climb up to 14
 
Turn #2
Player 1 on square 5 rolls a 2 and moves to square 7
Player 2 on square 6 rolls a 6 and moves to square 12
Rolled a 6 so roll again
Player 2 on square 12 rolls a 3 and moves to square 15
Player 3 on square 14 rolls a 2 and moves to square 16
 
Turn #3
Player 1 on square 7 rolls a 5 and moves to square 12
Player 2 on square 15 rolls a 1 and moves to square 16
Player 3 on square 16 rolls a 1 and moves to square 17
Oops! Landed on a snake so slither down to 7
 
...
 
Turn #44
Player 1 on square 98 rolls a 5 but cannot move
Player 2 on square 47 rolls a 2 and moves to square 49
Player 3 on square 89 rolls a 5 and moves to square 94
 
Turn #45
Player 1 on square 98 rolls a 2 and moves to square 100
Player 1 wins after 155 moves
</pre>
 
 
=={{header|BASIC}}==
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic256">
arraybase 1
global SNL
map SNL
SNL[ 4] = 14
SNL[ 9] = 31
SNL[17] = 7
SNL[20] = 38
SNL[28] = 84
SNL[40] = 59
SNL[51] = 67
SNL[54] = 34
SNL[62] = 19
SNL[63] = 81
SNL[64] = 60
SNL[71] = 91
SNL[87] = 24
SNL[93] = 73
SNL[95] = 75
SNL[99] = 78
 
dim players(3)
players = {1, 1, 1}
 
do
for i = 1 to players[?]
ns = Turn(i, players[i - 1])
if ns = 100 then
print "Player "; i; " wins!"
exit do
end if
players[i - 1] = ns
print
next i
until False
end
 
function Turn(player, square)
sixesThrowAgain = True
do
roll = int(rand * 6)
print "Player "; player; ", on square "; square; ", rolls a "; roll;
if square + roll > 100 then
print " but cannot move."
else
square += roll
print " and moves to square "; square
if square = 100 then return 100
 
nxt = square
if SNL[square, square] then nxt = SNL[nxt, nxt]
if square < nxt then
print "Yay! Landed on a ladder. Climb up to "; nxt; "."
if nxt = 100 then return 100
square = nxt
else
if square > nxt then
print "Oops! Landed on a snake. Slither down to "; nxt; "."
square = nxt
end if
end if
end if
 
if roll < 6 or not sixesThrowAgain then return square
print "Rolled a 6 so roll again."
until False
end function
</syntaxhighlight>
 
 
=={{header|C}}==
{{trans|C++}}
<langsyntaxhighlight lang="c">#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
Line 100 ⟶ 532:
out:
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
{{trans|Kotlin}}
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
 
namespace SnakeAndLadder {
class Program {
private static Dictionary<int, int> snl = new Dictionary<int, int>() {
{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},
};
private static Random rand = new Random();
private const bool sixesThrowAgain = true;
 
static int Turn(int player, int square) {
while (true) {
int roll = rand.Next(1, 6);
Console.Write("Player {0}, on square {1}, rolls a {2}", player, square, roll);
if (square + roll > 100) {
Console.WriteLine(" but cannot move.");
} else {
square += roll;
Console.WriteLine(" and moves to square {0}", square);
if (square == 100) return 100;
int next = square;
if (snl.ContainsKey(square)) {
next = snl[square];
}
if (square < next) {
Console.WriteLine("Yay! Landed on a ladder. Climb up to {0}.", next);
if (next == 100) return 100;
square = next;
} else if (square > next) {
Console.WriteLine("Oops! Landed on a snake. Slither down to {0}.", next);
}
}
if (roll < 6 || !sixesThrowAgain) return square;
Console.WriteLine("Rolled a 6 so roll again.");
}
}
 
static void Main(string[] args) {
// three players atarting on square one
int[] players = { 1, 1, 1 };
while (true) {
for (int i = 0; i < players.Length; i++) {
int ns = Turn(i + 1, players[i]);
if (ns == 100) {
Console.WriteLine("Player {0} wins!", i + 1);
return;
}
players[i] = ns;
Console.WriteLine();
}
}
}
}
}</syntaxhighlight>
 
=={{header|C++}}==
{{trans|C#}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <map>
#include <random>
Line 185 ⟶ 690:
out:
return 0;
}</langsyntaxhighlight>
 
=={{header|C#|C sharp}}==
{{trans|Kotlin}}
<lang csharp>using System;
using System.Collections.Generic;
 
namespace SnakeAndLadder {
class Program {
private static Dictionary<int, int> snl = new Dictionary<int, int>() {
{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},
};
private static Random rand = new Random();
private const bool sixesThrowAgain = true;
 
static int Turn(int player, int square) {
while (true) {
int roll = rand.Next(1, 6);
Console.Write("Player {0}, on square {0}, rolls a {0}", player, square, roll);
if (square + roll > 100) {
Console.WriteLine(" but cannot move.");
} else {
square += roll;
Console.WriteLine(" and moves to square {0}", square);
if (square == 100) return 100;
int next = square;
if (snl.ContainsKey(square)) {
next = snl[square];
}
if (square < next) {
Console.WriteLine("Yay! Landed on a ladder. Climb up to {0}.", next);
if (next == 100) return 100;
square = next;
} else if (square > next) {
Console.WriteLine("Oops! Landed on a snake. Slither down to {0}.", next);
}
}
if (roll < 6 || !sixesThrowAgain) return square;
Console.WriteLine("Rolled a 6 so roll again.");
}
}
 
static void Main(string[] args) {
// three players atarting on square one
int[] players = { 1, 1, 1 };
while (true) {
for (int i = 0; i < players.Length; i++) {
int ns = Turn(i + 1, players[i]);
if (ns == 100) {
Console.WriteLine("Player {0} wins!", i + 1);
return;
}
players[i] = ns;
Console.WriteLine();
}
}
}
}
}</lang>
 
=={{header|D}}==
{{trans|Perl 6Raku}}
<langsyntaxhighlight Dlang="d">import std.stdio;
 
//Board layout, start square to end square
Line 324 ⟶ 756:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>Player 1 on square 1 rolls a 5 and moves to square 6
Line 448 ⟶ 880:
Player 2 on square 94 rolls a 6 and moves to square 100
Player 2 wins!</pre>
 
 
=={{header|FreeBASIC}}==
{{trans|Visual Basic .NET}}
<syntaxhighlight lang="freebasic">
Dim Shared As Integer SNL(1 To 16, 1 To 2) => {_
{ 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}}
 
Randomize Timer
 
Const sixesThrowAgain = True
 
Function Turn(player As Integer, square As Integer) As Integer
Do
Dim As Integer roll = Int(Rnd * 6) + 1
Print "Player"; player; ", on square"; square; ", rolls a"; roll;
If square + roll > 100 Then
Print " but cannot move."
Else
square += roll
Print " and moves to square"; square
If square = 100 Then Return 100 : End If
Dim As Integer nxt = square
If SNL(square, square) Then nxt = SNL(nxt, nxt) : End If
If square < nxt Then
Print "Yay! Landed on a ladder. Climb up to"; nxt; "."
If nxt = 100 Then Return 100 : End If
square = nxt
Elseif square > nxt Then
Print "Oops! Landed on a snake. Slither down to"; nxt; "."
square = nxt
End If
End If
If roll < 6 Orelse Not sixesThrowAgain Then Return square : End If
Print "Rolled a 6 so roll again."
Loop
End Function
 
Dim As Integer players(3) = {1, 1, 1}
Do
For i As Integer = 1 To Ubound(players)
Dim As Integer ns = Turn(i, players(i - 1))
If ns = 100 Then
Print "Player"; i; " wins!"
Exit Do
End If
players(i - 1) = ns
Print
Next i
Loop
Sleep
</syntaxhighlight>
 
 
=={{header|Go}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 515 ⟶ 1,003:
}
}
}</langsyntaxhighlight>
 
Sample game:
Line 704 ⟶ 1,192:
 
The following game starts with players' counters off the board, an exact roll is not required to win and no additional dice roll results from throwing a six.
<langsyntaxhighlight lang="j">require 'format/printf general/misc/prompt'
SnakesLadders=: _2 ]\ 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
'idx val'=: |: SnakesLadders
Line 719 ⟶ 1,207:
 
start=: >:@".@prompt&'How many players to play against?' [ echo bind 'You are Player 1!'
playSnakesLadders=: [: report@runGame start</langsyntaxhighlight>
 
'''Example Usage:'''
<langsyntaxhighlight lang="j"> playSnakesLadders''
You are Player 1!
How many players to play against?
Line 742 ⟶ 1,230:
60 73 44 94 45
61 79 50 100 49
Player 4 won!</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.util.Map;
import java.util.Random;
 
Line 811 ⟶ 1,299:
}
}
}</langsyntaxhighlight>
 
=={{header|Julia}}==
{{trans|Python}}
The game is pure chance, with a 2% advantage to going before the next player. See statistics below.
<syntaxhighlight lang="julia">const landingtoending = Dict(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)
 
const sixesrollagain = true
 
function takeaturn(player, square, verbose=true)
while true
roll = rand(1:6)
verbose && print("Player $player on square $square rolls a $roll ")
if square + roll > 100
verbose && println(" but cannot move.")
else
square += roll
verbose && println(" and moves to square $square.")
if square == 100
return 100
end
next = get(landingtoending, square, square)
if square < next
verbose && println("Yay! landed on a ladder. Climb up to $next.")
if square == 100
return 100
end
square = next
elseif square > next
verbose && println("Oops! Landed on a snake chute. Slither down to $next.")
square = next
end
end
if roll < 6 || !sixesrollagain
return square
else
verbose && println("Rolled a 6, so roll again.")
end
end
end
 
function snakesandladdersgame(nplayers, verbose=true)
players = ones(Int, nplayers)
while true
for (player, position) in enumerate(players)
ns = takeaturn(player, position, verbose)
if ns == 100
verbose && println("Player $player wins!")
return player
end
players[player] = ns
verbose && println()
end
end
end
 
snakesandladdersgame(3)
 
using DataFrames, GLM
 
function slstats(nplayers, ngames)
players = zeros(Int, nplayers)
for i in 1:ngames
winner = snakesandladdersgame(nplayers, false)
players[winner] += 1
end
println("\n\n\nStats: out of $ngames games, winners by order of play are:\n # | wins \n----------------")
for (i, player) in enumerate(players)
println(" $i $player")
end
data = DataFrame(X = collect(1:nplayers), Y = players)
ols = lm(@formula(Y ~ X), data)
println("\nStatistics:\n", ols)
end
 
slstats(5, 1000000)
</syntaxhighlight>{{out}}
<pre>
Player 1 on square 1 rolls a 5 and moves to square 6.
 
Player 2 on square 1 rolls a 3 and moves to square 4.
Yay! landed on a ladder. Climb up to 14.
 
Player 3 on square 1 rolls a 5 and moves to square 6.
 
Player 1 on square 6 rolls a 1 and moves to square 7.
 
Player 2 on square 14 rolls a 5 and moves to square 19.
 
Player 3 on square 6 rolls a 5 and moves to square 11.
 
Player 1 on square 7 rolls a 2 and moves to square 9.
Yay! landed on a ladder. Climb up to 31.
 
Player 2 on square 19 rolls a 3 and moves to square 22.
 
Player 3 on square 11 rolls a 3 and moves to square 14.
 
Player 1 on square 31 rolls a 5 and moves to square 36.
 
Player 2 on square 22 rolls a 3 and moves to square 25.
 
Player 3 on square 14 rolls a 4 and moves to square 18.
 
Player 1 on square 36 rolls a 6 and moves to square 42.
Rolled a 6, so roll again.
Player 1 on square 42 rolls a 6 and moves to square 48.
Rolled a 6, so roll again.
Player 1 on square 48 rolls a 3 and moves to square 51.
Yay! landed on a ladder. Climb up to 67.
 
Player 2 on square 25 rolls a 2 and moves to square 27.
 
Player 3 on square 18 rolls a 3 and moves to square 21.
 
Player 1 on square 67 rolls a 1 and moves to square 68.
 
Player 2 on square 27 rolls a 1 and moves to square 28.
Yay! landed on a ladder. Climb up to 84.
 
Player 3 on square 21 rolls a 6 and moves to square 27.
Rolled a 6, so roll again.
Player 3 on square 27 rolls a 5 and moves to square 32.
 
Player 1 on square 68 rolls a 3 and moves to square 71.
Yay! landed on a ladder. Climb up to 91.
 
Player 2 on square 84 rolls a 5 and moves to square 89.
 
Player 3 on square 32 rolls a 2 and moves to square 34.
 
Player 1 on square 91 rolls a 6 and moves to square 97.
Rolled a 6, so roll again.
Player 1 on square 97 rolls a 5 but cannot move.
 
Player 2 on square 89 rolls a 4 and moves to square 93.
Oops! Landed on a snake chute. Slither down to 73.
 
Player 3 on square 34 rolls a 1 and moves to square 35.
 
Player 1 on square 97 rolls a 3 and moves to square 100.
Player 1 wins!
 
 
 
Stats: out of 1000000 games, winners by order of play are:
# | wins
----------------
1 208036
2 204760
3 199392
4 195319
5 192493
 
Statistics:
StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}
 
Y ~ 1 + X
 
Coefficients:
──────────────────────────────────────────────────────────────────────────────────────
Estimate Std. Error t value Pr(>|t|) Lower 95% Upper 95%
──────────────────────────────────────────────────────────────────────────────────────
(Intercept) 2.12158e5 772.519 274.632 <1e-6 2.097e5 2.14617e5
X -4052.7 232.923 -17.3993 0.0004 -4793.97 -3311.43
──────────────────────────────────────────────────────────────────────────────────────
</pre>
 
=={{header|Kotlin}}==
Line 817 ⟶ 1,473:
 
This includes an option for the player to automatically roll again when a six is rolled which I believe is a common variation:
<langsyntaxhighlight lang="scala">// version 1.2.0
 
import java.util.Random
Line 872 ⟶ 1,528:
}
}
}</langsyntaxhighlight>
 
Sample output:
Line 970 ⟶ 1,626:
Player 3 wins!
</pre>
 
=={{header|Lua}}==
{{trans|C}}
<syntaxhighlight lang="lua">local sixesThrowAgain = true
 
function rollDice()
return math.random(6)
end
 
function nextSquare(square)
if square == 4 then
return 14
elseif square == 9 then
return 31
elseif square == 17 then
return 7
elseif square == 20 then
return 38
elseif square == 28 then
return 84
elseif square == 40 then
return 59
elseif square == 51 then
return 67
elseif square == 54 then
return 34
elseif square == 62 then
return 19
elseif square == 63 then
return 81
elseif square == 64 then
return 60
elseif square == 71 then
return 91
elseif square == 87 then
return 24
elseif square == 93 then
return 73
elseif square == 95 then
return 75
elseif square == 99 then
return 78
else
return square
end
end
 
function turn(player, square)
while true do
local roll = rollDice()
io.write(string.format("Player %d, on square %d, rolls a %d", player, square, roll))
if square + roll > 100 then
io.write(" but cannot move.\n")
else
square = square + roll
io.write(string.format(" and moves to square %d\n", square))
if square == 100 then
return 100
end
local nxt = nextSquare(square)
if square < nxt then
io.write(string.format("Yay! Landed on a ladder. Climb up to %d\n", square))
square = nxt
elseif nxt < square then
io.write(string.format("Oops! Landed on a snake. Slither down to %d\n", square))
square = nxt
end
end
if roll < 6 or not sizexThrowAgain then
return square
end
io.write("Rolled a 6 so roll again.\n")
end
end
 
function main()
local players = {1, 1, 1}
 
while true do
for i=1,3 do
local ns = turn(i, players[i])
if ns == 100 then
io.write(string.format("Player %d wins!\n", i))
return
end
players[i] = ns
print()
end
end
end
 
main()</syntaxhighlight>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE SnakeAndLadder;
FROM FormatString IMPORT FormatString;
FROM RandomNumbers IMPORT Random;
Line 1,068 ⟶ 1,816:
 
ReadChar
END SnakeAndLadder.</langsyntaxhighlight>
 
=={{header|Nim}}==
{{trans|Kotlin}}
<syntaxhighlight lang="nim">import random, sequtils, strformat, tables
 
const Snl = {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}.toTable
 
const SixThrowsAgain = true
 
 
proc turn(player, square: Positive): int =
var square = square
while true:
let roll = rand(1..6)
stdout.write &"Player {player}, on square {square}, rolls a {roll}"
if square + roll > 100:
echo " but cannot move."
else:
inc square, roll
echo &" and moves to square {square}."
if square == 100: return 100
let next = Snl.getOrDefault(square, square)
if square < next:
echo &"Yay! Landed on a ladder. Climb up to {next}."
if next == 100: return 100
square = next
elif square > next:
echo &"Oops! Landed on a snake. Slither down to {next}."
square = next
if roll < 6 or not SixThrowsAgain: return square
echo "Rolled a 6 so roll again."
 
 
proc playGame(n: Positive) =
 
# "n" players starting on square one.
var players = repeat(1, n)
while true:
for i, s in players:
let ns = turn(i + 1, s)
if ns == 100:
echo &"Player {i+1} wins!"
return
players[i] = ns
echo()
 
randomize()
 
when isMainModule:
playGame(3)</syntaxhighlight>
 
{{out}}
Sample game.
<pre>Player 1, on square 1, rolls a 4 and moves to square 5.
 
Player 2, on square 1, rolls a 5 and moves to square 6.
 
Player 3, on square 1, rolls a 2 and moves to square 3.
 
Player 1, on square 5, rolls a 5 and moves to square 10.
 
Player 2, on square 6, rolls a 3 and moves to square 9.
Yay! Landed on a ladder. Climb up to 31.
 
Player 3, on square 3, rolls a 5 and moves to square 8.
 
Player 1, on square 10, rolls a 1 and moves to square 11.
 
Player 2, on square 31, rolls a 3 and moves to square 34.
 
Player 3, on square 8, rolls a 1 and moves to square 9.
Yay! Landed on a ladder. Climb up to 31.
 
Player 1, on square 11, rolls a 1 and moves to square 12.
 
Player 2, on square 34, rolls a 2 and moves to square 36.
 
Player 3, on square 31, rolls a 1 and moves to square 32.
 
Player 1, on square 12, rolls a 1 and moves to square 13.
 
Player 2, on square 36, rolls a 6 and moves to square 42.
Rolled a 6 so roll again.
Player 2, on square 42, rolls a 5 and moves to square 47.
 
Player 3, on square 32, rolls a 2 and moves to square 34.
 
Player 1, on square 13, rolls a 6 and moves to square 19.
Rolled a 6 so roll again.
Player 1, on square 19, rolls a 5 and moves to square 24.
 
Player 2, on square 47, rolls a 1 and moves to square 48.
 
Player 3, on square 34, rolls a 6 and moves to square 40.
Yay! Landed on a ladder. Climb up to 59.
Rolled a 6 so roll again.
Player 3, on square 59, rolls a 1 and moves to square 60.
 
Player 1, on square 24, rolls a 5 and moves to square 29.
 
Player 2, on square 48, rolls a 1 and moves to square 49.
 
Player 3, on square 60, rolls a 4 and moves to square 64.
Oops! Landed on a snake. Slither down to 60.
 
Player 1, on square 29, rolls a 1 and moves to square 30.
 
Player 2, on square 49, rolls a 2 and moves to square 51.
Yay! Landed on a ladder. Climb up to 67.
 
Player 3, on square 60, rolls a 6 and moves to square 66.
Rolled a 6 so roll again.
Player 3, on square 66, rolls a 5 and moves to square 71.
Yay! Landed on a ladder. Climb up to 91.
 
Player 1, on square 30, rolls a 1 and moves to square 31.
 
Player 2, on square 67, rolls a 5 and moves to square 72.
 
Player 3, on square 91, rolls a 3 and moves to square 94.
 
Player 1, on square 31, rolls a 3 and moves to square 34.
 
Player 2, on square 72, rolls a 1 and moves to square 73.
 
Player 3, on square 94, rolls a 2 and moves to square 96.
 
Player 1, on square 34, rolls a 6 and moves to square 40.
Yay! Landed on a ladder. Climb up to 59.
Rolled a 6 so roll again.
Player 1, on square 59, rolls a 2 and moves to square 61.
 
Player 2, on square 73, rolls a 2 and moves to square 75.
 
Player 3, on square 96, rolls a 4 and moves to square 100.
Player 3 wins!</pre>
 
=={{header|Perl}}==
{{trans|Perl 6Raku}}
<langsyntaxhighlight lang="perl"># board layout
my %snl =( 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);
Line 1,108 ⟶ 1,993:
if ($$square == 100) {print "Player $player wins after $turn_count turns.\n"; exit }
return
}</langsyntaxhighlight>
{{out}}
<pre>Player 1 on square 1 rolls a 3. Yay! Landed on a ladder. Climb up to 14.
Line 1,122 ⟶ 2,007:
Player 2 on square 98 rolls a 2 and moves to square 100
Player 2 wins after 706 turns.</pre>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2017.01}}
Snakes and ladders is entirely chance based, so human interaction is not really required. This version allows up to one human player against any number of computer players and asks for input... but doesn't really ''need'' or even ''use'' it. I didn't bother to implement a graphical interface.
 
<lang perl6> # board layout
my %snl = 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;
 
my @players = 1, 1, 1; # three players, starting on square 1
my $human = 1; # player 1 is human. set to 0 for all computer players
 
loop {
for ^@players -> $player {
turn(@players[$player], $player + 1);
}
say '';
}
 
sub turn ($square is rw, $player) {
if $player == $human {
prompt "You are on square $square. Hit enter to roll the die.";
}
my $roll = (1..6).roll;
my $turn = $square + $roll;
printf "Player $player on square %2d rolls a $roll", $square;
if $turn > 100 {
say " but cannot move. Next players turn.";
return $square;
}
if %snl{$turn} {
$square = %snl{$turn};
if $turn > $square {
say ". Oops! Landed on a snake. Slither down to $square."
} else {
say ". Yay! Landed on a ladder. Climb up to $square."
}
} else {
$square = $turn;
say " and moves to square $square";
}
say "Player $player wins!" and exit if $square == 100;
return $square;
}</lang>
{{out|Sample output}}
<pre>You are on square 1. Hit enter to roll the die.
Player 1 on square 1 rolls a 1 and moves to square 2
Player 2 on square 1 rolls a 4 and moves to square 5
Player 3 on square 1 rolls a 1 and moves to square 2
 
You are on square 2. Hit enter to roll the die.
Player 1 on square 2 rolls a 1 and moves to square 3
Player 2 on square 5 rolls a 2 and moves to square 7
Player 3 on square 2 rolls a 3 and moves to square 5
 
You are on square 3. Hit enter to roll the die.
Player 1 on square 3 rolls a 4 and moves to square 7
Player 2 on square 7 rolls a 1 and moves to square 8
Player 3 on square 5 rolls a 2 and moves to square 7
 
You are on square 7. Hit enter to roll the die.
Player 1 on square 7 rolls a 2. Yay! Landed on a ladder. Climb up to 31.
Player 2 on square 8 rolls a 3 and moves to square 11
Player 3 on square 7 rolls a 2. Yay! Landed on a ladder. Climb up to 31.
 
... about 15 turns omitted ...
 
You are on square 90. Hit enter to roll the die.
Player 1 on square 90 rolls a 3. Oops! Landed on a snake. Slither down to 73.
Player 2 on square 55 rolls a 3 and moves to square 58
Player 3 on square 90 rolls a 4 and moves to square 94
 
You are on square 73. Hit enter to roll the die.
Player 1 on square 73 rolls a 6 and moves to square 79
Player 2 on square 58 rolls a 5. Yay! Landed on a ladder. Climb up to 81.
Player 3 on square 94 rolls a 3 and moves to square 97
 
You are on square 79. Hit enter to roll the die.
Player 1 on square 79 rolls a 3 and moves to square 82
Player 2 on square 81 rolls a 6. Oops! Landed on a snake. Slither down to 24.
Player 3 on square 97 rolls a 5 but cannot move. Next players turn.
 
You are on square 82. Hit enter to roll the die.
Player 1 on square 82 rolls a 5. Oops! Landed on a snake. Slither down to 24.
Player 2 on square 24 rolls a 6 and moves to square 30
Player 3 on square 97 rolls a 4 but cannot move. Next players turn.
 
You are on square 24. Hit enter to roll the die.
Player 1 on square 24 rolls a 4. Yay! Landed on a ladder. Climb up to 84.
Player 2 on square 30 rolls a 5 and moves to square 35
Player 3 on square 97 rolls a 4 but cannot move. Next players turn.
 
You are on square 84. Hit enter to roll the die.
Player 1 on square 84 rolls a 1 and moves to square 85
Player 2 on square 35 rolls a 2 and moves to square 37
Player 3 on square 97 rolls a 3 and moves to square 100
Player 3 wins!</pre>
 
=={{header|Phix}}==
{{trans|C#}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>constant sixesThrowAgain = true
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
 
<span style="color: #008080;">constant</span> <span style="color: #000000;">sixesThrowAgain</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
constant snl = new_dict({{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}})
<span style="color: #008080;">constant</span> <span style="color: #000000;">snl</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">14</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">31</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span><span style="color: #000000;">38</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">28</span><span style="color: #0000FF;">,</span><span style="color: #000000;">84</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">40</span><span style="color: #0000FF;">,</span><span style="color: #000000;">59</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">51</span><span style="color: #0000FF;">,</span><span style="color: #000000;">67</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">54</span><span style="color: #0000FF;">,</span><span style="color: #000000;">34</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">62</span><span style="color: #0000FF;">,</span><span style="color: #000000;">19</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">63</span><span style="color: #0000FF;">,</span><span style="color: #000000;">81</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">64</span><span style="color: #0000FF;">,</span><span style="color: #000000;">60</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">71</span><span style="color: #0000FF;">,</span><span style="color: #000000;">91</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">87</span><span style="color: #0000FF;">,</span><span style="color: #000000;">24</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">93</span><span style="color: #0000FF;">,</span><span style="color: #000000;">73</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">95</span><span style="color: #0000FF;">,</span><span style="color: #000000;">75</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">99</span><span style="color: #0000FF;">,</span><span style="color: #000000;">78</span><span style="color: #0000FF;">}})</span>
constant msgs = {". Oops! Landed on a snake. Slither down to %d.\n", -- (next<square)
" and moves to square %d\n", -- (next=square)
<span style="color: #008080;">constant</span> <span style="color: #000000;">msgs</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">". Oops! Landed on a snake. Slither down to %d.\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (next&lt;square)</span>
". Yay! Landed on a ladder. Climb up to %d.\n"} -- (next>square)
<span style="color: #008000;">" and moves to square %d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (next=square)</span>
<span style="color: #008000;">". Yay! Landed on a ladder. Climb up to %d.\n"</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- (next&gt;square)</span>
function Turn(integer player, square)
while true do
<span style="color: #008080;">function</span> <span style="color: #000000;">Turn</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">player</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">square</span><span style="color: #0000FF;">)</span>
integer roll = rand(6)
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
printf(1,"Player %d, on square %d, rolls a %d", {player, square, roll})
<span style="color: #004080;">integer</span> <span style="color: #000000;">roll</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)</span>
if square+roll>100 then
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player %d, on square %d, rolls a %d"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">player</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">square</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">roll</span><span style="color: #0000FF;">})</span>
puts(1," but cannot move.\n")
<span style="color: #008080;">if</span> <span style="color: #000000;">square</span><span style="color: #0000FF;">+</span><span style="color: #000000;">roll</span><span style="color: #0000FF;">></span><span style="color: #000000;">100</span> <span style="color: #008080;">then</span>
else
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" but cannot move.\n"</span><span style="color: #0000FF;">)</span>
square += roll
<span style="color: #008080;">else</span>
integer next = getd(square,snl)
<span style="color: #000000;">square</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">roll</span>
if next=0 then next=square end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">next</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">getd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">square</span><span style="color: #0000FF;">,</span><span style="color: #000000;">snl</span><span style="color: #0000FF;">)</span>
printf(1,msgs[compare(next,square)+2],next)
<span style="color: #008080;">if</span> <span style="color: #000000;">next</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">next</span><span style="color: #0000FF;">=</span><span style="color: #000000;">square</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
square = next
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">msgs</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">compare</span><span style="color: #0000FF;">(</span><span style="color: #000000;">next</span><span style="color: #0000FF;">,</span><span style="color: #000000;">square</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #000000;">next</span><span style="color: #0000FF;">)</span>
if square==100 then exit end if
<span style="color: #000000;">square</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">next</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">square</span><span style="color: #0000FF;">==</span><span style="color: #000000;">100</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if roll<6 or not sixesThrowAgain then exit end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
puts(1,"Rolled a 6 so roll again.\n")
<span style="color: #008080;">if</span> <span style="color: #000000;">roll</span><span style="color: #0000FF;"><</span><span style="color: #000000;">6</span> <span style="color: #008080;">or</span> <span style="color: #008080;">not</span> <span style="color: #000000;">sixesThrowAgain</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end while
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Rolled a 6 so roll again.\n"</span><span style="color: #0000FF;">)</span>
return square
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">square</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
sequence players = {1,1,1} -- three players starting on square one
while true do
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
for i=1 to length(players) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">players</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- three players starting on square one</span>
players[i] = Turn(i, players[i])
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
if players[i]==100 then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">players</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
printf(1,"Player %d wins!\n",i)
<span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">Turn</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
exit
<span style="color: #008080;">if</span> <span style="color: #000000;">players</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]==</span><span style="color: #000000;">100</span> <span style="color: #008080;">then</span>
end if
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player %d wins!\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">return</span>
end while</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,271 ⟶ 2,065:
Player 2, on square 97, rolls a 3 and moves to square 100
Player 2 wins!
</pre>
 
=={{header|PicoLisp}}==
<syntaxhighlight lang="picolisp">(seed (in "/dev/urandom" (rd 8)))
(setq *D
'((4 14 T) (9 31 T) (17 7) (20 38 T)
(28 84 T) (40 59 T) (51 67 T) (54 34)
(62 19) (63 81 T) (64 60) (71 91 T)
(87 24) (93 73) (95 75) (99 78) ) )
(de players (N)
(make
(for I N
(let P (pack "Player " I)
(set P 1)
(link P) ) ) ) )
(de turn (P)
(use D
(loop
(setq D (rand 1 6))
(prin P " on square " (val P) ", rolls a " D)
(if (> (+ (val P) D) 100)
(prinl " but cannot move")
(set P (+ (val P) D))
(prinl " and move to square " (val P))
(when (= (val P) 100)
(prinl P " wins!")
(throw 'win) )
(when (assoc (val P) *D)
(set P (cadr @))
(if (cddr @)
(prinl "Yay! Landed on ladder. Climb up to " (val P))
(prinl "Ooops! Landed on snake. Slither down to " (val P)) ) ) )
(T (> 6 D))
(prinl "Rolled a 6 so roll again") ) ) )
(de main (N)
(let P (players N)
(catch 'win
(loop
(mapc turn P) ) ) ) )
(main 10)</syntaxhighlight>
{{out}}
<pre>
Player 1 on square 1, rolls a 5 and move to square 6
Player 2 on square 1, rolls a 2 and move to square 3
Player 3 on square 1, rolls a 2 and move to square 3
Player 4 on square 1, rolls a 6 and move to square 7
Rolled a 6 so roll again
Player 4 on square 7, rolls a 5 and move to square 12
Player 5 on square 1, rolls a 3 and move to square 4
Yay! Landed on ladder. Climb up to 14
Player 6 on square 1, rolls a 4 and move to square 5
Player 7 on square 1, rolls a 1 and move to square 2
Player 8 on square 1, rolls a 4 and move to square 5
Player 9 on square 1, rolls a 1 and move to square 2
Player 10 on square 1, rolls a 2 and move to square 3
...
...
...
Ooops! Landed on snake. Slither down to 60
Rolled a 6 so roll again
Player 9 on square 60, rolls a 6 and move to square 66
Rolled a 6 so roll again
Player 9 on square 66, rolls a 2 and move to square 68
Player 10 on square 96, rolls a 4 and move to square 100
Player 10 wins!
</pre>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">import random
import sys
 
Line 1,332 ⟶ 2,191:
print
 
main()</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="Quackery"> [ this ] is .. ( --> [ )
 
[ table 0
.. .. .. 14 .. .. .. .. 31 ..
.. .. .. .. .. .. -7 .. .. 38
.. .. .. .. .. .. .. 84 .. ..
.. .. .. .. .. .. .. .. .. 59
.. .. .. .. .. .. .. .. .. ..
67 .. .. -34 .. .. .. .. .. ..
.. -19 81 -60 .. .. .. .. .. ..
91 .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. -24 .. .. ..
.. .. -73 .. -75 .. .. .. -78 .. ] is board ( n --> x )
 
[ $ "What are the player's names? "
input nest$ shuffle
cr say "Order of play: "
dup witheach [ echo$ sp ] cr cr
dup size 0 swap of
false temp put
[ temp share if
[ say "Rolling 6 means the player"
say " receives another go." cr
-1 split swap join
dip [ -1 split swap join ] ]
dip
[ behead dup echo$
nested join ]
behead
say " rolls "
6 random 1+ dup echo
dup 6 = temp replace
2dup + 100 > iff
[ say " which is too many "
say "so they don't move." cr
drop join ]
again
say " and moves to "
+ dup echo
dup 100 = iff
[ say " and wins." cr
drop ]
done
dup board
dup .. = iff
[ drop join
say "." cr ]
again
dup 0 < iff
[ say " which is a snake"
say " so they drop to "
abs dup echo say "." cr
nip join ]
again
say " which is a ladder"
say " so they rise to "
dup echo say "." cr
nip join
again ]
2drop
temp release ] is play ( --> [ )
 
play</syntaxhighlight>
 
{{out}}
 
<div style="height: 320px;overflow:scroll">
<pre>What are the player's names? Hector Zsazsa Kiki
 
Order of play: Kiki Zsazsa Hector
 
Kiki rolls 6 and moves to 6.
Rolling 6 means the player receives another go.
Kiki rolls 4 and moves to 10.
Zsazsa rolls 5 and moves to 5.
Hector rolls 1 and moves to 1.
Kiki rolls 2 and moves to 12.
Zsazsa rolls 2 and moves to 7.
Hector rolls 3 and moves to 4 which is a ladder so they rise to 14.
Kiki rolls 3 and moves to 15.
Zsazsa rolls 4 and moves to 11.
Hector rolls 1 and moves to 15.
Kiki rolls 4 and moves to 19.
Zsazsa rolls 5 and moves to 16.
Hector rolls 1 and moves to 16.
Kiki rolls 4 and moves to 23.
Zsazsa rolls 4 and moves to 20 which is a ladder so they rise to 38.
Hector rolls 2 and moves to 18.
Kiki rolls 5 and moves to 28 which is a ladder so they rise to 84.
Zsazsa rolls 3 and moves to 41.
Hector rolls 6 and moves to 24.
Rolling 6 means the player receives another go.
Hector rolls 2 and moves to 26.
Kiki rolls 3 and moves to 87 which is a snake so they drop to 24.
Zsazsa rolls 6 and moves to 47.
Rolling 6 means the player receives another go.
Zsazsa rolls 5 and moves to 52.
Hector rolls 6 and moves to 32.
Rolling 6 means the player receives another go.
Hector rolls 6 and moves to 38.
Rolling 6 means the player receives another go.
Hector rolls 3 and moves to 41.
Kiki rolls 5 and moves to 29.
Zsazsa rolls 5 and moves to 57.
Hector rolls 3 and moves to 44.
Kiki rolls 2 and moves to 31.
Zsazsa rolls 1 and moves to 58.
Hector rolls 4 and moves to 48.
Kiki rolls 4 and moves to 35.
Zsazsa rolls 3 and moves to 61.
Hector rolls 4 and moves to 52.
Kiki rolls 1 and moves to 36.
Zsazsa rolls 3 and moves to 64 which is a snake so they drop to 60.
Hector rolls 6 and moves to 58.
Rolling 6 means the player receives another go.
Hector rolls 4 and moves to 62 which is a snake so they drop to 19.
Kiki rolls 4 and moves to 40 which is a ladder so they rise to 59.
Zsazsa rolls 6 and moves to 66.
Rolling 6 means the player receives another go.
Zsazsa rolls 6 and moves to 72.
Rolling 6 means the player receives another go.
Zsazsa rolls 4 and moves to 76.
Hector rolls 4 and moves to 23.
Kiki rolls 3 and moves to 62 which is a snake so they drop to 19.
Zsazsa rolls 3 and moves to 79.
Hector rolls 3 and moves to 26.
Kiki rolls 6 and moves to 25.
Rolling 6 means the player receives another go.
Kiki rolls 2 and moves to 27.
Zsazsa rolls 4 and moves to 83.
Hector rolls 6 and moves to 32.
Rolling 6 means the player receives another go.
Hector rolls 6 and moves to 38.
Rolling 6 means the player receives another go.
Hector rolls 6 and moves to 44.
Rolling 6 means the player receives another go.
Hector rolls 1 and moves to 45.
Kiki rolls 2 and moves to 29.
Zsazsa rolls 2 and moves to 85.
Hector rolls 6 and moves to 51 which is a ladder so they rise to 67.
Rolling 6 means the player receives another go.
Hector rolls 1 and moves to 68.
Kiki rolls 2 and moves to 31.
Zsazsa rolls 3 and moves to 88.
Hector rolls 6 and moves to 74.
Rolling 6 means the player receives another go.
Hector rolls 4 and moves to 78.
Kiki rolls 6 and moves to 37.
Rolling 6 means the player receives another go.
Kiki rolls 1 and moves to 38.
Zsazsa rolls 3 and moves to 91.
Hector rolls 5 and moves to 83.
Kiki rolls 3 and moves to 41.
Zsazsa rolls 4 and moves to 95 which is a snake so they drop to 75.
Hector rolls 6 and moves to 89.
Rolling 6 means the player receives another go.
Hector rolls 5 and moves to 94.
Kiki rolls 4 and moves to 45.
Zsazsa rolls 6 and moves to 81.
Rolling 6 means the player receives another go.
Zsazsa rolls 3 and moves to 84.
Hector rolls 3 and moves to 97.
Kiki rolls 1 and moves to 46.
Zsazsa rolls 6 and moves to 90.
Rolling 6 means the player receives another go.
Zsazsa rolls 6 and moves to 96.
Rolling 6 means the player receives another go.
Zsazsa rolls 1 and moves to 97.
Hector rolls 6 which is too many so they don't move.
Rolling 6 means the player receives another go.
Hector rolls 2 and moves to 99 which is a snake so they drop to 78.
Kiki rolls 4 and moves to 50.
Zsazsa rolls 5 which is too many so they don't move.
Hector rolls 1 and moves to 79.
Kiki rolls 2 and moves to 52.
Zsazsa rolls 3 and moves to 100 and wins.
</pre>
</div>
 
=={{header|Racket}}==
<langsyntaxhighlight 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))
Line 1,362 ⟶ 2,402:
 
(module+ main
(find-game-winner 5 #t (λ (p) (printf "~%~%The winner of the game is player #~a" p))))</langsyntaxhighlight>
 
{{out}}
Line 1,384 ⟶ 2,424:
 
The winner of the game is player #2</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2017.01}}
Snakes and ladders is entirely chance based, so human interaction is not really required. This version allows up to one human player against any number of computer players and asks for input... but doesn't really ''need'' or even ''use'' it. I didn't bother to implement a graphical interface.
 
<syntaxhighlight lang="raku" line> # board layout
my %snl = 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;
 
my @players = 1, 1, 1; # three players, starting on square 1
my $human = 1; # player 1 is human. set to 0 for all computer players
 
loop {
for ^@players -> $player {
turn(@players[$player], $player + 1);
}
say '';
}
 
sub turn ($square is rw, $player) {
if $player == $human {
prompt "You are on square $square. Hit enter to roll the die.";
}
my $roll = (1..6).roll;
my $turn = $square + $roll;
printf "Player $player on square %2d rolls a $roll", $square;
if $turn > 100 {
say " but cannot move. Next players turn.";
return $square;
}
if %snl{$turn} {
$square = %snl{$turn};
if $turn > $square {
say ". Oops! Landed on a snake. Slither down to $square."
} else {
say ". Yay! Landed on a ladder. Climb up to $square."
}
} else {
$square = $turn;
say " and moves to square $square";
}
say "Player $player wins!" and exit if $square == 100;
return $square;
}</syntaxhighlight>
{{out|Sample output}}
<pre>You are on square 1. Hit enter to roll the die.
Player 1 on square 1 rolls a 1 and moves to square 2
Player 2 on square 1 rolls a 4 and moves to square 5
Player 3 on square 1 rolls a 1 and moves to square 2
 
You are on square 2. Hit enter to roll the die.
Player 1 on square 2 rolls a 1 and moves to square 3
Player 2 on square 5 rolls a 2 and moves to square 7
Player 3 on square 2 rolls a 3 and moves to square 5
 
You are on square 3. Hit enter to roll the die.
Player 1 on square 3 rolls a 4 and moves to square 7
Player 2 on square 7 rolls a 1 and moves to square 8
Player 3 on square 5 rolls a 2 and moves to square 7
 
You are on square 7. Hit enter to roll the die.
Player 1 on square 7 rolls a 2. Yay! Landed on a ladder. Climb up to 31.
Player 2 on square 8 rolls a 3 and moves to square 11
Player 3 on square 7 rolls a 2. Yay! Landed on a ladder. Climb up to 31.
 
... about 15 turns omitted ...
 
You are on square 90. Hit enter to roll the die.
Player 1 on square 90 rolls a 3. Oops! Landed on a snake. Slither down to 73.
Player 2 on square 55 rolls a 3 and moves to square 58
Player 3 on square 90 rolls a 4 and moves to square 94
 
You are on square 73. Hit enter to roll the die.
Player 1 on square 73 rolls a 6 and moves to square 79
Player 2 on square 58 rolls a 5. Yay! Landed on a ladder. Climb up to 81.
Player 3 on square 94 rolls a 3 and moves to square 97
 
You are on square 79. Hit enter to roll the die.
Player 1 on square 79 rolls a 3 and moves to square 82
Player 2 on square 81 rolls a 6. Oops! Landed on a snake. Slither down to 24.
Player 3 on square 97 rolls a 5 but cannot move. Next players turn.
 
You are on square 82. Hit enter to roll the die.
Player 1 on square 82 rolls a 5. Oops! Landed on a snake. Slither down to 24.
Player 2 on square 24 rolls a 6 and moves to square 30
Player 3 on square 97 rolls a 4 but cannot move. Next players turn.
 
You are on square 24. Hit enter to roll the die.
Player 1 on square 24 rolls a 4. Yay! Landed on a ladder. Climb up to 84.
Player 2 on square 30 rolls a 5 and moves to square 35
Player 3 on square 97 rolls a 4 but cannot move. Next players turn.
 
You are on square 84. Hit enter to roll the die.
Player 1 on square 84 rolls a 1 and moves to square 85
Player 2 on square 35 rolls a 2 and moves to square 37
Player 3 on square 97 rolls a 3 and moves to square 100
Player 3 wins!</pre>
 
=={{header|REXX}}==
{{trans|D}}
<!-- for Regina REXX, use a seed of 8 to produce the game shown below. !-->
<langsyntaxhighlight lang="rexx">/*REXX program plays "Snakes and Ladders" game for any number of players (default 3). */
parse arg np seed . /*obtain optional arguments from the CL*/
if np=='' | np=="," then np= 3 /*Not specified? Then use the default.*/
Line 1,420 ⟶ 2,558:
if square<next then say right(@ladder, 69)
else if square>next then say right(@oops , 69)
return next</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 1,472 ⟶ 2,610:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">
NONE = 0; LADDER = 1; SNAKE = 2; STAY = 1; MOVE = 2; WIN = 3
class Cell
Line 1,540 ⟶ 2,678:
@playersCount = 4; @board; @players; @die
play
</syntaxhighlight>
</lang>
{{out}}<pre>
...
Line 1,562 ⟶ 2,700:
You reached position 100 and win the game!!!!
</pre>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<syntaxhighlight lang="vbnet">Module Module1
 
ReadOnly SNL As New Dictionary(Of Integer, Integer) From {
{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}
}
ReadOnly rand As New Random
Const sixesThrowAgain = True
 
Function Turn(player As Integer, square As Integer) As Integer
Do
Dim roll = rand.Next(1, 6)
Console.Write("Player {0}, on square {1}, rolls a {2}", player, square, roll)
If square + roll > 100 Then
Console.WriteLine(" but cannot move.")
Else
square += roll
Console.WriteLine(" and moves to square {0}", square)
If square = 100 Then
Return 100
End If
 
Dim nxt = square
If SNL.ContainsKey(square) Then
nxt = SNL(nxt)
End If
If square < nxt Then
Console.WriteLine("Yay! Landed on a ladder. Climb up to {0}.", nxt)
If nxt = 100 Then
Return 100
End If
square = nxt
ElseIf square > nxt Then
Console.WriteLine("Oops! Landed on a snake. Slither down to {0}.", nxt)
square = nxt
End If
End If
 
If roll < 6 OrElse Not sixesThrowAgain Then
Return square
End If
Console.WriteLine("Rolled a 6 so roll again.")
Loop
End Function
 
Sub Main()
Dim players = {1, 1, 1}
Do
For i = 1 To players.Length
Dim ns = Turn(i, players(i - 1))
If ns = 100 Then
Console.WriteLine("Player {0} wins!", i)
Return
End If
players(i - 1) = ns
Console.WriteLine()
Next
Loop
End Sub
 
End Module</syntaxhighlight>
 
=={{header|V (Vlang)}}==
{{trans|Kotlin}}
<syntaxhighlight lang="v (vlang)">
import rand
 
const
(
snl = {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}
)
 
fn main() {
// three players starting on square one
mut players := [1,1,1]
mut ns := 0
for {
for i, s in players {
ns = turn(i + 1, s)
if ns == 100 {
println("Player ${i+1} wins!")
exit(0)
}
players[i] = ns
println('')
}
}
}
 
fn turn(player int, square int) int {
mut square2 := square
mut roll, mut next := 0, 0
for {
roll = rand.int_in_range(1, 7) or {println('Error: invalid number') exit(1)}
print("Player $player, on square $square2, rolls a $roll")
if square2 + roll > 100 {println(" but cannot move.")}
else {
square2 += roll
println(" and moves to square ${square2}.")
if square2 == 100 {return 100}
next = snl[square2]
if next!= 0 {next = snl[square2]}
else {next = square2}
if square2 < next {
println("Yay! Landed on a ladder. Climb up to ${next}.")
if next == 100 {return 100}
square2 = next
}
if square2 > next {
println("Oops! Landed on a snake. Slither down to ${next}.")
square2 = next
}
}
if roll < 6 {return square2}
println("Rolled a 6 so roll again. \n")
}
return next
}
</syntaxhighlight>
 
{{out}}
<pre>
Player 1, on square 1, rolls a 6 and moves to square 7.
Rolled a 6 so roll again.
 
Player 1, on square 7, rolls a 2 and moves to square 9.
Yay! Landed on a ladder. Climb up to 31.
 
Player 2, on square 1, rolls a 1 and moves to square 2.
 
Player 3, on square 1, rolls a 5 and moves to square 6.
 
Player 1, on square 31, rolls a 2 and moves to square 33.
 
Player 2, on square 2, rolls a 1 and moves to square 3.
 
Player 3, on square 6, rolls a 5 and moves to square 11.
 
Player 1, on square 33, rolls a 3 and moves to square 36.
 
Player 2, on square 3, rolls a 1 and moves to square 4.
Yay! Landed on a ladder. Climb up to 14.
 
...
 
Player 2, on square 84, rolls a 6 and moves to square 90.
Rolled a 6 so roll again.
 
Player 2, on square 90, rolls a 1 and moves to square 91.
 
Player 3, on square 98, rolls a 6 but cannot move.
Rolled a 6 so roll again.
 
Player 3, on square 98, rolls a 4 but cannot move.
 
Player 1, on square 94, rolls a 2 and moves to square 96.
 
Player 2, on square 91, rolls a 3 and moves to square 94.
 
Player 3, on square 98, rolls a 5 but cannot move.
 
Player 1, on square 96, rolls a 4 and moves to square 100.
Player 1 wins!
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
<syntaxhighlight lang="wren">import "random" for Random
 
var rand = Random.new()
 
var snl = {
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
}
 
var sixThrowsAgain = true
 
var turn = Fn.new { |player, square|
while (true) {
var roll = 1 + rand.int(6)
System.write("Player %(player), on square %(square), rolls a %(roll)")
if (square + roll > 100) {
System.print(" but cannot move.")
} else {
square = square + roll
System.print(" and moves to square %(square).")
if (square == 100) return 100
var next = snl[square]
if (!next) next = square
if (square < next) {
System.print("Yay! Landed on a ladder. Climb up to %(next).")
if (next == 100) return 100
square = next
} else if (square > next) {
System.print("Oops! Landed on a snake. Slither down to %(next).")
square = next
}
}
if (roll < 6 || !sixThrowsAgain) return square
System.print("Rolled a 6 so roll again.")
}
}
 
// three players starting on square one
var players = [1, 1, 1]
while (true) {
var i = 0
for (s in players) {
var ns = turn.call(i + 1, s)
if (ns == 100) {
System.print("Player %(i+1) wins!")
return
}
players[i] = ns
System.print()
i = i + 1
}
}</syntaxhighlight>
 
{{out}}
Sample game (abridged):
<pre>
Player 1, on square 1, rolls a 6 and moves to square 7.
Rolled a 6 so roll again.
Player 1, on square 7, rolls a 6 and moves to square 13.
Rolled a 6 so roll again.
Player 1, on square 13, rolls a 5 and moves to square 18.
 
Player 2, on square 1, rolls a 2 and moves to square 3.
 
Player 3, on square 1, rolls a 5 and moves to square 6.
 
Player 1, on square 18, rolls a 6 and moves to square 24.
Rolled a 6 so roll again.
Player 1, on square 24, rolls a 4 and moves to square 28.
Yay! Landed on a ladder. Climb up to 84.
 
Player 2, on square 3, rolls a 4 and moves to square 7.
 
Player 3, on square 6, rolls a 2 and moves to square 8.
 
Player 1, on square 84, rolls a 6 and moves to square 90.
Rolled a 6 so roll again.
Player 1, on square 90, rolls a 5 and moves to square 95.
Oops! Landed on a snake. Slither down to 75.
 
....
 
Player 2, on square 53, rolls a 3 and moves to square 56.
 
Player 3, on square 92, rolls a 4 and moves to square 96.
 
Player 1, on square 39, rolls a 1 and moves to square 40.
Yay! Landed on a ladder. Climb up to 59.
 
Player 2, on square 56, rolls a 3 and moves to square 59.
 
Player 3, on square 96, rolls a 4 and moves to square 100.
Player 3 wins!
</pre>
 
=={{header|XPL0}}==
{{trans|Wren}}
<syntaxhighlight lang "XPL0">include xpllib; \for Print
 
def SixThrowsAgain = true;
 
func NextSquare(Square);
int Square;
[case Square of
4: return 14;
9: return 31;
17: return 7;
20: return 38;
28: return 84;
40: return 59;
51: return 67;
54: return 34;
62: return 19;
63: return 81;
64: return 60;
71: return 91;
87: return 24;
93: return 73;
95: return 75;
99: return 78
other return Square;
];
 
func Turn(Player, Square);
int Player, Square;
int Roll, Next;
[loop [Roll:= Ran(6)+1;
Print("Player %d, on square %d, rolls a %d", Player, Square, Roll);
if Square + Roll > 100 then
Print(" but cannot move.\n")
else [Square:= Square + Roll;
Print(" and moves to square %d.\n", Square);
if Square = 100 then return 100;
Next:= NextSquare(Square);
if Square < Next then
[Print("Yay! Landed on a ladder. Climb up to %d.\n", Next);
if Next = 100 then return 100;
Square:= Next;
]
else if Square > Next then
[Print("Oops! Landed on a snake. Slither down to %d.\n", Next);
Square:= Next;
];
];
if Roll < 6 or not SixThrowsAgain then return Square;
Print("Rolled a 6 so roll again.\n");
];
];
 
int Players, I, NS;
[Players:= [1, 1, 1]; \three Players starting on square one
loop [for I:= 0 to 3-1 do
[NS:= Turn(I+1, Players(I));
if NS = 100 then
[Print("Player %d wins!\n", I+1);
return;
];
Players(I):= NS;
CrLf(0);
];
];
]</syntaxhighlight>
{{out}}
<pre>
Player 1, on square 1, rolls a 5 and moves to square 6.
 
Player 2, on square 1, rolls a 1 and moves to square 2.
 
Player 3, on square 1, rolls a 5 and moves to square 6.
 
Player 1, on square 6, rolls a 5 and moves to square 11.
 
Player 2, on square 2, rolls a 4 and moves to square 6.
 
Player 3, on square 6, rolls a 4 and moves to square 10.
 
Player 1, on square 11, rolls a 3 and moves to square 14.
 
Player 2, on square 6, rolls a 2 and moves to square 8.
 
Player 3, on square 10, rolls a 4 and moves to square 14.
 
Player 1, on square 14, rolls a 3 and moves to square 17.
Oops! Landed on a snake. Slither down to 7.
 
Player 2, on square 8, rolls a 6 and moves to square 14.
Rolled a 6 so roll again.
Player 2, on square 14, rolls a 2 and moves to square 16.
 
. . .
 
Player 3, on square 88, rolls a 6 and moves to square 94.
Rolled a 6 so roll again.
Player 3, on square 94, rolls a 3 and moves to square 97.
 
Player 1, on square 80, rolls a 1 and moves to square 81.
 
Player 2, on square 85, rolls a 6 and moves to square 91.
Rolled a 6 so roll again.
Player 2, on square 91, rolls a 6 and moves to square 97.
Rolled a 6 so roll again.
Player 2, on square 97, rolls a 3 and moves to square 100.
Player 2 wins!
</pre>
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">// Rosetta Code problem: http://rosettacode.org/wiki/Snake_and_Ladder
// by Galileo, 04/2022
 
data 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
 
dim table(100), player(2)
 
for n = 1 to 16 : read o, d : table(o) = d : next
player(1) = 1 : player(2) = 1
turn = 1
 
do
steps = int(ran(6)) + 1
nextPos = player(turn) + steps
print "Player ", turn, " on square ", player(turn), " rolls a ", steps;
if not (nextPos > 100) then
print " and moves to square ", nextPos, "."
player(turn) = nextPos
if nextPos = 100 print "Player ", turn, " wins!" : break
if table(nextPos) then
player(turn) = table(nextPos)
if table(nextPos) > nextPos then
print "Yay! Landed on a ladder. Climb up to ";
else
print "Oops! Landed on a snake. Slither down to ";
end if
print player(turn), "."
end if
else
print " but cannot move."
end if
if steps = 6 then
print "Rolled a 6, so roll again."
else
turn = turn + 1 : if turn > 2 turn = 1
end if
print
loop</syntaxhighlight>
{{out}}
<pre>Player 1 on square 1 rolls a 4 and moves to square 5.
 
Player 2 on square 1 rolls a 3 and moves to square 4.
Yay! Landed on a ladder. Climb up to 14.
 
Player 1 on square 5 rolls a 4 and moves to square 9.
Yay! Landed on a ladder. Climb up to 31.
 
Player 2 on square 14 rolls a 2 and moves to square 16.
 
Player 1 on square 31 rolls a 6 and moves to square 37.
Rolled a 6, so roll again.
 
Player 1 on square 37 rolls a 3 and moves to square 40.
Yay! Landed on a ladder. Climb up to 59.
 
Player 2 on square 16 rolls a 5 and moves to square 21.
 
Player 1 on square 59 rolls a 1 and moves to square 60.
 
Player 2 on square 21 rolls a 6 and moves to square 27.
Rolled a 6, so roll again.
 
Player 2 on square 27 rolls a 1 and moves to square 28.
Yay! Landed on a ladder. Climb up to 84.
 
Player 1 on square 60 rolls a 4 and moves to square 64.
Oops! Landed on a snake. Slither down to 60.
 
Player 2 on square 84 rolls a 1 and moves to square 85.
 
Player 1 on square 60 rolls a 2 and moves to square 62.
Oops! Landed on a snake. Slither down to 19.
 
Player 2 on square 85 rolls a 4 and moves to square 89.
 
Player 1 on square 19 rolls a 1 and moves to square 20.
Yay! Landed on a ladder. Climb up to 38.
 
Player 2 on square 89 rolls a 3 and moves to square 92.
 
Player 1 on square 38 rolls a 6 and moves to square 44.
Rolled a 6, so roll again.
 
Player 1 on square 44 rolls a 5 and moves to square 49.
 
Player 2 on square 92 rolls a 4 and moves to square 96.
 
Player 1 on square 49 rolls a 2 and moves to square 51.
Yay! Landed on a ladder. Climb up to 67.
 
Player 2 on square 96 rolls a 5 but cannot move.
 
Player 1 on square 67 rolls a 6 and moves to square 73.
Rolled a 6, so roll again.
 
Player 1 on square 73 rolls a 3 and moves to square 76.
 
Player 2 on square 96 rolls a 6 but cannot move.
Rolled a 6, so roll again.
 
Player 2 on square 96 rolls a 4 and moves to square 100.
Player 2 wins!
---Program done, press RETURN---</pre>
9,476

edits