五子棋智能下棋怎么实现的?来揭晓吧
源码连接:Java五子棋小游戏(控制台纯Ai算法)
基本权重计算
现在说说五子棋胜算是怎样判定的
这里就说到权重 如果你下棋的位置的权重是 4 那么你就能获得游戏的胜利
这里说位置 1>2>3>4>O 的权重
O 的最大权重是4 如果他在这个位置下棋了 那么他就能获得游戏的胜利
这里的O代表着下棋的位置
有的人怪说了 如果下棋的位置位于中间呢 正好集齐5个棋子
这里也要说明一下
反向计算权重
像这种情况 其实可以反向查询权重 然后把它加起来
例如图中 1>5> O 的方向 假如后面还有两个棋子
那么下 O 的位置就会获得游戏胜利
我们可以反向取权重 前面权重是2 后面权重是2 加起来正好是4 所以获得游戏胜利
稍后在高级算法详解
权重实现代码
这里我自己把之前发的 java代码扣过来了
/*
x 和 y 代表坐标
* xx :x方向需要增加的值
* yy :y方向需要增加的值
*
* 例如xx = -1 yy= -1
* 代表需要获取(x-1,y-1)的棋子
*
* xx = 1 yy= 1
* 代表需要获取(x+1,y+1)的棋子
*
* */
/**
* 计算权重
* @param x x坐标
* @param y y坐标
* @param xx x方向
* @param yy y方向
* @param size 缓存变量如果当前检测是棋子是你的棋子
* 那么就会保存这个变量继续递归获取下一个位置的权重
* @param c 自己的棋子颜色
* @return 返回计算后的权重
*/
private int ishas(int x,int y,int xx,int yy,int size ,char c){
//边缘检测防止超出棋盘位置
if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1)) return size;
//如果
if(table[x+xx][y+yy] == c){
return ishas(x+xx,y+yy,xx,yy,size+1,c);
}
return size;
}
计算权重伪代码–如果看着上面的费劲看这个
char table [16][16] ;//棋盘
/*
* x 和 y 代表坐标
* xx :x方向需要增加的值
* yy :y方向需要增加的值
*
* 例如xx = -1 yy= -1
* 代表需要获取(x-1,y-1)的棋子
*
* xx = 1 yy= 1
* 代表需要获取(x+1,y+1)的棋子
*
*/
计算权重( x, y, xx, yy ,初始权重 简称 -> 权重 , 你棋子的颜色 简称 -> 颜色){
//边缘检测防止超出棋盘位置
if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1))
return 权重; //不能计算墙以外的 所以直接返回权重
/*上面这句话的意思是
就拿 第一个 (x==0&&xx==-1) 来说:
如果他的横坐标为x 那么 就不能再进行x-1操作了 因为棋盘就这么大
*/
//这里假设 xx 和 yy = 1
//如果棋盘里的指定的格子(x+1,y+1)的颜色和你的棋子颜色一样 那么就对那个棋子在进行一次计算权重
if(table[x+xx][y+yy] == 颜色){
return 计算权重( x+xx,y+yy , xx , yy , 权重+1, 颜色);//递归
// x坐标 y坐标 下一个棋子方向 本次计算权重+1 颜色不变
}
//如果不等直接把权重的值返回
return 权重;
}
游戏运算伪代码
这里用伪代码写吧
char table [16][16]; //棋盘
Player p1 = new Player("P1","黑");
//这里就不弄类了 懂啥意思就行
Player.下棋(){
//里面定义的方法
控制台输入 <- (4,6)
table[4][6] = this.棋子颜色
判断胜负(this.棋子颜色);
}
判断胜负(x,y,棋子颜色){
...各种方向判断...
这里就拿 xx = 1 ,yy = 1 来说 就是依次判断右下角是不是跟你下的棋子颜色一样
// 这里判断右下角权重 这里是反方向判断左上角权重
int n = ishas(x,y,xx,yy,0,c) + ishas(x,y,-xx,-yy,0,c);
如果他们的权重之和等于4 那么
if(n>=4)
游戏结束
}
while(游戏结束条件){
Player p = 获取下棋玩家(轮到谁返回谁);
p.下棋()
打印棋盘();
}
一个十分简陋的程序就写出来了 ,这就是游戏运行过程
单拿这个代码创建两个玩家 ,可以人对人下棋
Ai是怎么下棋的
人与人的PK方法已经知道了 下面就来说说Ai下棋算法思路
还是拿权重的图
初级算法
- 发现对我有威胁的格子 我要赶紧补坑
- 对我威胁不大的 我走我自己的
伪代码实现
char table [16][16]; //棋盘
List<棋子> 棋子列表;
// Ai 玩家 也是玩家 所以 他有玩家的功能 只不过下棋方式 是自己定义的
class AiPlayer extends Player{
@重写
下棋(){
//里面定义的方法
控制台输入 <- 智能计算(4,6)
table[4][6] = this.棋子颜色
判断胜负(this.棋子颜色);
}
智能计算(){
*是否第一步--> return 随机中间棋子(8,8)
// 自己棋子的颜色 简称 -> 自己
// 对手棋子的颜色 简称 -> 对手
遍历所有格子 ->结果(x,y,当前格子颜色){
if(当前格子颜色 == 空){
//两个都要计算并且把计算结果保存到棋子类
计算权重(x,y,对手)-->两个方向计算权重
计算权重(x,y,自己)-->两个方向计算权重
//如果权重一样那么 对手权重-1 让自己先来
谁的权重大--> 棋子列表.加入棋子(new 棋子(x,y,权重))
}
}
//遍历完毕
棋子列表.按权重排序()
返回棋子 = 棋子列表.get(0);
return (返回棋子);
}
}
下一篇[Java五子棋小游戏-Ai算法精讲以及实现]-02-高级算法初步
源码连接:Java五子棋小游戏(控制台纯Ai算法)