Tic-tac-toe: Difference between revisions

no edit summary
No edit summary
No edit summary
Line 4:
=={{header|D}}==
<lang d>import std.stdio, std.string, std.algorithm, std.conv, std.random;
 
struct Board {
int[9] board;
 
string positionString(int pos)
in {
Line 21:
return to!string(pos + 1);
}
 
string toString() {
string lineSeparator = "-+-+-\n";
Line 30:
positionString(start + 2));
}
 
string ret;
 
ret ~= row(0);
ret ~= lineSeparator;
Line 38:
ret ~= lineSeparator;
ret ~= row(6);
 
return ret;
}
 
int[] openPositions() {
int[] ret;
Line 48:
ret ~= i;
}
 
return ret;
}
 
bool isAvailable(int position) {
if(position < 0 || position >= 9)
Line 57:
return board[position] == 0;
}
 
bool finished() {
return winner() != -1;
}
 
int winner() {
enum wins = [
Line 68:
[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) {
Line 96:
}
}
 
void main() {
writeln("\tTic-tac-toe game player.");
 
 
Board board;
int currentPlayer = 1;
 
while(!board.finished()) {
writeln(board);
 
int move;
 
if(currentPlayer == 1) {
do {
Line 114:
map!"a+1"(board.openPositions()));
readf("%d\n", &move);
 
move--; // zero based indexing
} while(!board.isAvailable(move));
Line 120:
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)
Line 137:
if(winner == 2)
writeln("\nComputer wins.");
}</lang>
}
</lang>
Output:
<pre> Tic-tac-toe game player.
Anonymous user