我正在写一个Tic Tac Toe游戏,我想知道如何能够有效地检查谁赢了.包含X,O或空格的二维数组代表电路板.
char CheckWin(const char board[][NUM_COLS], int& sum) // tic tac toe board - IN
{
char tmp;
int lcv;
tmp = ' ';
if (sum == 9)
{
return 'T';
}
else if (sum != 9)
{
if (((tmp = board[1][1]) != ' ' && board[0][0] == tmp && board[2][2] == tmp) || (board[2][0] == tmp && board[0][2] == tmp))
{
return tmp;
}
for (lcv = 0; lcv < 3; lcv++)
{
if ((tmp = board[lcv][0]) != ' ' && board[lcv][1] == tmp && board[lcv][2] == tmp)
{
return tmp;
}
else if ((tmp = board[lcv][0]) != ' ' && board[lcv][1] == tmp && board[lcv][2] == tmp)
{
return tmp;
}
}
}
return 'N';
}
Run Code Online (Sandbox Code Playgroud)
除了一遍又一遍地做类似的事情之外,我怎么能检查谁赢了并且如果X赢了则返回X,如果O有一个则是O,如果是平局则是T,如果还没有人则是N. 提前致谢.我正在努力熟悉C++和编程.
编辑:我刚刚用简单的方法,但我不知怎的搞砸了,有人知道怎么办?看起来它没有返回任何东西,因为当我在玩家选择一行和一列(这工作正常)之后在主要中调用它时,它不输出任何东西
Ski*_*izz 13
您可以将数组转换为两个九位值,一个用于O位置,一个用于X位置,以及空白计数:
x_mask = 0
y_mask = 0
empty_count = 0
mask = 1
for each square
if x then x_mask |= mask
if y then y_mask |= mask
if empty then empty_count++
mask <<= 1
Run Code Online (Sandbox Code Playgroud)
然后将x_mask和y_mask与八种可能的获胜组合进行比较:
for each player
for each winning combination
if player_mask & winning_mask == winning_mask then player has won
Run Code Online (Sandbox Code Playgroud)
然后处理玩家赢得的案件:
if neither player won
if empty_count == 0
its a tie
else
moves still available
Run Code Online (Sandbox Code Playgroud)