做这个游戏的时候,我大二,那时还不会用git, 项目代码什么的都给压缩存到了百度云里,现在有了自己的github账号,代码资源什么的就都有啦。需要的可以自己去clone, 地址在这里:大兵小将
一:概述
我们组C++课设游戏:大兵小将,是通过cocos2d-x3.0用C++语言编写的,它是根据一个童年时自己玩的一款游戏改编而来的,即小兵围大炮。打开过渡游戏界面,你会看到可爱的Q版明星,界面上有三个按钮:进入游戏,游戏规则和退出。其中进入游戏和游戏规则这两个按钮居于页面中间,退出游戏的按钮则位于右下角。点击规则按钮,你会进入到相应的页面,这里有专门为初玩者准备的详细游戏规则,通过它,你可以迅速了解掌握这个小游戏的玩法。然后点击游戏规则页面的返回按钮,返回到过渡页面,点击开始游戏按钮,你将进入简洁明了的游戏界面。该界面由一个棋盘和三个按钮,以及一张古香古色的背景图构成。选择角色之后,就可以进入游戏了。
二:游戏介绍
大兵小将这个游戏是属于棋盘类游戏。棋子个数:将共18枚,兵共2枚。游戏规则:玩家先选定兵或将的角色,每局由兵先开始。兵和将每次只能移动一格。当兵和将中间隔一格时,兵可以吃掉将。当兵把将全部吃掉时,兵获胜。当将把全部兵围困住,让兵无法移动时,将获胜。
三:游戏算法代码实现:
3.1主菜单3.1.1创建主菜单场景:
Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
3.1.2.对场景进行初始化,添加按钮
bool HelloWorld::init()
{
// 1. super init first
if ( !Layer::init() )
{
return false;
}
//获取整个手机可视屏幕尺寸
Size visibleSize = Director::getInstance()->getVisibleSize();
//获取手机可视屏原点的坐标
Point origin = Director::getInstance()->getVisibleOrigin();
//创建一个带图标的按钮
//点击后调用menuCloseCallback方法退出游戏
auto closeItem = MenuItemImage::create(
"kaishi.png",
"kaishi1.png",
CC_CALLBACK_1(HelloWorld::GameShow, this));
closeItem->setPosition(Point(400, 320));
auto closeItem1= MenuItemImage::create(
"guize.png",
"guize1.png",
CC_CALLBACK_1(HelloWorld::GameRule, this));
closeItem1->setPosition(Point(410, 200));
//创建一个带图标的按钮
//点击后调用menuCloseCallback方法退出游戏
auto closeItem2 = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
//设置按钮的显示位置
//显示在可视屏幕的右下角
closeItem2->setPosition(Point(origin.x + visibleSize.width - closeItem2->getContentSize().width / 2,
origin.y + closeItem2->getContentSize().height / 2));
//创建一个可释放的菜单
auto menu = Menu::create(closeItem, closeItem1, closeItem2, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu, 1);
//创建一个显示"Little Big Soldier"文字的Label
auto label = LabelTTF::create("Little Big Soldier", "Arial", 24);
//position the label on the center of the screen
label->setPosition(Point(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height));
// add the label as a child to this layer
this->addChild(label, 1);
auto bg = Sprite::create("_jiemian.png");
bg->setPosition(Point(400,261));
//bg->setContentSize(Size(11,16));
addChild(bg);
return true;
}
3.1.3.跳转到游戏界面
void HelloWorld::GameShow(Ref* pSender)
{
auto scene = Scene::create();//创建一个自释放的场景对象
scene->addChild(MyScene::create());//把创建的画面层添加到场景中
Director::getInstance()->pushScene(TransitionFlipAngular::create(.5, scene));//运用导演类来进行切换场景
}
3.1.4.跳转到规则界面
void HelloWorld::GameRule(Ref* pSender)
{
auto scene1 = Scene::create();//创建一个自释放的场景对象
scene1->addChild(MyRule::create());//把创建的画面层添加到场景中
Director::getInstance()->pushScene(TransitionFlipAngular::create(.5, scene1));//运用导演类来进行切换场景
}
3.1.5.退出按钮事件
void HelloWorld::menuCloseCallback(Ref* pSender)
{
//当是wp8或者winrt平台的时候
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
return;
#endif
//结束Director
Director::getInstance()->end();
//当是ios平台的时候退出
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
3.2游戏规则页面
3.2.1.创建规则页面的场景
Scene* MyRule::createScene()
{
auto scene1 = Scene::create();
auto layer = MyRule::create();
scene1->addChild(layer);
return scene1;
}
3.2.2.对规则层进行初始化
bool MyRule::init()
{
if (!Layer::init())
{
return false;
}
Sprite *guize = Sprite::create("guize.jpg");//括号里面是图片的路径
guize->setPosition(Point(400, 261));
addChild(guize);
auto closeItem = MenuItemImage::create(
"back.png",
"back1.png",
CC_CALLBACK_1(MyRule::Back, this));
closeItem->setPosition(Point(300,35));
auto menu = Menu::create(closeItem,NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu, 1);
}
3.2.3.在规则层里返回到主界面的回调函数
<pre name="code" class="cpp">void MyRule::Back(Ref* pSender)
{
/*
auto scene = Scene::create();//创建一个自释放的场景对象
scene->addChild(HelloWorld::create());//把创建的画面层添加到场景中
Director::getInstance()->replaceScene(TransitionFlipAngular::create(.5, scene));//运用导演类来进行切换场景 */
Director::getInstance()->popScene();
}
3.3游戏页面
3.3.1.创建游戏主界面的场景
Scene* MyScene::createScene()
{
auto scene = Scene::create();
auto layer = MyScene::create();
scene->addChild(layer);
return scene;
}
3.3.2.对棋盘场景进行初始化
/*
我们的棋盘是6*6的。所以呢就用一个二维数组来标记棋盘上的每一个点的状态。每一个点又有两个属性。一个是value标记该点上是