if (turn === 1) {
if(X1 === true && X2 === true && X3 === false && O3 === false && turn === 1) {
document.getElementById("3").innerHTML = 'O';
O3 = true
turn--
}
if(X1 === true && X3 === true && X2 === false && O2 === false && turn === 1) {
document.getElementById("2").innerHTML = 'O';
O2 = true
turn--
}
if(X2 === true && X3 === true && X1 === false && O1 === false && turn === 1) {
document.getElementById("1").innerHTML = 'O';
O1 = true
turn--
}
if(X3 === true && X4 === true && X5 === false && O5 === false && turn === 1) {
document.getElementById("5").innerHTML = 'O';
O5 = true
turn--
}
if(X3 === true && X5 === true && X7 === false && O7 === false && turn === 1) {
document.getElementById("7").innerHTML = 'O';
O7 = true
turn--
}
if(X4 === true && X5 === true && X6 === false && O6 === false && turn === 1) {
document.getElementById("6").innerHTML = 'O';
O6 = true
turn--
}
if(X7 === true && X8 === true && X9 === false && O9 === false && turn === 1) {
document.getElementById("9").innerHTML = 'O';
O9 = true
turn--
}
if(X7 === true && X9 === true && X8 === false && O8 === false && turn === 1) {
document.getElementById("8").innerHTML = 'O';
O8 = true
turn--
}
if(X8 === true && X9 === true && X7 === false && O7 === false && turn === 1) {
document.getElementById("7").innerHTML = 'O';
O7 = true
turn--
}
if(X1 === true && X4 === true && X7 === false && O7 === false && turn === 1) {
document.getElementById("7").innerHTML = 'O';
O7 = true
turn--
}
if(X1 === true && X7 === true && X4 === false && O4 === false && turn === 1) {
document.getElementById("4").innerHTML = 'O';
O4 = true
turn--
}
if(X7 === true && X4 === true && X1 === false && O1 === false && turn === 1) {
document.getElementById("1").innerHTML = 'O';
O1 = true
turn--
}
if(X2 === true && X5 === true && X8 === false && O8 === false && turn === 1) {
document.getElementById("8").innerHTML = 'O';
O8 = true
turn--
}
if(X2 === true && X8 === true && X5 === false && O5 === false && turn === 1) {
document.getElementById("5").innerHTML = 'O';
O5 = true
turn--
}
if(X5 === true && X8 === true && X2 === false && O2 === false && turn === 1) {
document.getElementById("2").innerHTML = 'O';
O2 = true
turn--
}
if(X3 === true && X6 === true && X9 === false && O9 === false && turn === 1) {
document.getElementById("9").innerHTML = 'O';
O9 = true
turn--
}
if(X3 === true && X9 === true && X6 === false && O6 === false && turn === 1) {
document.getElementById("6").innerHTML = 'O';
O6 = true
turn--
}
if(X9 === true && X6 === true && X3 === false && O3 === false && turn === 1) {
document.getElementById("3").innerHTML = 'O';
O3 = true
turn--
}
if(X5 === true && X7 === true && X3 === false && O3 === false && turn === 1) {
document.getElementById("3").innerHTML = 'O';
O3 = true
turn--
}
if(X5 === true && X3 === true && X7 === false && O7 === false && turn === 1) {
document.getElementById("7").innerHTML = 'O';
O7 = true
turn--
}
if(X7 === true && X3 === true && X5 === false && O5 === false && turn === 1) {
document.getElementById("5").innerHTML = 'O';
O5 = true
turn--
}
if(X1 === true || X2 === true || X3 === true || X4 === true || X5 === true || X6 === true || X7 === true || X8 === true || X9 === true && turn === 1) {
if(O5 === false && X5 === false && turn === 1){
document.getElementById("5").innerHTML = 'O';
O5 = true
turn--} else {
if(X1 === false && O1 === false && turn === 1){
document.getElementById("1").innerHTML = 'O';
O1 = true
turn--
}
if(X2 === false && O2 === false && turn === 1){
document.getElementById("2").innerHTML = 'O';
O2 = true
turn--
}
if(X3 === false && O3 === false && turn === 1){
document.getElementById("3").innerHTML = 'O';
O3 = true
turn--
}
if(X4 === false && O4 === false && turn === 1){
document.getElementById("4").innerHTML = 'O';
O4 = true
turn--
}
if(X5 === false && O5 === false && turn === 1){
document.getElementById("5").innerHTML = 'O';
O5 = true
turn--
}
if(X6 === false && O6 === false && turn === 1){
document.getElementById("6").innerHTML = 'O';
O6 = true
turn--
}
if(X7 === false && O7 === false && turn === 1){
document.getElementById("7").innerHTML = 'O';
O7 = true
turn--
}
if(X8 === false && O8 === false && turn === 1){
document.getElementById("8").innerHTML = 'O';
O8 = true
turn--
}
if(X9 === false && O9 === false && turn === 1){
document.getElementById("9").innerHTML = 'O';
O9 = true
turn--
}
}
}
}
I have insanely long lines of code for Tic-Tac-Toe to check if the player is about to win and I can’t figure out if there is anyway to shorten it. I know I can use loops and arrays to shorten it but I can’t figure out how to apply them. This is just a small portion of my code so some of the variable might me confusing. Just be glad I didn’t paste the whole thing on. You would be having nightmares about if statements.
I learned how to use arrays and loops when I started but the websiteI used (codecademy) didn’t show me how to apply it to anything but printing out certain words in an array.
>Solution :
You can significantly simplify and shorten your code by using arrays and loops. But avoid using eval (considering security).
const winningCombinations = [
[1, 2, 3], [4, 5, 6], [7, 8, 9], // Rows
[1, 4, 7], [2, 5, 8], [3, 6, 9], // Columns
[1, 5, 9], [3, 5, 7] // Diagonals
];
for (const combination of winningCombinations) {
const [a, b, c] = combination;
const isPlayerWinning = eval(`X${a} && X${b} && !O${c}`);
if (isPlayerWinning && turn === 1) {
document.getElementById(`${c}`).innerHTML = 'O';
eval(`O${c} = true`);
turn--;
break;
}
}
// If no winning move is found, make a defensive move
for (let i = 1; i <= 9; i++) {
if (!eval(`X${i}`) && !eval(`O${i}`) && turn === 1) {
document.getElementById(`${i}`).innerHTML = 'O';
eval(`O${i} = true`);
turn--;
break;
}
}
If you don’t want to use eval, then try this
const playerMoves = ['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9'];
const opponentMoves = ['O1', 'O2', 'O3', 'O4', 'O5', 'O6', 'O7', 'O8', 'O9'];
function checkWinningMove(player, opponent) {
for (const combination of winningCombinations) {
const [a, b, c] = combination;
const isPlayerWinning = player.includes(`X${a}`) && player.includes(`X${b}`) && !opponent.includes(`O${c}`);
if (isPlayerWinning && turn === 1) {
document.getElementById(`${c}`).innerHTML = 'O';
opponent.push(`O${c}`);
turn--;
return true;
}
}
return false;
}
function makeMove(moves, symbol) {
for (let i = 1; i <= 9; i++) {
const moveId = `${i}`;
if (!moves.includes(`X${i}`) && !moves.includes(`O${i}`) && turn === 1) {
document.getElementById(moveId).innerHTML = symbol;
moves.push(`${symbol}${i}`);
turn--;
break;
}
}
}
const isWinningMove = checkWinningMove(playerMoves, opponentMoves);
if (!isWinningMove) {
makeMove(opponentMoves, 'O');
}