小兵围大炮||大兵小将【C++】

做这个游戏的时候,我大二,那时还不会用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标记该点上是
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值