794. 有效的井字游戏 找出判断条件

解题思路
棋盘可能达到的状态是:
- 玩家一下的 'X'个数 等于玩家二下的 ''O' 的个数或 'O'的个数加一
- 只能有一个玩家赢
- 当玩家一赢的时候,棋局上 'X'的个数等于'O'的个数加一
- 当玩家二赢的时候,棋局上'O'的个数等于'X'的个数
关键步骤:
- 求出棋盘上'X'和'O'的个数
- 判断是否符合条件一
- 若符合条件一继续执行,不符合则直接
return false
- 接下来判断是否有玩家获胜
- 当两个玩家都获胜则不符合条件
- 当只有玩家一获胜,判断棋局上 'X'的个数是否等于'O'的个数加一
- 当只有玩家二获胜,判断棋局上'O'的个数是否等于'X'的个数
玩家获胜的情况
- 水平的三个字符都一样:
board[i][0] === board[i][1] && board[i][1] === board[i][2]
- 垂直的三个字符都一样:
board[0][i] === board[1][i] && board[1][i] === board[2][i]
- 正对角线的三个字符一样:
board[0][0] === board[1][1] && board[1][1]=== board[2][2]
- 反对角线的三个字符都一样:
board[0][2] === board[1][1] && board[1][1]=== board[2][0]
代码
/**
* @param {string[]} board
* @return {boolean}
*/
var validTicTacToe = function(board) {
let XNumber = 0;//X的个数
let ONumber = 0;//O的个数
let player1Win = false;
let player2Win = false;
// 统计X和O的个数
for(let i = 0;i<board.length;i++){
for(let j = 0;j<board[i].length;j++){
if(board[i].charAt(j) === 'X'){
XNumber++;
}else if(board[i].charAt(j) === 'O'){
ONumber++;
}
}
}
if(XNumber === ONumber+1 || XNumber === ONumber){
// 判读是否有玩家获胜
//判断一行
for(let i = 0;i<board.length;i++){
if(board[i][0] === board[i][1] && board[i][1] === board[i][2]){
if(board[i][0] === 'X'){
player1Win = true;
}else if(board[i][0] === 'O'){
player2Win = true;
}
}
}
// 判断一列
for(let i = 0;i<board.length;i++){
if(board[0][i] === board[1][i] && board[1][i] === board[2][i]){
if(board[0][i] === 'X'){
player1Win = true;
}else if(board[0][i] === 'O'){
player2Win = true;
}
}
}
// 判断对角线
if(board[0][0] === board[1][1] && board[1][1]=== board[2][2]){
if(board[0][0] === 'X'){
player1Win = true;
}else if(board[0][0] === 'O'){
player2Win = true;
}
}
if(board[0][2] === board[1][1] && board[1][1]=== board[2][0]){
if(board[0][2] === 'X'){
player1Win = true;
}else if(board[0][2] === 'O'){
player2Win = true;
}
}
// 玩家一玩家二都赢
if(player1Win && player2Win){
return false;
}
// 玩家一赢,玩家二不赢
if(player1Win && !player2Win){
if(XNumber === ONumber + 1){
return true;
}else{
return false;
}
}
// 玩家二赢,玩家一不赢
if(!player1Win && player2Win){
if(XNumber === ONumber){
return true;
}else{
return false;
}
}
// 都不赢
if(!player1Win && !player2Win){
return true;
}
}
return false;
};
