Snake and ladder: Difference between revisions

Line 15:
Happy coding.
<br><br>
 
=={{header|C++}}==
{{trans|C#}}
<lang cpp>#include <iostream>
#include <map>
#include <random>
 
std::default_random_engine generator;
std::uniform_int_distribution<int> dice(1, 6);
int rollDice() {
return dice(generator);
}
 
const bool sixesThrowAgain = true;
const std::map<int, int> 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},
};
 
// taken from https://stackoverflow.com/a/2333816
template <template<class, class, class...> class C, typename K, typename V, typename... Args>
V GetWithDef(const C<K, V, Args...>& m, K const& key, const V & defval) {
typename C<K, V, Args...>::const_iterator it = m.find(key);
if (it == m.end())
return defval;
return it->second;
}
 
int turn(int player, int square) {
while (true) {
int roll = rollDice();
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;
int next = GetWithDef(snl, square, square);
if (square < next) {
printf("Yay! Landed on a ladder. Climb up to %d.\n", next);
square = next;
} else if (next < square) {
printf("Oops! landed on a snake. Slither down to %d.\n", next);
square = next;
}
}
if (roll < 6 || !sixesThrowAgain)return square;
printf("Rolled a 6 so roll again.\n");
}
}
 
int main() {
// three players starting on square one
int players[] = { 1, 1, 1 };
 
while (true) {
for (int i = 0; i < sizeof(players) / sizeof(int); ++i) {
int ns = turn(i + 1, players[i]);
if (ns == 100) {
printf("Player %d wins!\n", i + 1);
goto out;
}
players[i] = ns;
printf("\n");
}
}
 
out:
return 0;
}</lang>
 
=={{header|C#|C sharp}}==
1,452

edits