象棋人工智能的实现
来源:互联网 发布:excel数据粘贴到数据库 编辑:程序博客网 时间:2024/05/03 11:38
为了实现人机对战功能,必须实现象棋的人工智能,将象棋的每个棋子都赋予一定的权重,每走一步都计算分值,选择得分最高的一步,这是象棋人工智能的基本思想。
#ifndef AI_H #define AI_H #include "cocos2d.h" USING_NS_CC; class SceneGame; class Step : public CCObject { public: int _moveid; int _killid; int _xFrom; int _yFrom; int _xTo; int _yTo; static Step* create(int moveid, int killid, int xFrom, int yFrom, int xTo, int yTo) { Step* step = new Step; step->_killid = killid; step->_moveid = moveid; step->_xFrom = xFrom; step->_xTo = xTo; step->_yFrom = yFrom; step->_yTo = yTo; step->autorelease(); return step; } }; class AI { public: AI(SceneGame *game); SceneGame *_game; Step *GenOneMove(int level=2); int getScore(); static int _score[7]; CCArray *getAllPossibleMove(); void getAllPossibleMove(int idx,CCArray *arr); int getMinValue(int level,int maxScore); int getMaxValue(int level,int minScore); Step *_step; }; #endif // AI_H
得分表
int AI::_score[7]={ 1000, 10, 10, 100, 50, 50, 20};
创建一步
Step *AI::GenOneMove(int level){ int maxScore=-10000; Step *ret; //find all possible access an calcute the hights score CCArray *possibleMOve=getAllPossibleMove(); CCObject *obj; CCARRAY_FOREACH(possibleMOve,obj) { Step *step=(Step*)obj; _game->fakeMove(step); int score=getMinValue(level-1,maxScore); //int score=getScore(); _game->unfakeMove(step); if(score>maxScore) { maxScore=score; ret=step; } } return ret;}
最大值最小值算法
int AI::getMinValue(int level,int maxScore){ if(level ==0) { return getScore(); } int minScore=10000; CCArray *possibleMOve=getAllPossibleMove(); CCObject *obj; CCARRAY_FOREACH(possibleMOve,obj) { Step *step=(Step*)obj; _game->fakeMove(step); int score=getMaxValue(level-1,minScore); _game->unfakeMove(step); if(score<=maxScore) { minScore=score; return minScore; } if(score<minScore) { minScore=score; } } return minScore;}int AI::getMaxValue(int level,int minScore){ if(level ==0) { return getScore(); } int maxScore=-10000; CCArray *possibleMOve=getAllPossibleMove(); CCObject *obj; CCARRAY_FOREACH(possibleMOve,obj) { Step *step=(Step*)obj; _game->fakeMove(step); int score=getMinValue(level-1,maxScore); _game->unfakeMove(step); if(score>=minScore) { maxScore=score; break; } if(score>maxScore) { maxScore=score; } } return maxScore;}
值得注意的是,象棋预先考虑的步骤越多,象棋越智能,但是当象棋考虑到第4步的时候,ubuntu就崩溃了,可以采用智能减枝算法,有效减少计算量。注意,当使用智能减枝时,一定要将假动作回移,不然会引起递归混乱。
0 0
- 象棋人工智能的实现
- 象棋游戏的实现
- windows网络版象棋的实现
- 电脑象棋循序渐进(四):最初级的人工智能
- java实现简单的网络象棋游戏
- 人工智能的JAVA实现
- 关于人工智能的实现
- VC++ SDK 写的象棋游戏 用类实现的
- js实现的单机双人象棋演示及其分析
- 人工智能专家系统的简单实现
- 高级人工智能的实现方法
- 象棋的秘密
- 象棋的杀法??????
- Cocos2dx实现象棋之布局
- cocos2dx实现象棋之运动
- 象棋
- 象棋
- 象棋
- 架构基础1-linux基础
- 六款值得推荐的android(安卓)开源框架简介
- Java LinkedList基本用法
- 使用Nuwa实现安卓代码热修复及那些坑
- Java 多线程:volatile 多线程同步关键字
- 象棋人工智能的实现
- Linux(SUSE 12)安装jboss4并实现远程访问
- AS3 三角形填充
- YTU 2444: C++习题 对象转换
- 关于vba读取excel文件
- Java 多线程:多线程产生的原因
- JavaScript之贪吃蛇
- 关于COM组件的介绍
- 001_Http之客户端-服务端-servlet