人机对抗代码 五子棋的简单算法——评分法

之前搞了个五子棋的算法,我在写好算法之前参考网上很多的五子棋算法像是博弈树算法这些的一开始写起来不太好理解,今天就分享一个简单的五子棋算法——评分法 。
评分法
原理:
评分法,有的也叫评分表法,不管叫什么,名字不重要,重要的是思路 。我们写棋总是下在对自己优势最大的位置上,但是可以下的位置有很多啊,电脑怎么知道下在哪里最好啊?评分法就是给每个可下的位置评分,电脑通过分数高低来判断下在哪个位置 。
方法:
评分法的原理是一致的,但方法各种各样,我的方法是这样的(仅供参考) 。
1、棋型分析
【人机对抗代码五子棋的简单算法——评分法】五子棋的棋型很多很多,在这里不详细介绍,只介绍一些简单的棋型 。
连五棋型:有五个相同颜色的棋子连成一线;
活四棋型:有四个相同颜色的棋子连成一线且两端均可下棋;
眠四棋型:有四个相同颜色的棋子连成一线但两端只有一端可下棋;
类似的还有活三、眠三、活二等棋型 。
下图,便是我以1为黑棋,2为白棋,0为空位置排列组合所得到的棋型示例,
图一是以所选位置为中心判断的,
图二则是以所选位置为起点判断的,
我们可以把这些棋型分别用一个二维数组来保存,方便与所选位置可组成的棋型比较 。
图一
图二
2、根据棋型打分(可以自己设置评分标准)
算法代码怎么写:
每次下棋前扫描棋盘上所有可以下的位置,把它们保存起来,然后用循环得出每一个位置八个方向可组成的棋型,再根据评分标准给位置评分,再判断最高的评分(要考虑有多个的情况) 。
步骤
1、创建类作为下棋的位置,代码如下:
package chess;public class position {private int x;//棋子位置横坐标private int y;//棋子位置纵坐标//构造方法public position(int x,int y) {this.x = x;this.y = y;}//通过set和get方法赋值和访问public void setX(int x) {this.x = x;}public int getX() {return x;}public void setY(int y) {this.y = y;}public int getY() {return y;}}
2、创建chess类
这里是核心,其中包含五子棋游戏初始化、下棋、棋盘情况判断、评分算法等方法,详情见下面代码:
package chess;import java.util.ArrayList;import java.util.Arrays;public class chess {private int size;//棋盘大小private int[][] chessboard;//棋盘private int color=1;//1为黑子,2为白子/** 以所选位置为中心的各种棋型,有连5,活4,眠4,活3,眠3,活2,眠2;* 连5:1111,2222;* 活4:1110,0111,2220,0222; * 眠4:1112,2111,2221,1222; * 活3:1100,0011,0110,2200,0022,0220;* 眠3:1120,1121,0211,1211,2110,0112,2210,2211,0122,2122,1220,0221;* 活2:0100,0010,0200,0020; * 眠2:2100,0012,1200,0021;*/private int[][] stiuation = { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 1, 1, 1, 0 }, { 0, 1, 1, 1 }, { 2, 2, 2, 0 },{ 0, 2, 2, 2 }, { 1, 1, 1, 2 }, { 2, 1, 1, 1 }, { 2, 2, 2, 1 }, { 1, 2, 2, 2 }, { 1, 1, 0, 0 },{ 0, 0, 1, 1 }, { 0, 1, 1, 0 }, { 2, 2, 0, 0 }, { 0, 0, 2, 2 }, { 0, 2, 2, 0 }, { 1, 1, 2, 0 },{ 1, 1, 2, 1 }, { 0, 2, 1, 1 }, { 1, 2, 1, 1 }, { 2, 1, 1, 0 }, { 0, 1, 1, 2 }, { 2, 2, 1, 0 },{ 2, 2, 1, 1 }, { 0, 1, 2, 2 }, { 2, 1, 2, 2 }, { 1, 2, 2, 0 }, { 0, 2, 2, 1 }, { 0, 1, 0, 0 },{ 0, 0, 1, 0 }, { 0, 2, 0, 0 }, { 0, 0, 2, 0 }, { 2, 1, 0, 0 }, { 0, 0, 1, 2 }, { 1, 2, 0, 0 },{ 0, 0, 2, 1 } };/** 以所选位置为起点的棋型,连5,活4,眠4,活3,眠3; * 连5:1111,2222; * 活4:1110,2220; * 眠4:1112,2221;* 活3:1100,1101,1102,2200,2201,2202; * 眠3:1120,1121,1122,2210,2211,2122;*/private int[][] stiuation2 = { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 1, 1, 1, 0 }, { 2, 2, 2, 0 }, { 1, 1, 1, 2 },{ 2, 2, 2, 1 }, { 1, 1, 0, 0 }, { 1, 1, 0, 1 }, { 1, 1, 0, 2 }, { 2, 2, 0, 0 }, { 2, 2, 0, 1 },{ 2, 2, 0, 2 }, { 1, 1, 2, 0 }, { 1, 1, 2, 1 }, { 1, 1, 2, 2 }, { 2, 2, 1, 0 }, { 2, 2, 1, 1 },{ 2, 2, 1, 2 } };//设置游戏,size为棋盘大小,color为电脑所选择棋子的颜色public void setGame(int size,int color) {this.size=size;this.color=color;this.chessboard=new int[this.size][this.size];//初始化棋盘for (int i = 0; i