Skip to content

Instantly share code, notes, and snippets.

@jesusgollonet
Last active May 3, 2024 08:41
Show Gist options
  • Save jesusgollonet/50bc83601d7b8ca999436879c72045e7 to your computer and use it in GitHub Desktop.
Save jesusgollonet/50bc83601d7b8ca999436879c72045e7 to your computer and use it in GitHub Desktop.
tic tac toe recurse center
const readline = require("readline");
const validLetters = "abc";
const validNumbers = "123";
const circle = "O";
const cross = "X";
let turn = circle;
let state = [
["", "", ""],
["", "", ""],
["", "", ""],
];
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
console.clear();
console.log(" TIC TAC TOE");
console.log(" _____________");
renderState(state);
console.log("Press a, b or c then 1, 2 or 3");
console.log("Player turn:", turn);
requestMove();
function switchTurn(turn) {
return turn === circle ? cross : circle;
}
function checkRows(state) {
let winner = "";
for (let i = 0; i < state.length; i++) {
const row = state[i];
if (row[0] === row[1] && row[1] === row[2] && row[0] !== "") {
winner = row[0];
break;
}
}
return winner;
}
function checkColumns(state) {
let winner = "";
// assumes all rows are the same length
for (let i = 0; i < state[0].length; i++) {
if (
state[0][i] === state[1][i] &&
state[1][i] === state[2][i] &&
state[0][i] !== ""
) {
winner = state[0][i];
}
}
return winner;
}
function checkDiagonals(state) {
let winner = "";
if (state[0][0] === state[1][1] && state[1][1] === state[2][2]) {
winner = state[0][0];
}
if (state[0][2] === state[1][1] && state[1][1] === state[2][0]) {
winner = state[0][2];
}
return winner;
}
function checkWinner(state) {
const winner =
checkRows(state) || checkColumns(state) || checkDiagonals(state);
return winner;
}
function requestMove() {
rl.question("What is your move? ", function (move) {
if (validateMove(move, state)) {
state = updateState(state, move, turn);
renderState(state);
if (checkWinner(state) !== "") {
console.log("Winner is:", checkWinner(state), "🎉");
console.log("Game Over");
rl.close();
} else {
turn = switchTurn(turn);
console.log("Player turn:", turn);
requestMove();
}
} else {
console.log("Invalid move");
requestMove();
}
});
}
function renderState(state) {
console.log("____| 1 | 2 | 3 | ");
for (let i = 0; i < state.length; i++) {
const s = state[i];
console.log(
"|",
validLetters[i],
"|",
s[0] || " ",
"|",
s[1] || " ",
"|",
s[2] || " ",
"|",
);
}
console.log("_________________");
}
function updateState(state, moveString, player) {
const letter = moveString[0];
const number = moveString[1];
const row = validLetters.indexOf(letter);
const column = validNumbers.indexOf(number);
state[row][column] = player;
return state;
}
function validateMove(moveString, state) {
if (moveString.length !== 2) {
return false;
}
const letter = moveString[0];
const number = moveString[1];
let valid = false;
if (validLetters.indexOf(letter) > -1 && validNumbers.indexOf(number) > -1) {
valid = true;
}
const row = validLetters.indexOf(letter);
const column = validNumbers.indexOf(number);
if (state[row][column] !== "") {
valid = false;
}
return valid;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment