Soy un principiante y quiero hacer un juego de Tic Tac Toe. Quiero hacer una función para encontrar el ganador del juego y devolver "x" si gana x, "o" si gana o, "empate" si nadie gana y "error" si hay dos ganadores.
function winner(x){ //x is an array that includes 3 child arrays, every child represents a row of tic tac toe matrix // example x =[["x","o","x"],["o","x","o"],["o","o","x"]] // It should return "x" because "x" player is the winner }Lo intenté de muchas maneras, pero todavía no puedo hacerlo. ¿Me puedes ayudar?
Supongo que los valores también pueden ser "" aparte de "x" u "o" (en caso de que el juego termine antes de tiempo). Además, en caso de que no haya un ganador y el juego aún tenga algunos valores vacíos, creo que es mejor devolver "incompleto".
function winner(x) { console.log(`${x[0].join(' ')}\n${x[1].join(' ')}\n${x[2].join(' ')}`); winners = new Set(); // columns check for (let i = 0; i < 3; i++) { if (x[0][i] !== "" && (new Set([x[0][i], x[1][i], x[2][i]])).size === 1) { winners.add(x[0][i]); } } // rows check for (let i = 0; i < 3; i++) { if (x[i][0] !== "" && (new Set(x[i])).size === 1) { winners.add(x[i][0]); } } // diagonals check if (x[1][1] !== "" && ((new Set([x[0][0], x[1][1], x[2][2]])).size === 1 || (new Set([x[0][2], x[1][1], x[2][0]])).size === 1)) { winners.add(x[1][1]); } if (winners.size === 2) { return "error"; } if (winners.size === 0) { // completion check if (x.every(y => y.every(z => z))){ return "draw"; } return "incomplete"; } return winners.values().next().value; }Explicación
Ve muchos objetos Set creados y manipulados en el código. Establecer en Javascript es una manera fácil de asegurarse de que no haya duplicados. También se utilizan en el código para comprobar si todo lo que se le pasa es igual.
Por último, obtener el valor en el Conjunto se realiza en la última línea.