三子棋具体就不多介绍了,AI棋用O表示,我们的棋用X表示。先手后手自己选。这里主要说一下AI算法。首先AI会对整个棋盘MAP[3],[3]进行遍历,每个格子都有一个权值weight[i][j]。权值的第一次计算方法是对每一行i每一列j进行计算,计算基于这一格有几种获胜的路线。例如没有走时,9个格的权值为:
[] | [] | [] | 3 | 2 | 3 | |
---|---|---|---|---|---|---|
[] | [] | [] | 2 | 4 | 2 | |
[] | [] | [] | 3 | 2 | 3 |
角落有横竖斜三种获胜方法,边有横竖两种方法,中心有横竖两斜4种方法。假如某格有X阻挡,那么权值会相应变化,例如
[] | [] | [] | 2 | 1 | 2 | |
---|---|---|---|---|---|---|
[] | X | [] | 1 | 0 | 1 | |
[] | [] | [] | 2 | 1 | 2 |
由于有中心阻挡,那么角只有横竖两种方法赢,因此权值为2。但该AI还需继续优化。例如以下:
[] | X | [] | 1 | 0 | 1 | |
---|---|---|---|---|---|---|
[] | 0 | [] | 1 | 0 | 2 | |
X | X | 0 | 0 | 0 | 0 |
AI面对这种情况,本来下在第一个格子就赢了,但他会选择权值为2的格子。因此我们可以在现有权值条件的情况下,在附加个权值。假如某一格子的路线上已经有AI的子了,那么该条路线上未落子的所有格子权值再加1,如果有两个已落子的AI格子权值就加2。例如以下情况:
原权值 | 优化 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
[] | X | [] | 2 | 0 | 2 | 5 | 0 | 3 | ||
[] | 0 | [] | 2 | 0 | 2 | 3 | 0 | 4 | ||
[] | X | 0 | 2 | 0 | 0 | 3 | 0 | 0 |
第一个格子5是由于斜路线上有两个子,那在原有的基础2上先加1,再加2,所以权值为2+1+2。第2行第3列权值为4,因为横竖两条路线均有1个子,因此权值为2+1+1,其余格子路线上均有1个子,因此权值为2+1。这样落在权值5那个格子上AI就赢了。
但是仅仅这些判断是不够的。例如:
原权值 | 优化 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
X | [] | X | 0 | 1 | 0 | 0 | 2 | 0 | ||
[] | 0 | [] | 1 | 0 | 1 | 2 | 0 | 2 | ||
[] | [] | 0 | 1 | 2 | 0 | 2 | 4 | 0 |
AI会选择权值为4的格子。那此时AI选择权值为2的格子时,你只需要走一步就赢了,AI就输了,因此该AI算法还得继续。
那么AI可以逆向思考一番,AI可以考虑一下当前情况在计算AI权值的同时再计算一次我们的权值。例如上面例子:
AI | 你 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
X | [] | X | 0 | 1 | 0 | 0 | 1 | 0 | ||
[] | 0 | [] | 1 | 0 | 1 | 1 | 0 | 0 | ||
[] | [] | 0 | 1 | 2 | 0 | 1 | 0 | 0 | ||
优化AI | 优化你 | |||||||||
0 | 2 | 0 | 0 | 4 | 0 | |||||
2 | 0 | 2 | 2 | 0 | 0 | |||||
2 | 4 | 0 | 2 | 0 | 0 |
我们把两个权值相加(另外把AI的权值应该再加1,因为AI判断赢要优先于输或平,假如AI方有权值大的,代表一步能赢的,我方也有这种情况,那相加权值相同,AI既可以选择赢棋那一格,也可以选择堵你将要赢的那一格。但AI判断赢要优先于堵对方赢。例子就不举了):
相加权 | 加1权 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
X | [] | X | 0 | 6 | 0 | 0 | 7 | 0 | ||
[] | 0 | [] | 4 | 0 | 2 | 5 | 0 | 3 | ||
[] | [] | 0 | 4 | 4 | 0 | 5 | 4 | 0 |
因此AI判断到这里就会堵你了。
AI算法就介绍到这里,至于三子棋程序,由于过于简单,就不过多介绍了。主要介绍AI思想,Windows系统编译的程序。如果是Linux需要把以下代码改下。接下来我就贴上代码,供参考,如有不懂欢迎留言。
project.h
1 | #pragma once |
project.c
1 | #include<stdio.h> |
main.c
1 | #include<stdio.h> |