xxxxxxxxxx
143
// Daniel Shiffman
// https://thecodingtrain.com/CodingChallenges/149-tic-tac-toe.html
// https://youtu.be/GTWrWM1UsnA
// https://editor.p5js.org/codingtrain/sketches/5JngATm3c
let game_over = false;
let board = [
[null, null, null],
[null, null, null],
[null, null, null],
];
let players = [{
_class: Cross,
symbol: Cross.symbol
},
{
_class: Circle,
symbol: Circle.symbol
}
];
let currentPlayer;
let available = [];
let winning_line = null;
function setup() {
createCanvas(400, 400);
frameRate(60);
currentPlayer = floor(random(players.length));
for (let j = 0; j < 3; j++) {
for (let i = 0; i < 3; i++) {
available.push([i, j]);
}
}
nextTurn();
setInterval(nextTurn, 500);
}
function equals3(a, b, c) {
return (a && b && c && // Check for null
a.symbol == b.symbol && b.symbol == c.symbol); // Check they're equal
}
function place_winning_line(a, b) {
winning_line = new WinningLine(
a.getCenter(),
b.getCenter()
);
}
function checkWinner() {
let winner = null;
// horizontal
for (let i = 0; i < 3; i++) {
if (equals3(board[i][0], board[i][1], board[i][2])) {
winner = board[i][0].symbol;
place_winning_line(board[i][0], board[i][2]);
}
}
// Vertical
for (let i = 0; i < 3; i++) {
if (equals3(board[0][i], board[1][i], board[2][i])) {
winner = board[0][i].symbol;
place_winning_line(board[0][i], board[2][i]);
}
}
// Diagonal
if (equals3(board[0][0], board[1][1], board[2][2])) {
winner = board[0][0].symbol;
place_winning_line(board[0][0], board[2][2]);
}
if (equals3(board[2][0], board[1][1], board[0][2])) {
winner = board[2][0].symbol;
place_winning_line(board[2][0], board[0][2]);
}
if (winner == null && available.length == 0) {
return 'tie';
} else {
return winner;
}
}
function nextTurn() {
if (game_over) return;
let index = floor(random(available.length));
let spot = available.splice(index, 1)[0];
let i = spot[0];
let j = spot[1];
board[i][j] = new players[currentPlayer]._class(i, j, width / 6);
currentPlayer = (currentPlayer + 1) % players.length;
}
function mousePressed() {
nextTurn();
}
function draw() {
background(255);
let w = width / 3;
let h = height / 3;
strokeWeight(4);
stroke(0);
line(w, 0, w, height);
line(w * 2, 0, w * 2, height);
line(0, h, width, h);
line(0, h * 2, width, h * 2);
for (let j = 0; j < 3; j++) {
for (let i = 0; i < 3; i++) {
let x = w * i + w / 2;
let y = h * j + h / 2;
let spot = board[i][j];
textSize(32);
if (spot) spot.draw();
}
}
if (winning_line) winning_line.draw();
if (!game_over) {
let result = checkWinner();
if (result != null) {
game_over = true;
let resultP = createP('');
resultP.style('font-size', '32pt');
if (result == 'tie') {
resultP.html("Tie!")
} else {
resultP.html(`${result} wins!`);
}
}
}
}