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,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的设计暂时就是这样,之后如果突然有灵感还会继续修改代码。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 如何重新启动一组mongrel
- SQLite3第三方库之FMDB
- c# – 如何使用InvalidEnumArgumentException维护代码?
- FastJSON使用案例(fastjson-1.1.28.jar)
- 【PAT甲级】1008 Elevator (20 分)
- 使用Playground快速练习Swift语法 (一)
- vue中的非父子间的通讯问题简单的实例代码
- ios – Crashlytics没有向我的Fabric仪表板发送崩溃报告?
- oracle_linux_6_64(bit)上安装oracle11gR2数据库环境快速
- #Flex开发# 找?不?到?所?需?A?d?o?b?e? ?F?l?a?s?h? ?P?l?a