Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查谁赢得了Tic Tac Toe更有效的C++;_C++_If Statement - Fatal编程技术网

C++ 检查谁赢得了Tic Tac Toe更有效的C++;

C++ 检查谁赢得了Tic Tac Toe更有效的C++;,c++,if-statement,C++,If Statement,我正在写一个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 (

我正在写一个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';
}
charcheckwin(const char board[][NUM_COLS],int&sum)//tic tac toe board-IN
{
char-tmp;
国际lcv;
tmp='';
如果(总和=9)
{
返回'T';
}
否则如果(总和=9)
{
如果((tmp=board[1][1])!=''&&board[0][0]==tmp&&board[2][2]==tmp)| |(board[2][0]==tmp&&board[0][2]==tmp))
{
返回tmp;
}
对于(lcv=0;lcv<3;lcv++)
{
如果((tmp=线路板[lcv][0])!=''和线路板[lcv][1]==tmp和线路板[lcv][2]==tmp)
{
返回tmp;
}
否则如果((tmp=线路板[lcv][0])!=''和线路板[lcv][1]==tmp和线路板[lcv][2]==tmp)
{
返回tmp;
}
}
}
返回'N';
}
除了一遍又一遍地做类似的事情之外,我怎么能检查谁赢了,如果X赢了,我怎么能返回X,如果O赢了,我怎么能返回O,如果是平局,我怎么能返回T,如果没有人赢了,我怎么能返回N。提前谢谢。我正在努力熟悉C++和编程,一般来说,

编辑:我只是用了简单的方法,但不知怎么搞砸了,有人知道怎么做吗?它看起来没有返回任何内容,因为当我在玩家选择一行和一列后调用它(这很好),它不会输出任何内容,这是一种简单的“结构化”方法

如果你认为董事会是:

A  B  C
D  E  F
G  H  I
那么,任何获胜布局必须接触的框的最小选择是:

A B C
D
G
您可以设想从赢线中的任何位置移动,即在X和Y方向上移动0、1或-1个位置。我们可以列出您需要检查的运动:

A: (++x) (++x, ++y) (++y)
B: (++y)
C: (++y) (--x, ++y)
D: (++x)
E: (++x)
在C++中,可以创建一个列表/向量的起始点和+//-/x/y运动增量的x/y坐标,然后使用三个嵌套循环来评估横跨每一条线。 这比仅仅硬编码x和y坐标上的两个循环以及两条对角线(见下图)要多得多,但这是一种更具算法性的方法,可能会在智力上吸引人:更像处理更大的电路板时可能需要做的事情


明显的暴力手段

作为记录,这种更简单的方法如下所示:

int x;
for (row = 0; row < 3; ++row)
    if ((x = board[row][0]) != Empty &&
        board[row][1] == x && board[row][2] == x)
        return x;
// similar loop for columns...
...
// hardcode diagonals...
if ((x = board[1][1]) != Empty &&
    (board[0][0] == x && board[2][2] == x ||
     board[2][0] == x && board[0][2] == x))
    return x
intx;
用于(行=0;行<3;++行)
如果((x=线路板[行][0])!=空&&
板[行][1]==x和板[行][2]==x)
返回x;
//列的类似循环。。。
...
//硬编码对角线。。。
如果((x=电路板[1][1])!=空&&
(单板[0][0]==x和单板[2][2]==x||
电路板[2][0]==x和电路板[0][2]==x))
返回x

您可以将数组转换为两个9位值,一个用于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
然后处理两个玩家都没有赢的情况:

if neither player won
  if empty_count == 0
    its a tie
  else
    moves still available

我想你可以给每个获胜的棋盘分配一个数字(基本上是一个散列值),然后通过生成散列值来检查当前棋盘是否与表中的任何值匹配。另一方面,我不建议花费太多时间试图使CheckWin函数超高效。除非它被调用了数百万次或者需要非常快,否则把时间花在其他事情上——它可能不会成为瓶颈。

FYI:
const char board[][3]
不会做你认为它会做的事情。我想你的意思是
const char(&board)[3][3]
?只需返回先移动的人:以及在出现平局时返回的内容???这只是我正在编写的函数的原型。它不是将二维数组作为常量发送到函数中,所以没有副作用吗?@Michael
const
用于防止被调用方重写数据,而不是传递值。我尝试了你提到的蛮力方法,因为它对我来说最有意义,但看起来我把它搞糟了。我用我的问题编辑了原始帖子
if neither player won
  if empty_count == 0
    its a tie
  else
    moves still available