第一次写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,j))
					{
						choos_score_2+=HORN;
					}
//step.3			//下此点就会让出角
					if(AI_no_horn(turn,j))
					{
						choos_score_2-=HORN;
					}
//step.4			//若下此点下一步是否可下角
					else if(AI_is_next_horn(turn,j))
					{
						choos_score_2+=(HORN/2);
					}
				}
//step.5		//寻找边
				if(AI_is_line(turn,j))
				{
//step.6			//不下无效边
					if(AI_no_line(turn,j))
					{
						choos_score_2-=LINE;
					}
					choos_score_2+=LINE;
				}
//step.7		//返回夹子分数
				int cought=0;
				if((cought=AI_is_cought(turn,j))>1)
				{
					choos_score_2+=cought*CAUGHT;
				}
				
				//转换分数
				choos_score_2+=AI_getscore(turn,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的设计暂时就是这样,之后如果突然有灵感还会继续修改代码。

cocos2d-x 3.3 之黑白棋设计 NO.5 AI的更多相关文章

  1. iOS推送通知优先级

    我已设置推送通知并正常工作,但是,有时我会遇到终端设备上的延迟交付.有没有办法我可以将推送的“优先级”键设置为10,以便立即发送推送?

  2. ios – 何时使用Semaphore而不是Dispatch Group?

    我会假设我知道如何使用DispatchGroup,为了解问题,我尝试过:结果–预期–是:为了使用信号量,我实现了:并在viewDidLoad方法中调用它.结果是:从概念上讲,dispachGroup和Semaphore都有同样的目的.老实说,我不熟悉:什么时候使用信号量,尤其是在与dispachGroup合作时–可能–处理问题.我错过了什么部分?

  3. 如何使用Xcode的自动布局调整视图大小

    解决方法在写这个问题时,我意识到了诀窍是什么:在NSPopUpButton的大小检查器中,我不得不降低内容拥抱优先级.显然,这可以控制视图“拥抱”其内容的紧密程度.因此,当拥抱优先级高于调整大小优先级时,视图将不希望增加其大小,因为这意味着其边界与其内容之间具有更多的空白空间.然后在我的特殊情况下,我也可以将两个NSPopUpButtons固定为具有相同的宽度和vo:popUpButtons将完美地调整大小,同时保持间距不变.

  4. ios – 默认的自动布局内容拥抱和内容压缩阻抗优先级值是什么?

    我正在尝试调试自动布局问题,并且知道内容拥抱和内容压缩阻力优先级的默认值将有所帮助.这些是什么?它们是否特定于特定组件?我可以使用常量来引用它们吗?

  5. ios – 如何在iPhone应用程序中集成SIRI?

    我正在开发一款iPad应用程序.我想在其中集成SIRI功能.所以,请指导我研究这个问题.其实我不知道如何开始.谢谢,CP解决方法直到现在苹果还没有发布siri的api用于第三方应用程序.如果您正在寻找文本到语音,语音到文本功能.有很多外部api像:>Nuance–Dragon>ispeech>OpenEars还有很多其他的api.OpenEars是一个开源离线api,另外两个是付费和在线的.

  6. ios – 为自定义创建的串行异步队列设置优先级

    如何使用GCD为自定义创建的串行异步队列设置高优先级?如果是这样,什么是替代解决方案?解决方法您的队列仍然是串行的.它只会在高优先级全局并发后台队列的一个插槽中一次执行一项任务.一旦创建,串行队列就不能以任何方式“并发”.同样,如果您创建并发队列并将其设置为以串行队列为目标,则它实际上变为串行.这一切都在manpage中有所涉及.

  7. iOS 9中UILabel中的多行文本

    我正在开发iOS项目但是当我更新到iOS9时,我在UILabels中遇到了多线问题.我正在使用Autolayout.有谁知道如何在iOS9中做到这一点?如果是这样,那么问题可能是标签内容压缩阻力优先级太低,尝试将其设置为required或1000.内容压缩阻力告诉视图引擎您的标签可以缩小的优先级.将其设置为必需会强制它不缩小.在InterfaceBuilder中,只需选择标签,点击SizeInspector(小标尺),然后将其更改为1000.或者,在代码中,等价物将是:

  8. ios – AutoLayout修改约束

    我发现Autolayout有点困难,所以任何帮助都会非常感激解决方法嗨,你可以做2套约束:>1以优先级高管理您的四视图>1以优先级低管理全屏在点击按钮时调用的方法中,将优先级设置为全屏约束,将优先级设置为四视图约束.

  9. Swift 运算符重载

    但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。例如:我们在SwiftSpriteKitutilitylibrary代码中使用运算符重载去讲多个CGPoints对象相加,例如下面代码:1234letpt1=CGPointletpt2=CGPointletpt3=pt1+pt2letpt4=pt3*100方便吧?当一个人查看你的代码,他们希望操作符的默认行为,这时候运算符重载会使他们迷惑。幸运的是Swift让你能够定义属于你自己的自定义的运算符。

  10. Swift学习一:自定义运算符 operator

    自定义运算符仅能包含这些字符:运算符位置:运算符其他配置范例

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部