cocos2d-x 3.3 之黑白棋设计 NO.5 AI

[以前的文章,重新发布]

第一次写AI,从最开始随便就能赢到最后仔细下都不一定能赢,这中间花费了很长一段时间,代码量也超过了之前很多。每次改进和修复BUG都是对自己的一个提升。

 

我的AI是基于优先级设计的,另外加了一些其他判断,现在先看看棋盘:

红色:这四个点不需要特别说明,占的越多胜利的几率越大

蓝色:这些点是略低于角点的最优点

黄色:这几个点无关优先级,但是需要特别注意,棋盘的博弈就是让自己占到角和不让对方占到角,下这个点容易让出角点,或者让自己有机会占角,所以需要特别注意

 

以上是棋盘上3种需要注意的区域,其中角和边的点都有自己的优先分数,比如角是50,边是10,另外下一个点能占的棋子数累加也有个分数,还有夹子数......

 

			if(AI_flag==1)
			{
//step.1		//寻找角
				if(AI_is_horn(turn,i,j))
				{
					choos_score_2+=(HORN*2);
				}
				else
				{
//step.2			//不下此点就会让出角
					if(AI_not_do_no_horn(turn,i,j))
					{
						choos_score_2+=HORN;
					}
//step.3			//下此点就会让出角
					if(AI_no_horn(turn,i,j))
					{
						choos_score_2-=HORN;
					}
//step.4			//若下此点下一步是否可下角
					else if(AI_is_next_horn(turn,i,j))
					{
						choos_score_2+=(HORN/2);
					}
				}
//step.5		//寻找边
				if(AI_is_line(turn,i,j))
				{
//step.6			//不下无效边
					if(AI_no_line(turn,i,j))
					{
						choos_score_2-=LINE;
					}
					choos_score_2+=LINE;
				}
//step.7		//返回夹子分数
				int cought=0;
				if((cought=AI_is_cought(turn,i,j))>1)
				{
					choos_score_2+=cought*CAUGHT;
				}
				
				//转换分数
				choos_score_2+=AI_getscore(turn,i,j);
				//如果分数比缓存高
				rand=CCRANDOM_0_1();
				if(rand>=0)
				{
					if(choos_score_2>=choos_score)
					{
						choos_x=i;
						choos_y=j;
						choos_score=choos_score_2;
					}
				}
				else
				{
					if(choos_score_2>choos_score)
					{
						choos_x=i;
						choos_y=j;
						choos_score=choos_score_2;
					}
				}
			}

 

 

 

 

 

以上代码是AI的serch函数,其中有7个步骤,代码中有注释比较容易理解,这样电脑就变得比较智能,当然我的代码是单步搜索,还可以做成多步搜索,那么就更加智能了。

 

以下说说AI如何实现以上的serch函数,我的设计比较简单,就是在类里定义一个跟棋盘一样大的二维数组的模拟棋盘,用一个init函数将棋盘上的棋子数据存入数组里

 

void Game::AI_chess_init()
{
	//初始化储存棋盘
	for(int a=0;a<10;a++)
	{
		for(int b=0;b<10;b++)
		{
			AI_chess[a][b]=chess[a][b]->qi_type;
		}
	}
}

非常简单,这样就能直接在模拟棋盘上模拟下棋,每次serch就重新init一下。

 

 

AI的设计暂时就是这样,之后如果突然有灵感还会继续修改代码。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值