思路分析
绘制棋盘:
计算横线和竖线的起始、终结点坐标,绘制棋盘网格;
棋盘交叉点坐标:
计算每格宽高,循环保存棋盘所有点坐标,并初始化状态为0,表示此位置没有棋子,形成“棋盘坐标数组”;
获取点击位置的精确坐标:
获取当前点击位置的横纵坐标,然后获取精确坐标方法:
1、由于知道每格宽高,可以通过当前坐标计算出棋盘中离点击点最近坐标;
2、通过循环“棋盘坐标数组”,查找最近坐标;绘制棋子:
通过获取的精准坐标,以该点为圆心,每格宽高的三分之一为半径绘制棋子;
判断持棋方:
定义变量黑方棋子“落子坐标数组”和白方棋子“落子坐标数组”:
定义变量isWho = true;表示黑色棋子方持棋,对弈进行反转(isWho = !isWho );
注意:
1、添加落子坐标的状态,1为黑色方在该坐标落子,-1为白色方在该坐标落子;
2、同时将该坐标在“棋盘数组”删除,添加对应方的“落子坐标数组”;判断胜利方:
1、判断胜利,只需要判断当前棋子的“横向、纵向、右斜方、左斜方”这四个方向是否形成五子连珠;
2、减少判断次数:必须在黑方棋子“落子坐标数组”和白方棋子“落子坐标数组”的length大于等于才开始检查;
3、在检查过程中只要有一方满足五子连珠,则该方胜利,直接返回。悔棋操作:
1、由于对每方棋子进行了记录(黑方棋子“落子坐标数组”和白方棋子“落子坐标数组”),只需要判断当前悔棋方;
2、对其“落子数组”的最后一个坐标删除,将其添加到“棋盘坐标数组”中;
3、对棋盘进行重新绘制,双方棋子进行重新绘制;
注意:
在悔棋坐标的状态一定要初始化为0,代表该坐标为空,可以落子。重新开始:
对游戏进行初始化:棋盘、“棋盘坐标数组”、双方“落子坐标数组”、初始持棋方。
AI操作:
1、创建获取“胜利方法的数组”(棋盘中能够形成五连珠的所有方法);
2、创建双方在每种方法的“落子个数数组”,初始化都为0;
3、创建双方在每个坐标的“记分数组”,初始化都为0;
4、对“棋盘坐标数组”(由于在落子时,已将落子坐标删除,所以此时剩余坐标为空位坐标)进行遍历;
5、判断每个空位在“胜利方法的数组”中的重要性,如果人落子该坐标,形成五连珠:落子1个记10分,落子为2个记20分,落子3个记40分,落子4个记80分;如果AI在该坐标落子,形成五连珠:落子1个记15分,落子为2个记25分,落子3个记45分,落子4个记85分;
6、统计完所有空位的得分后,获取其中最大分数的坐标,让其和人落子的最大分坐标进行比较,取最大分数的坐标,电脑在该坐标落子;
7、反转人持棋。
注意
- 每次落子坐标的记录,方便悔棋,同时改变状态;
- 持棋方的判断,方便悔棋和落子;
- AI落子坐标的查找,需要通过“胜利方法的数组”来记分;
- 该AI的缺点不能判断该坐标形成的棋的类型(活三、死四等),导致很容易进行制造陷阱赢得胜利。