[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.下棋()
	打印棋盘();
}

一个十分简陋的程序就写出来了 ,这就是游戏运行过程
单拿这个代码创建两个玩家 ,可以人对人下棋


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算法)


发布了18 篇原创文章 · 获赞 14 · 访问量 7515

猜你喜欢

转载自blog.csdn.net/qq_18604209/article/details/104003789