mirror of
https://github.com/captn3m0/nand2tetris.git
synced 2024-09-28 13:23:01 +00:00
127 lines
2.2 KiB
Plaintext
127 lines
2.2 KiB
Plaintext
|
class Board {
|
||
|
// Array of 0 by default
|
||
|
// X=1
|
||
|
// O=2
|
||
|
field Array gameState;
|
||
|
field int turn;
|
||
|
|
||
|
constructor Board new() {
|
||
|
var int i;
|
||
|
let i=0;
|
||
|
let turn = 0;
|
||
|
let gameState = Array.new(9);
|
||
|
while(i<9) {
|
||
|
let gameState[i] = 0;
|
||
|
let i=i+1;
|
||
|
}
|
||
|
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
method boolean isRowTaken(int row, int value) {
|
||
|
if (gameState[row*3] = value &
|
||
|
gameState[(row*3)+1] = value &
|
||
|
gameState[(row*3)+2] = value) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
method boolean isColumnTaken(int column, int value) {
|
||
|
if (gameState[column] = value &
|
||
|
gameState[column+3] = value &
|
||
|
gameState[column+6] = value) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
method boolean isWon(int value) {
|
||
|
if (isRowTaken(0,value) | isRowTaken(1, value) | isRowTaken(1, value)) {
|
||
|
return true;
|
||
|
}
|
||
|
if (isColumnTaken(0, value) | isColumnTaken(1, value) | isColumnTaken(2, value)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (isDiagonalTaken(value)) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
method boolean isDiagonalTaken(int value) {
|
||
|
// ensure center is correct first
|
||
|
if (~(gameState[4] = value )) {
|
||
|
return false;
|
||
|
}
|
||
|
// NORTH WEST TO SOUTH EAST
|
||
|
if (gameState[0] = value & gameState[8] = value) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (gameState[2] = value & gameState[6] = value) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// returns 1 if player X won
|
||
|
// returns 2 if player O won
|
||
|
// 0 otherwise
|
||
|
method int winner() {
|
||
|
|
||
|
if(isWon(1)) {
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
if(isWon(2)) {
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
method boolean play(int row, int column) {
|
||
|
var int move, remainder;
|
||
|
let move = 0;
|
||
|
|
||
|
if (~ (gameState[(row*3) + column] = 0)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
let remainder = turn - (2 * (turn/2));
|
||
|
if (remainder = 0) {
|
||
|
let move = 1;
|
||
|
} else {
|
||
|
let move = 2;
|
||
|
}
|
||
|
|
||
|
let gameState[row*3 + column] = move;
|
||
|
if (move = 1) {
|
||
|
do Draw.DrawX(row, column);
|
||
|
} else {
|
||
|
if (move = 2) {
|
||
|
do Draw.DrawO(row, column);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(isWon(1)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if(isWon(2)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (turn = 8) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
let turn = turn + 1;
|
||
|
return false;
|
||
|
}
|
||
|
}
|