cocos2dx 象棋

2024-03-08 13:59
文章标签 象棋 cocos2dx

本文主要是介绍cocos2dx 象棋,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*******************************************************************
*  Copyright(c) 2017
*  All rights reserved.
*
*  文件名称: Chess.cpp
*  简要描述:	Chess
*
*  创建日期: 2017-07-21
*  作者:	gongluck
*  说明:
*
*  修改日期: 2017-07-24
*  作者:	gongluck
*  说明:
******************************************************************/
#include "Define.h"
#include "Chess.h"USING_NS_CC;bool Chess::init()
{if (!Sprite::init())return false;return true;
}Chess* Chess::createChess(TAG tag, TYPE type, cocos2d::Vec2 pos)
{auto chess = new Chess();if (chess && chess->init()){chess->autorelease();chess->initChess(tag, type, pos);}else{delete chess;chess = NULL;}return chess;
}
void Chess::initChess(TAG tag, TYPE type, cocos2d::Vec2 pos)
{std::string picName;if (tag == TAG::RED){picName += "r";}else if (tag == TAG::BLACK){picName += "b";}else{CCLOG("initChess error : tag = %d", tag);return;}this->tag = tag;if (type < TYPE::JIANG || type > TYPE::BING){CCLOG("initChess error : type = %d", type);return;}else{picName += TypeStr[type];picName += ".png";}this->type = type;this->setDisplayFrame(SpriteFrame::create(picName,Rect(0,0,56,56)));this->setPosition(pos);this->setScale(0.75);
}void Chess::InitPos()
{this->runAction(MoveTo::create(1.5,Vec2(35+initPos.x*36,20+initPos.y*36)));this->currentPos = initPos;this->setVisible(true);
}

/*******************************************************************
*  Copyright(c) 2017
*  All rights reserved.
*
*  文件名称: GameStart.cpp
*  简要描述:	GameStart
*
*  创建日期: 2017-07-21
*  作者:	gongluck
*  说明:
*
*  修改日期:
*  作者:
*  说明:
******************************************************************/
#include "Define.h"
#include "GameStart.h"
#include "GameScene.h"USING_NS_CC;bool GameStart::init()
{if (!Layer::init())return false;auto size = Director::getInstance()->getVisibleSize();auto red = Sprite::create("chessRed.png");red->setPosition(size.width/2-100,size.height/2);addChild(red, 0, TAG::RED);auto black = Sprite::create("chessBlack.png");black->setPosition(size.width / 2 + 100, size.height / 2);addChild(black, 0, TAG::BLACK);auto listener = EventListenerTouchOneByOne::create();listener->onTouchBegan = CC_CALLBACK_2(GameStart::touchBegan, this);listener->onTouchEnded = CC_CALLBACK_2(GameStart::touchEnded, this);Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);return true;
}Scene* GameStart::createScene()
{auto scene = Scene::create();auto layer = GameStart::create();scene->addChild(layer);return scene;
}bool GameStart::touchBegan(Touch*, Event*)
{return true;//touchEnded
}void GameStart::touchEnded(Touch* touch, Event* event)
{//getLocation返回的是OpenGL的坐标系,getBoundingBox返回的是父节点坐标系auto pos = touch->getLocation();//OpenGLauto red = static_cast<Sprite*>(getChildByTag(TAG::RED));auto black = static_cast<Sprite*>(getChildByTag(TAG::BLACK));auto size = Director::getInstance()->getVisibleSize();auto select = TAG::NONE;if (red->getBoundingBox().containsPoint(this->convertToNodeSpace(pos))){select = TAG::RED;red->setZOrder(red->getZOrder()+1);}else if (black->getBoundingBox().containsPoint(this->convertToNodeSpace(pos))){select = TAG::BLACK;black->setZOrder(black->getZOrder()+1);}if (select != TAG::NONE){auto moveto1 = MoveTo::create(1, size / 2);auto rotate1 = RotateBy::create(1, 360);auto spawn1 = Spawn::create(moveto1, rotate1, NULL);auto moveto2 = moveto1->clone();auto rotate2 = rotate1->reverse();auto spawn2 = Spawn::create(moveto2, rotate2, NULL);auto action1 = TargetedAction::create(red, spawn1);auto action2 = TargetedAction::create(black, spawn2);auto spawn = Spawn::create(action1, action2, NULL);auto sequence = Sequence::create(spawn,CallFunc::create([=](){Director::getInstance()->replaceScene(TransitionJumpZoom::create(2, GameScene::createScene(select)));}),NULL);runAction(sequence);}}

/*******************************************************************
*  Copyright(c) 2017
*  All rights reserved.
*
*  文件名称: GameScene.cpp
*  简要描述:	GameScene
*
*  创建日期: 2017-07-21
*  作者:	gongluck
*  说明:
*
*  修改日期: 2017-07-24
*  作者: gongluck
*  说明:
******************************************************************/
#include "Define.h"
#include "Chess.h"
#include "GameScene.h"USING_NS_CC;bool GameScene::init()
{if (!Layer::init())return false;return true;
}Scene* GameScene::createScene(TAG tag)
{auto scene = Scene::create();auto layer = GameScene::createGame(tag);scene->addChild(layer);return scene;
}GameScene* GameScene::createGame(TAG tag)
{auto layer = new GameScene();if (layer && layer->init()){layer->autorelease();layer->initGame(tag);}else{delete layer;layer = NULL;}return layer;
}
void GameScene::initGame(TAG Tag)
{this->tag = Tag;auto size = Director::getInstance()->getVisibleSize();auto background = Sprite::create("background.png");background->setScale(size.height / background->getContentSize().height);background->setPosition(background->getBoundingBox().size.width/2,size.height /2);addChild(background);auto floor = Sprite::create("floor.jpg");floor->setScaleX((size.width - background->getBoundingBox().size.width) / floor->getContentSize().width);floor->setScaleY(size.height / floor->getContentSize().height);floor->setPosition(size.width - floor->getBoundingBox().size.width / 2, size.height / 2);addChild(floor);auto mNew = MenuItemImage::create("new.jpg", "new.jpg",CC_CALLBACK_1(GameScene::menuNew,this));auto mReg = MenuItemImage::create("regret.jpg", "regret.jpg", CC_CALLBACK_1(GameScene::menuRegret, this));auto menu = Menu::create(mNew, mReg, NULL);menu->alignItemsVertically();menu->setPosition(floor->getPosition());addChild(menu);srand(time(NULL));int i = 0;for (int tag = TAG::RED; tag <= TAG::BLACK; ++tag)//先创建红色棋子{chesses[i] = Chess::createChess((TAG)tag, TYPE::JIANG, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(4, tag == Tag ? 0:9));addChild(chesses[i]);++i;int flag = 0;for (int times = 0; times < 2; ++times,++flag){chesses[i] = Chess::createChess((TAG)tag, TYPE::SHI, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(3+flag*2,tag==Tag?0:9));addChild(chesses[i]);++i;chesses[i] = Chess::createChess((TAG)tag, TYPE::XIANG, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(2 + flag * 4, tag == Tag ? 0 : 9));addChild(chesses[i]);++i;chesses[i] = Chess::createChess((TAG)tag, TYPE::MA, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(1 + flag * 6, tag == Tag ? 0 : 9));addChild(chesses[i]);++i;chesses[i] = Chess::createChess((TAG)tag, TYPE::CHE, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(0 + flag * 8, tag == Tag ? 0 : 9));addChild(chesses[i]);++i;chesses[i] = Chess::createChess((TAG)tag, TYPE::PAO, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(1+flag*6,tag==Tag?2:7));addChild(chesses[i]);++i;}flag = 0;for (int times = 0; times < 5; ++times,++flag){chesses[i] = Chess::createChess((TAG)tag, TYPE::BING, Vec2(rand() % HEIGHT, rand() % HEIGHT));chesses[i]->setInitPos(Point(0+flag*2,tag==Tag?3:6));addChild(chesses[i]);++i;}}auto listener = EventListenerTouchOneByOne::create();listener->onTouchBegan = CC_CALLBACK_2(GameScene::touchBegan, this);Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);selected = Sprite::create("selected.png");selected->setScale(0.75);selected->setVisible(false);addChild(selected);selectIndex = -1;for (auto& i : pane){for (auto &j : i){j = -1;}}win = Sprite::create("yingjiemian.png");win->setPosition(size / 2);addChild(win);win->setVisible(false);
}void GameScene::menuNew(cocos2d::Ref*)
{Point pos;int index = 0;for (auto i : chesses){i->InitPos();pos = i->getInitPos();pane[(int)pos.x][(int)pos.y] = index;++index;}selected->setVisible(false);selectIndex = -1;turn = tag;steps.clear();
}void GameScene::menuRegret(cocos2d::Ref*)
{if (steps.size() > 0){Step step = steps.back();Point from = step.from;Point to = step.to;chesses[pane[(int)to.x][(int)to.y]]->runAction(MoveTo::create(0.1, Vec2(35 + from.x * 36, 20 + from.y * 36)));chesses[pane[(int)to.x][(int)to.y]]->setPos(from);pane[(int)from.x][(int)from.y] = pane[(int)to.x][(int)to.y];pane[(int)to.x][(int)to.y] = step.killnum;if (step.killnum != -1)chesses[step.killnum]->setVisible(true);steps.pop_back();selected->setVisible(false);selectIndex = -1;turn = turn == TAG::RED ? TAG::BLACK : TAG::RED;}}bool GameScene::touchBegan(cocos2d::Touch* touch, cocos2d::Event*)
{auto touchPos = touch->getLocation();//OpenGLint x = (touchPos.x - 35 + 18) / 36;int y = (touchPos.y - 20 + 18) / 36;CCLOG("x=%d,y=%d", x, y);if (x<0 || x>9 || y<0 || y>10)return false;moveChess(selectIndex, Point(x, y));return false;
}bool GameScene::moveChess(int index, Point pos)
{if (pane[(int)pos.x][(int)pos.y] != -1 && chesses[pane[(int)pos.x][(int)pos.y]]->getTag() == turn)//点中棋子是我方{selected->setVisible(true);selected->setPosition(35 + 36 * pos.x, 20 + 36 * pos.y);selectIndex = pane[(int)pos.x][(int)pos.y];return false;//没有移动}else{if (index == -1)return false;if (moveChessFromTo(chesses[index]->getType(), chesses[index]->getPos(), pos)){selected->setVisible(false);selectIndex = -1;turn = turn == TAG::RED ? TAG::BLACK : TAG::RED;}}
}bool GameScene::moveChessFromTo(TYPE type, cocos2d::Point from, cocos2d::Point to)
{int x1 = from.x;int x2 = to.x;int y1 = from.y;int y2 = to.y;int d_x = abs(x1 - x2);int d_y = abs(y1 - y2);bool res = false;int num = 0;Step step;switch (type){case TYPE::JIANG:if (x2 < 3 || x2 >5 || (y2 > 2 && y2 <7) || d_x>1 || d_y > 1 || (x1 != x2 && y1 != y2))res = false;elseres = true;break;case TYPE::SHI:if (d_x != 1 || d_y != 1 || x2 < 3 || x2 >5 || (y2 > 2 && y2 <7))res = false;else res = true;break;case TYPE::XIANG:if (d_x != 2 || d_y != 2 || (y1 <= 4 && y2>4) || (y1 > 4 && y2 <= 4) || pane[(x1 + x2) / 2][(y1 + y2) / 2] != -1)res = false;elseres = true;break;case TYPE::MA:if (d_x == 2 && d_y == 1){if (pane[(x1 + x2) / 2][y1] != -1)res = false;elseres = true;}else if (d_y == 2 && d_x == 1){if (pane[x1][(y1 + y2) / 2] != -1)res = false;elseres = true;}elseres = false;break;case TYPE::CHE:if (d_x > 0 && d_y > 0)res = false;res = true;if (d_x == 0){auto min = y1 < y2 ? y1 : y2;auto max = y1 > y2 ? y1 : y2;for (int temp = min+1; temp < max; ++temp){if (pane[x1][temp] != -1)res = false;}}else if (d_y == 0){auto min = x1 < x2 ? x1 : x2;auto max = x1 > x2 ? x1 : x2;for (int temp = min+1; temp < max; ++temp){if (pane[temp][y1] != -1)res = false;}}break;case TYPE::PAO:num = 0;if (d_x == 0){auto min = y1 < y2 ? y1 : y2;auto max = y1 > y2 ? y1 : y2;for (int temp = min + 1; temp < max; ++temp){if (pane[x1][temp] != -1)++num;}if ((num == 0 && pane[x2][y2] == -1) || (num == 1 && pane[x2][y2] != -1 && chesses[pane[x2][y2]]->getTag() != turn))res = true;}else if (d_y == 0){auto min = x1 < x2 ? x1 : x2;auto max = x1 > x2 ? x1 : x2;for (int temp = min + 1; temp < max; ++temp){if (pane[temp][y1] != -1)++num;}if ((num == 0 && pane[x2][y2] == -1) || (num == 1 && pane[x2][y2] != -1 && chesses[pane[x2][y2]]->getTag() != turn))res = true;}elseres = false;break;case TYPE::BING:if (d_y == 0 && d_x == 1 && ((chesses[pane[x1][y1]]->getTag() == tag && y1>4) || (chesses[pane[x1][y1]]->getTag() != tag && y1<5)))res = true;else if (d_x == 0 && d_y == 1){if ((chesses[pane[x1][y1]]->getTag() == tag && y2 > y1) || (chesses[pane[x1][y1]]->getTag() != tag && y2 < y1))res = true;else res = false;}elseres = false;break;default:res = false;break;}if (res){step.from = from;step.to = to;step.killnum = -1;chesses[pane[(int)from.x][(int)from.y]]->runAction(MoveTo::create(0.5, Vec2(35 + x2 * 36, 20 + y2 * 36)));chesses[pane[(int)from.x][(int)from.y]]->setPos(to);if (pane[(int)to.x][(int)to.y] != -1){step.killnum = pane[(int)to.x][(int)to.y];chesses[pane[(int)to.x][(int)to.y]]->setVisible(false);if (chesses[pane[(int)to.x][(int)to.y]]->getType() == TYPE::JIANG){win->setVisible(true);scheduleOnce(schedule_selector(GameScene::winCall), 2.0f);}}steps.push_back(step);pane[(int)to.x][(int)to.y] = pane[(int)from.x][(int)from.y];pane[(int)from.x][(int)from.y] = -1;}return res;
}void GameScene::winCall(float dt)
{win->setVisible(false);
}

https://github.com/gongluck93/GameChineseChess.git

这篇关于cocos2dx 象棋的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787313

相关文章

Cocos2dx 3.0 过渡篇(五) 随机数的获取

1、简单的随机数用法:CCRANDOM_0_1 示例如下: [cpp] int HelloWorld::getRand(int start,int end)  {   float i = CCRANDOM_0_1()*(end-start+1)+start;  //产生一个从start到end间的随机数   return (int)i;  }   2、上述的方法虽然简便,但是运行

Cocos2dx 3.0 过渡篇(三) 触摸机制

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18325493 本来在中午休息时间打算大展拳脚,好好写一篇新触摸机制相关的博文,结果,等真正下手的时候才发现无从下手,很多地方自己都说不清,赶紧看了下testCpp,才发现原来是这样,还可以这样,哦?这样都行?哎,我还是太年轻了。   咱也只能

Cocos2dx 3.0 过渡篇(二) 事件回调

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18216679 3.0 后的事件回调函数接口都不一样了,例如按钮的menu_selector(),update的 schedule_selector等,都已成明日黄花。而新的回调接口,则由四个CC_CALLBACK取代。 下面先举例一些

cocos2dx场景切换中init、onEnter、onEnterTransitionDidFinish的调用顺序

这些方法调用的先后顺序如下(使用 replaceScene 方法): 1. 第2个场景的 scene 方法 2. 第2个场景的 init 方法 3. 第2个场景的 onEnter 方法 4. 转场 5. 第1个场景的 onExit 方法 6. 第2个场景的 onEnterTransitionDidFinish 方法 7. 第1个场景的 dealloc 方

Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value 及 网络通信

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 通信方式 主要有以下三大类: (一)SERVER/CLIENT方式: 1.一个Client方连接一个Server方,或称点对点(peer to peer)。 2.多个Client方连接一个Server方,这也是通常的

cocos2dx与OpenGL渲染知识

1 顶点和片段介绍 2 why不同纹理会需要重新渲染 纹理优化--------- 3 通俗易懂的 OpenGL ES 3.0 和2.0区别 –参考文档: https://blog.csdn.net/u013654125/article/details/79698469 ~ https://blog.csdn.net/sun___shine/article/details/48313749 Coc

cocos2dx加快游戏速度

游戏的速度可以由导演来控制。 float multi = 1.0f; CCDirector::sharedDirector()->getScheduler()->setTimeScale(multi); 参数multi是倍率的意思,默认是1,倍率越高速度越快。 如果需要提升一倍的速度,可以把multi设为2.0f。 通过这样一个机制可以实现游戏内战斗倍数加速的

cocos2dx-lua 3.17 调试 代码提示

环境配置 cocos2dx版本:3.17 vs版本:2015 babelua:3.2.2.0 lua Api:3.12 (ps:这是我能找到的最新的了,如果有更新的,麻烦发我qq 1908662823,链接:https://pan.baidu.com/s/18XacVvBFaDqenfdpSrn_5Q 提取码:iwge ) 代码提示 lua Api下载后放置于C:\Users\feiyi\D

Cocos2dx static变量的声明和初始化

Cocos2dx中变量的声明和初始化.h头文件,在类的声明中 staticint num; 在.cpp文件中紧跟着头文件的声明后写: intHelloWorld:: num;//把HelloWorld修改为你自己的类 然后再构造函数中进行初始化,例如 num =0; 经过这样的三部曲,这个变量num就可以在整个类的文件可见和传参了.

cocos2dx 3.1 使用 cocostudio 导出UI文件 vs2012

利用cocostudio导出文件后,产生三个文件 x.ExportJson   x.plist   x.png 请注意,导出这三个文件后,千万不要更改名字!!! 或者说更改名字的话,需要更改ExportJson里面的内容,因为ExportJson里面引用了plist和png文件 在以前的版本中,3.0中使用的是UILayer类, 3.1 中 ,只需要通过GUIReaderdur读