这个游戏涉及到cocos2d-x的知识,主要有以下几点:
1,内存管理
原则1:谁申请的就谁释放,凡是用了new或malloc的就得记得delete或者free或者能用上aotorelease的
原则2:谁调用了retain方法,那就得调用release来释放
2,场景的切换的特效
例如:淡入淡出的效果
CCScene *pScene = MainMenu::scene();
CCScene *pS = CCTransitionFade::transitionWithDuration(2, pScene,ccc3(0,0,0));
// pScene->release(); 自己没有retain,故不需要调用这个方法
CCDirector::sharedDirector()->replaceScene(pS);
更多的特效可参考tests里面的
3,定时器
schedule方法是设置一个定时器,如下
schedule( schedule_selector(CHSWelcome2::gotoMainScene), 3);
这样每隔3s就会掉用CHSWelcome2::gotoMainScene这个方法,
直到这个场景被释放了
或者调用了 unschedule( schedule_selector(CHSWelcome2::gotoMainScene)); 这个方法
4,画图
1)一个图,一个精灵
CCSprite* pSprite = CCSprite::spriteWithFile("res/chess/bnkjs.jpg");
pSprite->setPosition( ccp(size.width/2, size.height/2) );
this->addChild(pSprite, 0);//把精灵加到layer里面才能显示出来
如果有很多图的话,感觉这样的方法效率会很低
2)用,CCSpriteFrameCache,CCTexture2D,CCSpriteBatchNode,
这里要用工具TexturePacker:网址http://www.codeandweb.com/,目的是把多张图片放到一张大的图片上,这样opengl好处理,为了效率它得内存对齐,这样cpu处理才快的,纹理的大小事2的倍数。
CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("res\\one\\chess.plist", "res\\one\\chess.png");//获取每个小图片在大图的信息
CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("res\\one\\chess.png");//把图片转化成纹理,这里得申请纹理的内存,引擎里面的png解码器把png解码后变成位图缓存在纹理里面,为后面的操作服务。
CCSpriteBatchNode *spriteBatch = CCSpriteBatchNode::batchNodeWithTexture(texture);//根据纹理创建
addChild(spriteBatch);//加到layer里面
pSprite = CCSprite::spriteWithSpriteFrameName("rk.png");//创建一个精灵,rk.png已在chess.png里面了
spriteBatch->addChild(pSprite, 0);//加到这个节点里面去,也就是说spriteBatch可以加了多精灵到里面去,这些精灵只限chess.png里的小图。
3)画直线
重写draw这个方法
void MainMenu::draw()
{
CCLayer::draw();
CCSize s = CCDirector::sharedDirector()->getWinSize();
glEnable(GL_LINE_SMOOTH);
ccDrawLine( CCPointMake(10,10), CCPointMake(50,50) );
glDisable(GL_LINE_SMOOTH);
}
,更多的图形可参考tests里的,这里就不详细描写了,挺简单的
4)网上有资料说可以用CCTextureRender来操作图,它就像一个画布,可以在上面画,这样的效率将会很高,会稍微复杂点 ,以后有机会再看看这个
4,动画
1) 里面用定时器来控制精灵的位置,这样它就动起来了,还有图片的交替显示,可以用setIsVisiable这个函数来控制,
2)用精灵的action动的效果,具体没有实现,可以参考tests里面的例子
二,涉及中国象棋的规则
这是个模拟的过程,每个棋子都有其自身的规则,为了简单以及好维护,可以单独为他们设定,
如将
int checkBKPos(int x,int y,int inMap[][9])
{
if(x<3 || x>5||y<7||y>9)//软禁它的九宫格里面
{
return 0;
}
if(inMap[y][x] != 0 && inMap[y][x] > 10)
{
return 0;
}
return 1;
}
int getBKPos(int sx,int sy,int dx,int dy,int inMap[][9], int outMap[][9])
{
int d[4][2] = {{-1,0},{0,1},{1,0},{0,-1}} ;//一般只能上下左右走,这里还差一个位置,就是它吃掉对面的帅的情况
memset(outMap,0,sizeof(int)*10*9);//设置整个棋盘都不能走
//获取将所有能走的位置
for(int i = 0; i<4;i++)
{
if(checkBKPos(sx+d[i][0],sy+d[i][1],inMap))
{
outMap[sy+d[i][1]][sx+d[i][0]] = 1;
}
}
if(outMap[dy][dx])//如果用户点击的位置正好是可以走的话,那就返回1
{
return 1;
}
return 0;
}
单独思考某一个棋就会简单了,把所有的棋子都按这样的想法思考,那规则的实现就简单了
其它详情看源码。
三,AI
这个比较复杂,涉及的知识比较多,也不是一两天能写出个好的AI的。说下我的想法:
给每个棋子设定重要性,比如帅 = 100,车 = 90,马 = 80,炮 = 70,相 = 70 等等,这样在判断舍弃那个棋子可以舍弃没那么重要的
第一步: 搜索每个棋子所有能走的位置,并给每个位置分数,然后从中选最高的分数即可;这样只搜索了一次,智力太低了
第二步: 重复这样几次也就是说把搜索的深度加大些,到最后把每一层的分数加起来,选最高的那个。
第三步: 但是这样的效率将会很低很低,这样就要考虑怎么剪枝了,当满足什么条件就不往下搜索
第四步: 从几个高分中随机选,提高可玩性,开局,及残局的时候另外处理,这样更丰富
还在找工作中,暂时无时间研究这个,还是集中精力学习cocos2d-x
代码:http://download.youkuaiyun.com/detail/lansong4/4431394