我是一名初级程序员,我了解pascal和c ++的基础知识。我用Player-Computer制作了一个Tic Tac Toe游戏,游戏全部完成。
计算机会生成一个随机的位置,其中Os会出现在桌面上,但这并不好。
我认为我应该检查每个获胜位置的多个程序,否则计算机应该试图阻止玩家的X或获胜位置,但这会因为所有的if而浪费了很多时间。
然后我想到了一个带有某种ifs的简单版本,但它仍然需要花费很多时间才能完成。
然后我更深入地思考:四人游戏怎么样?在地球上有人会设法检查每个可用的空间以及如何有可能创造一个功能来检查玩家/计算机位置的任何获胜或进展,哦等等,这不是全部,如果玩家正在做一些技巧,所以他阻止了电脑?电脑怎么会知道的?!?当然,这需要很长时间来编程。而且我不是在谈论似乎更不可能的事情:国际象棋。
所以我在这里,问自己,应该是一种更简单的方式,计算机应该搜索和解决一些问题,而不是大量的ifs。
在这种情况下,如果你们中的任何一个人知道解决这个问题的方法,我怎么能设法在TicTacToe游戏中制作最简单的程序来阻止和击败玩家?
如果有人想检查我的代码或使用它:http://pastebin.com/jhyUn7d1
答案 0 :(得分:3)
您要找的是Minimax。
使用此算法,计算机将赢得每个Tic Tac Toe游戏,或者您可以调整计算机分析移动的深度,以达到某种中等难度。
实现起来并不难,你应该熟悉递归并且你已经设置了,当然实现方式因你的代码而异,但维基百科页面提供了一个很好的起点。
答案 1 :(得分:1)
Tic tac toe算法类似于:
答案 2 :(得分:0)
我最近处理过这个,虽然我的代码是在C#中。
我想出了一种对每个候选人的举动进行评分的方法。我采用的方法根据获胜所需的移动次数创建得分(所需的移动次数越少,得分越高)。
我的算法还考虑了多个方块的组合移动次数。因此,该算法有利于产生多个潜在胜利的动作(我对Tic Tac Toe所知道的唯一真正的策略)。例如,有时可能会产生一个必须阻止两个潜在胜利的移动。由于对手只能阻挡一个,因此会产生胜利。
我在文章A Tic-Tac-Toe Game Engine中发布了我的整个代码及其说明。
答案 3 :(得分:0)
简短的回答是“尝试所有不同的动作,直到比赛获胜,并记录哪些动作导致计算机获胜”。
长答案
对于有限大小的TTT游戏,赢得游戏之前可能移动的次数并不多,所以只需尝试每次可能的移动,然后递归尝试所有可能的对手移动,并继续前进直到游戏结束。给每一个动作一个“分数”表示它的进展情况(例如,你获得了多少个不同的解决方案,这些解决方案在计算机上取得了成功,有多少解决方案成功对手,并选择一个具有“最佳”结果的解决方案)。请注意,如果你做得好,你可能会得到一些几乎不可能取胜的东西。
答案 4 :(得分:0)
无论如何,我创建了一个函数,返回类型为int,这是计算机应放置其片段的正方形(假设0是左上角,8是右下角正方形)。你的使用2D数组,所以会有所不同。
无论如何,对于每一行,每列和对角线,检查该行上的任何两个片段是否属于播放器。如果没有,请检查是否属于计算机。在第一行,这是真的,检查剩下的部分 - 如果它可用,把它放在那里赢得胜利。如果你有一个以玩家为主的行,请检查你是否已经有一块并将其粘贴到阻止中。
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]
}
}
然后,为行做同样的事。
你总是可以认为Tic-Tac-Toe基本上只是一个魔术广场,在这里描述得相当好:http://www.sciforums.com/showthread.php?134281-An-isomorphism-Tic-Tac-Toe-on-Magic-Square
答案 5 :(得分:0)
Tic-Tac-Toe available on wikipedia有一个完美的策略。这很简单。由于网格尺寸较小,您需要测试的案例数量(例如测试连续两个块)是非常小的。