假设你想检查一下是否有人赢得了一个tic tac toe游戏。如果不使用if语句重复检查连续3行的每列,行和对角线,你会怎么做呢?
我确信必须有一种方法,一些算法或技术看起来不像20行的ifs(或开关)那样丑陋,以检查9的数组是否为winnar。
答案 0 :(得分:3)
我可能会为代表轮到他们的每个玩家寻找9位的int。您可以轻松应用位操作来直接检查整个列,行或对角线。
答案 1 :(得分:2)
只有八个获胜位置可能。转换为九位数组和AND以测试win I.e。
可能的胜利模式:
1.11亿 000111000 000000111 100100100 010010010 001001001 100010001 001010100
板:
OXO 。 X 。 XO
测试X导致:
010010010
其中ANDed与第5行== true
答案 2 :(得分:1)
你是对的,有这样的技巧。
每个获胜模式从上边缘或左边缘开始,并持续三个步骤。在每个步骤中,都会发生以下情况之一:
所以现在你可以写一个这样的函数:
bool CheckWin(char[3][3] board, char playerCh, int r, int c, int dr, int dc) {
for (int i = 0 ; i != 3 ; i++) {
if (board[r+i*dr][c+i*dc] != playerCh) {
return false;
}
}
return true;
}
使用此功能,您可以检查一个玩家是否从(r,c)开始连续三行,步骤dr行和dc列:
bool won = false;
for (int i = 0 ; !won && i != 3 ; i++) {
won |= CheckWin(board, 'X', i, 0, 0, 1)
|| CheckWin(board, 'X', 0, i, 1, 0);
}
won |= CheckWin(board, 'X', 0, 0, 1, 1);
won |= CheckWin(board, 'X', 2, 0, -1, 1);