Last active
May 3, 2024 08:41
-
-
Save jesusgollonet/50bc83601d7b8ca999436879c72045e7 to your computer and use it in GitHub Desktop.
tic tac toe recurse center
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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