Tic-tac-toe: Difference between revisions

no edit summary
(Added PicoLisp)
No edit summary
Line 1:
{{task}}
Play a game of [[wp:Tic-tac-toe|tic-tac-toe]]. Ensure that legal moves are played and that a winning position is notified.
 
=={{header|D}}==
<lang d>import std.stdio;
import std.conv;
import std.string;
import std.random;
import std.algorithm;
 
struct Board {
int[9] board;
 
string positionString(int pos)
in {
assert(pos >= 0);
assert(pos < 9);
}
out(ret) {
assert(ret.length == 1);
}
body {
if(board[pos])
return board[pos] == 1 ? "X" : "O";
return to!string(pos + 1);
}
 
string toString() {
string lineSeparator = "-+-+-\n";
string row(int start) {
return format("%s|%s|%s\n",
positionString(start + 0),
positionString(start + 1),
positionString(start + 2));
}
 
string ret;
 
ret ~= row(0);
ret ~= lineSeparator;
ret ~= row(3);
ret ~= lineSeparator;
ret ~= row(6);
 
return ret;
}
 
int[] openPositions() {
int[] ret;
foreach(i, v; board) {
if(!v)
ret ~= i;
}
 
return ret;
}
 
bool isAvailable(int position) {
if(position < 0 || position >= 9)
return false;
return board[position] == 0;
}
 
bool finished() {
return winner() != -1;
}
 
int winner() {
enum wins = [
[0,1,2], [3,4,5], [6,7,8],
[0,3,6], [1,4,7], [2,5,8],
[0,4,8], [2,4,6]
];
 
foreach(win; wins) {
int desired = board[win[0]];
if(desired == 0)
continue; // nobody wins on this one
 
// the same player needs to take all three positions
if(board[win[1]] == desired && board[win[2]] == desired)
return desired; // a winner!
}
 
if(openPositions().length == 0)
return 0; // a draw
 
return -1; // the game is still going
}
 
int suggestMove(int player)
out(ret) {
assert(ret >= 0);
assert(ret < 9);
assert(isAvailable(ret));
}
body {
return randomCover(openPositions(),
Random(unpredictableSeed)).front;
}
}
 
void main() {
writeln("\tTic-tac-toe game player.");
 
 
Board board;
int currentPlayer = 1;
 
while(!board.finished()) {
writeln(board);
 
int move;
 
if(currentPlayer == 1) {
do {
writef("Input the index of your move (from %s): ",
map!"a+1"(board.openPositions()));
readf("%d\n", &move);
 
move--; // zero based indexing
} while(!board.isAvailable(move));
} else {
move = board.suggestMove(currentPlayer);
}
 
assert(board.isAvailable(move));
 
writefln("%s chose %d", currentPlayer == 1 ? "You" : "I", move + 1);
 
board.board[move] = currentPlayer;
 
currentPlayer = currentPlayer == 2 ? 1 : 2;
}
 
int winner = board.winner();
if(winner == 0)
writeln("\nDraw");
if(winner == 1)
writeln("\nYou win!");
if(winner == 2)
writeln("\nComputer wins.");
}
}</lang>
 
=={{header|PicoLisp}}==
Anonymous user