如何实现五子棋的智能化游戏?出来
基本重量估计
现在我们来说说如何判断五子棋的胜负
这里我们谈谈重量。 如果你所打位置的权重是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.下棋()
打印棋盘();
}
写下了一个很窄的程序,这就是游戏的运行流程
单拿这段代码就可以创建两个玩家,可以互相对战
艾未未如何下棋
人与人之间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算法)
发表评论