棋盘源码游戏源码-【Java五子棋小游戏-Ai算法精讲与实现】-01-算法初步

如何实现五子棋的智能化游戏?出来

源码链接: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.下棋()
	打印棋盘();
}

写下了一个很窄的程序,这就是游戏的运行流程

单拿这段代码就可以创建两个玩家,可以互相对战

艾未未如何下棋

人与人之间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算法)