4

我是一名初级程序员,我了解 pascal 和 c++ 的基础知识。我用 Player-Computer 做了一个井字游戏,游戏就完成了。

计算机会随机生成一个 OS 放在桌子上的位置,这并不好。

我认为我应该检查每个获胜位置的多个程序,并且计算机应该尝试阻止玩家的 X 或做出获胜位置,但是这会浪费很多时间,因为所有的 if 的。

然后我想到了一个带有某种 if 的更简单的版本,但它仍然需要很多时间来完成。

然后我想得更深:找四游戏怎么样?在地球上,有人将如何设法检查每个可用空间,以及如何可能有人可以创建一个功能来绝对检查玩家/计算机位置的任何获胜或进展,哦,等等,这还不是全部,如果玩家正在做一些技巧,所以他阻止了电脑?电脑怎么会知道?!?当然,这需要很长时间来编程。而且我不是在谈论似乎更不可能的事情:国际象棋。

所以我在这里,问自己应该有一种比大量ifs更简单的方法让计算机搜索和解决一些问题。

在这种情况下,如果你们中的任何人都知道解决此问题的任何方法,我该如何设法制定最简单的程序来阻止和击败井字游戏中的玩家?

如果有人想检查我的代码或使用它: http: //pastebin.com/jhyUn7d1

4

6 回答 6

3

您正在寻找的是Minimax

使用此算法,计算机将赢得每场井字游戏,或者您可以调整计算机分析动作的深度以达到某种中等难度。

实现起来并不难,你应该熟悉递归并且你已经设置好了,当然实现会根据你的代码而有所不同,但是维基百科页面提供了一个很好的起点。

于 2013-05-10T19:03:26.890 回答
1

井字游戏算法类似于:

  1. 如果要赢,就占位
  2. 如果要输了,就当场
  3. 转角
  4. 取非角非中心
  5. 以中心为中心
于 2013-05-10T18:54:03.533 回答
0

我做过一次,很久以前。我不知道我是否还有代码...

无论如何,我创建了一个函数,返回类型为 int,它是计算机应该放置它的方块(假设 0 是左上角,8 是右下角)。你的使用二维数组,所以会有点不同。

无论如何,对于每一行、每一列和对角线,检查该行上的任何两块是否属于玩家。如果没有,请检查相同但属于计算机的内容。在第一行,这是正确的,检查剩余的一块 - 如果它可用,把它放在那里获胜。如果您有一个玩家主导的行,请检查您那里没有一块并将其插入以阻止。

const int PlayerPiece = 1;
const int CPiece = 2;
const int Empty = 0; 

int board[3][3];
if(board[0][0] == PlayerPiece && board[0][1] == PlayerPiece && board [0][2] == Empty)
{
    //Put_Your_Piece_In_[0][2]
}

然后您可以继续更改它,以便它可以检查每一行,即

int numRows = 3;

for(int i = 0; i < numRows; i++)
{
if(board[i][0] == PlayerPiece && board[i][1] == PlayerPiece && board[i][2] == Empty)
    {
    //Put_Piece_In_[i][2]
    }
}

然后,对行执行相同的操作。

你总是可以认为井字游戏本质上只是一个魔方,在这里描述得很好:http ://www.sciforums.com/showthread.php?134281-An-isomorphism-Tic-Tac-Toe-on-魔方

于 2013-05-10T19:14:42.260 回答
0

我最近处理了这个问题,尽管我的代码是用 C# 编写的。

我想出了一种对每个候选动作进行评分的方法。我采用的方法根据获胜所需的移动次数创建分数(所需移动越少,得分越高)。

我的算法还考虑了多个方格的组合移动次数。结果,该算法偏向于会产生多个潜在胜利的动作(我所知道的井字游戏中唯一真正的策略)。例如,有时可能采取的行动会产生两个必须被阻止的潜在胜利。由于对手只能阻止一个,因此它会产生胜利。

我在文章A Tic-Tac-Toe Game Engine中发布了我的整个代码和对它的描述。

于 2013-05-10T18:55:53.437 回答
0

简短的回答是“尝试所有不同的动作直到游戏获胜,并记录哪些动作会导致计算机获胜”。

长答案Ö

对于有限规模的 TTT 游戏,在赢得比赛之前可能的移动次数并不多,因此只需尝试每个可能的移动,然后递归地尝试所有可能的对手移动,并一直持续到游戏结束。为每一步的进展情况打分(例如,你有多少不同的解法对计算机来说是成功的,有多少对对手来说是成功的,然后选择具有“最佳”结果的解法)。请注意,如果您做得好,您最终可能会遇到几乎不可能战胜的事情。

于 2013-05-10T18:56:30.597 回答
0

维基百科上有一个完美的井字游戏策略。这真的很简单。由于网格的尺寸很小,您需要测试的案例数量(例如测试是否有 2 个连续的块)非常少。

于 2013-08-23T08:33:14.453 回答