- 游戏规则:双方轮流放子,当某一方的三个子连成一线(行,列,对角)时,该方获胜。

程序设计思想
-
首先选择先手的玩家,如果选择“X”表示“玩家”先手,如果选择“O”表示“电脑”先手,如果输入错误就会默认“玩家”先手。
-
我们通过(0-8)的数字表示棋盘上的位置,“玩家”和“电脑”会轮流下棋,如果一方获得胜利,或者平局的时候(棋盘上没有空位置)就结束。当轮到“玩家”下棋,就让玩家自己输入(0-8)的数字,但是要求不能输入棋盘上已经有棋子的位置,否则就让玩家重新输入,如果轮到“电脑”下棋,那么就让“电脑”采用极大极小值算法自动选择最适合下棋的位置。
- 用以下的9个数字来表示棋盘的位置:
- 0 1 2
- 3 4 5
- 6 7 8
-
在该程序中,我们会用-1,1来表示具体的玩家,0来表示空位置,这样就会方便我们计算胜利或失败的情况。

- 我们用-1(绿色方块)来表示“玩家”,1(红色方块)来表示“电脑”,0(灰色方块)表示空位置。
极大极小值算法计算当前位置分数
-
在该游戏中,“电脑”和“玩家”都想找到对于各自来说最高的分数,同时也想让对手获得更低的分数,因为我们需要让“电脑”自动下棋,那么我们假想“玩家”是非常聪明的,总会找到让“电脑”分数更低的棋盘状态,因此只要“玩家”找到这个分值,那么对于“电脑”来说这就是他的最差分值,不会比这个分值更差了。
-
那么如何找到这个分值呢? 我们就需要搜索“玩家”和“电脑”对弈的所有情况,每一种情况都有一个棋盘状态,因此最后肯定有结果(输,赢,平局),我们规定,输=-1,赢=1,平局=0。 因此有结果(-1,1,0)。
-
我们观察下图第一排,此时轮到“玩家”下棋,可以看到生成了第二排3个棋盘,第二排第一个棋盘已经有玩家获胜了,因此不需要再进行分裂了,因此分裂后面两个状态,直到有玩家获胜或者平局,直到将所有的状态都生成之后,计算叶节点的状态值。
- 1.观察下图可以看到最后一排有4个状态值,前两个状态值分别为(0,1),第四排由“玩家”(符号“X”)更新第三排得到,因此这表示的是对于“玩家”来说的状态值,那么对于“电脑”来说状态值分别为(0,-1),由于第三排没有分状态,因此第三排的状态值对于“电脑”来说分别还是为(0,-1);
- 2.由于第三排由“电脑”(符号“O”)更新第二排得到,对于“电脑”来说状态值分别为(0,-1),因此对“电脑”会选择第三排的最大状态值0,那么第二排第二个状态值就为0,同理可以得出第二排第三个也为0,因此第二排状态值对于“玩家”来说分别为(1,0,0);
- 3.由于第二排由“玩家”(符号“X”)更新第一排得到,状态值分别为(1,0,0),那么对于“电脑”来说状态值为(-1,0,0)那么“电脑”会选最大状态值0,因此第一排的状态值就等于0。

- 我们规定,当最高的分数等于 -1 ,那么就肯定失败,如果最高的分数等于 0 ,那么就是平局,如果最高的分数等于 1 ,那么就胜利了,因此这里我们


5635

被折叠的 条评论
为什么被折叠?



