首先,我是一个菜鸟。我也是一个从来没有写过一毛钱代码的看门人。这只是我喜欢做的事情。这是有趣的:)话虽这么说,我写了这个控制台为基础的tic-tak-toe游戏,有足够的ai不会失去每场比赛。 (我想ai应该被称之为。)如果计算机的语句转向,它有70个if / else。我使用了3个int数组:
int L[2], M[2], R[2];
0 =空白;
1 = X;
2 = O;
然后董事会'看起来'像是左[0] | M [0] | R [0]左[1] | M [1] | R [1]
L [2] | M [2] | [R [2]
所以我基本上写出了我能想到的每一种可能的情况:
if(M[0]==1 & M[1]==1 & M[2]==0){M[2] = 2;}//here the computer prevents a win
else if(L[0] ==2&M[1]==2&R[2]==0){R[2]=2;}//here the computer wins
//and so on....68 more times!
我想我的问题是(是):
有没有更好的方法?是否有办法用更少的代码行来达到相同的结果?是这个吗?考虑人工智能?
答案 0 :(得分:5)
此标准算法称为Minimax。它基本上构建了一个树,其中游戏的开头是根,然后子代表X在第一个转弯时可以做出的每个可能的移动,然后每个节点的子节点都是O可以响应的移动,一旦整个树被填满(这对于Tic-Tac-Toe来说是可能的,但是对于像Chess计算机这样的游戏仍然没有足够的内存),你可以恢复工作,假设两个玩家都足够聪明,最佳移动,并达到最佳移动。以下是Minimax的another explanation,以Tic Tac Toe为例。
答案 1 :(得分:2)
Tic-Tac-Toe上的维基百科页面有一个非常好的算法大纲,用于赢取(或搭售)每个游戏: http://en.wikipedia.org/wiki/Tic-tac-toe这是我几年前制作Tic-Tac-Toe游戏的原因。
在您了解算法之后,实现Tic-Tac-Toe计算机播放器的最巧妙的方法之一是使用魔术方块。讨论了该方法here。就大小而言,我已经看到这在大约50行代码中实现,如果我找到它,我会发布代码:)
这不是技术上的人工智能,因为AI通常是指人工神经元,神经元层,梯度下降,支持向量机,求解复数多项式等。解决Tic-Tac-Toe
答案 2 :(得分:1)
是的,有更好的方法。
最明显的是要考虑电路板的不同镜像视图如何简化案例数量。
此外,考虑在数组中预先存储“有趣”模式,然后将游戏状态与数据进行比较。例如,一系列模式将是玩家在下一步行动中可以获胜的所有方式。
另请注意,使用声明int L[2]
,数组L
中只有两个条目,即L[0]
和L[1]
。您对L[2]
,M[2]
等的引用是应该由编译器捕获的错误。考虑调高警告级别。如何完成取决于编译器。对于gcc
,它是-Wall
。
这是一种人工智能。 if
一系列陈述是积累的知识:如何识别情况以及对它的适当最佳反应。
答案 3 :(得分:0)
真正的AI解决这样一个游戏的最接近的事情就是编写一个人工网络并用tictactoe游戏的所有组合训练它。
在这种情况下,代码不会做那么多,否则解决问题,但会通过采取最合理的选择解决问题,解决问题的模式。
但编码神经网络并非易事:)
答案 4 :(得分:0)
当需要编写基于规则的系统(如您正在构建的AI)时,您可以使用规则引擎,例如CLIPS(这是NASA开发的用于创建用C编写的专家系统的工具)。
http://en.wikipedia.org/wiki/CLIPS
也许这对于玩Tic Tac Toe来说太过分了,但是如果你想学习很酷的人工智能,那么专家系统是一个非常有趣的领域,但与神经网络不同(也许不那么棘手)。
玩得开心!