如何在没有一堆if语句的情况下检查多种情况?

时间:2012-02-05 22:29:52

标签: c++ algorithm math if-statement

假设你想检查一下是否有人赢得了一个tic tac toe游戏。如果不使用if语句重复检查连续3行的每列,行和对角线,你会怎么做呢?

我确信必须有一种方法,一些算法或技术看起来不像20行的ifs(或开关)那样丑陋,以检查9的数组是否为winnar。

3 个答案:

答案 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)

你是对的,有这样的技巧。

每个获胜模式从上边缘或左边缘开始,并持续三个步骤。在每个步骤中,都会发生以下情况之一:

  1. 行号增加,列保持不变
  2. 列号增加,行保持不变
  3. 行号和列号都递增(第一个对角线)
  4. 行号增加,列号减少(另一个对角线)
  5. 所以现在你可以写一个这样的函数:

    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);