井字游戏的编程源代码(MFC格式)
滴答滴答
井字游戏的年代估计无法考证,西方人认为是古罗马人发明的;但是我们中国认为既然发明了围棋和五子棋,自然要发明一个井字棋。这些纯粹是口头上的纠纷,就不要管了。
记得小时候上课玩井字游戏。我只需要一张草稿纸,一支笔,两个人同桌玩。上体育课的时候,还可以在有树枝的沙坑里玩。但是我一直觉得这个游戏太简单了。后来接触了五子棋,迷了一段时间,但水平一直很差,就不玩了。
中国象棋博弈的极大极小分析法
有九个空格,由MAX和MIN扮演。轮到谁下棋,谁就把自己的一颗棋子放在空格上,谁先使自己的棋子形成“三合一线”(同一行或同一列或同一对角线上全是某人的棋子),谁就赢。
最大值用十字形表示,最小值用圆形表示。
比如右图就是敏赢的那盘棋。
为了不生成太大的博弈树,假设一次只展开两层。估价函数定义如下:
设棋局为P,评价函数为e(P)。
(1)如果P不是任何一方的获胜位置,则e(P)= e(MAX内仍为空的完整行、列或对角线的总数)-e(MIN内仍为空的完整行、列或对角线的总数)。
(2)如果P是MAX的赢局,那么E (P) = +∞。
(3)如果P是B会赢的博弈,那么E (P) =-∞。
例如,如果P显示在右侧,则e(P)=6-4=2
注意棋盘位置的对称性,在生成后续节点的位置时,后续博弈结束。
都是同一个棋局(在博弈中,一个棋局的分支系数变小,首先是因为对称,然后是棋盘上布子空间的减少)。图3.15是两级搜索生成的博弈树。静态估计记录在末端节点下,向后值记录在圆圈内。
因为右边显示的位置反向计算值最大,所以应该选择它作为MAX的第一步(正好是MAX的最佳优先步)。
现在我们假设MAX走了这一步,MIN的退一步是直接在X上面的空间放一个圆(这对MAX来说是很糟糕的一步棋,他一定没有采用好的搜索策略)。接下来,MAX在新模式中搜索两个图层,得到如图3.16所示的搜索图。
现在MAX在图中有两个可能的“最佳”优先级步骤,假设MAX采取图中所示的步骤。为了避免马上输,MIN被迫再走一步,导致了下面的棋局:MAX再次搜索,产生了如图3.17所示的树。
在这个树中,一些末端节点(比如其中一个标有a的节点)代表了MIN的胜利,所以它们的赋值是-∞。当这些估值被推回去的时候,我们可以看到,MAX最好的,也是唯一的一步,可以让他避免眼前的失败。现在,闵可以看到马克斯在他的下一步中一定会赢,所以闵不得不放弃。
用极大极小算法编程演示下一盘棋(在右边,可以点击操作)...
我们将用Visual Basic写一个井字棋的小游戏。
设计理念
首先要知道,井字游戏是一种典型的桌游,一种方式是电脑,一种方式是玩家。所以这种游戏一开始有两种方式:一种是玩家先走;另一种是电脑先行。这是我们首先要考虑的问题。
其次,因为是计算机和玩家对弈,所以我们要编写一个进程(出棋),可以让程序模拟人的思维,和人对弈(其实就是“人工智能”的体现),这个出棋进程也是这个游戏软件的关键。另外还要写两个过程(连西安和疏影)。联西安过程用于判断任意时刻是否有三个棋盘连成一条线。疏影过程用于判断一条线上如果有三个棋子相连,是哪一方相连,即判断哪一方获胜。
以上问题是实现井字游戏的关键思路。....