html2048游戏算法逻辑,2048游戏逻辑实现

#include "HelloWorldScene.h"

#include "cocostudio/CocoStudio.h"

#include "ui/CocosGUI.h"

#include "CardSprite.h"

#include

#include "test.h"

USING_NS_CC;

#define  RWO 4

#define  LIE 4

using namespace cocostudio::timeline;

Scene* HelloWorld::createScene()

{

auto ui = test::create();

// '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;

}

// on "init" you need to initialize your instance

bool HelloWorld::init()

{

if ( !Layer::init()

)

{

return false;

}

//auto rootNode =

CSLoader::createNode("Scene.csb");

_sorce = 0;

auto layercolor = LayerColor::create(Color4B(100, 90, 100,

255));

addChild(layercolor);

Sprite * sp = Sprite::create();

sp->setTexture("bg.png");

addChild(sp);

sp->setContentSize(Director::getInstance()->getVisibleSize());

sp->setPosition(Director::getInstance()->getVisibleSize().width

/ 2, Director::getInstance()->getVisibleSize().height -

sp->getContentSize().height/6);

cardSpriteInit(Director::getInstance()->getVisibleSize());

randSprite();

randSprite();

auto lisener = EventListenerTouchOneByOne::create();

lisener->onTouchBegan =

CC_CALLBACK_2(HelloWorld::onTouchBegan, this);

lisener->onTouchMoved =

CC_CALLBACK_2(HelloWorld::onTouchMoved, this);

lisener->onTouchEnded =

CC_CALLBACK_2(HelloWorld::onTouchEnded, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(lisener,

this);

auto lisenerKeyBord = EventListenerKeyboard::create();

lisenerKeyBord->onKeyPressed =

CC_CALLBACK_2(HelloWorld::onKeyPressed, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(lisenerKeyBord,

this);

_sorceLable =

LabelTTF::create(__String::createWithFormat("SORCE:%d",

0)->getCString(), "concols", 66);

_sorceLable->setPosition(Point(Director::getInstance()->getVisibleSize().width/2,50));

_sorceLable->setColor(Color3B(255, 23, 140));

addChild(_sorceLable);

LabelTTF * lable =

LabelTTF::create(__String::createWithFormat("you

fail")->getCString(), "concols", 100);

lable->setTag(6);

lable->setColor(Color3B(255, 0, 0));

lable->setPosition(Director::getInstance()->getVisibleSize().width

/ 2, Director::getInstance()->getVisibleSize().height / 2 +

60);

lable->setVisible(false);

addChild(lable);

// auto userItem = MenuItemImage::create(

// "bg.png",

// "bg.png",

// CC_CALLBACK_1(HelloWorld::menueCallback, this));

// addChild(userItem);

//

userItem->setPosition(Point(Director::getInstance()->getVisibleSize().width

/ 2, Director::getInstance()->getVisibleSize().height / 2 + 100)

return true;

}

void HelloWorld::menueCallback(Ref*ref)

{

}

void  HelloWorld::cardSpriteInit(Size

size)

{

for (size_t i = 0; i < RWO; i++)

{

for (size_t j = 0; j < LIE; j++)

{

auto cardsprite = CardSprite::createSprite(0, 155, 155, j *

155 + 20, size.height - 155 - (i * 155));

cardsprite->setRow(i);

cardsprite->setLie(j);

_carSpriteAcrry[i][j] = cardsprite;

addChild(cardsprite);

}

}

}

void HelloWorld::randSprite()

{

bool isFaild = true;

for (size_t i = 0; i < RWO; i++)

{

for (size_t j = 0; j < LIE; j++){

if (_carSpriteAcrry[i][j]->getNum() <= 0){

isFaild = false;

}

}

}

if (isFaild)

return;

int i = rand() % 4;

int j = rand() % 4;

if (_carSpriteAcrry[i][j]->getNum() > 0)

{

randSprite();

}

else

{

_carSpriteAcrry[i][j]->setNum(2,true);

}

}

bool HelloWorld::checkFaile()

{

bool isFaild = true;

for (size_t i = 0; i < RWO; i++)

{

for (size_t j = 0; j < LIE; j++)

{

if (_carSpriteAcrry[i][j]->getNum() <= 0

|| (_carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[max(i + 1)][j]->getNum() && max(i + 1)

!= max(i))

|| (_carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[min(i - 1)][j]->getNum() && min(i - 1)

!= min(i))

|| (_carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[i][max(j + 1)]->getNum() && max(j + 1)

!= max(j))

||( _carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[i][min(j - 1)]->getNum()) && min(j-1) !=

min(j))

{

isFaild = false;

}

}

}

if (isFaild)

{

LabelTTF * lable =

dynamic_cast(this->getChildByTag(6));

lable->setVisible(true);

}

return isFaild;

}

int HelloWorld::min(int num)

{

if (num <0){ num = 0; }

return num;

}

int HelloWorld::max(int num)

{

if (num > 3){ num = 3; }

return num;

}

void HelloWorld::reStartGame()

{

LabelTTF * lable

=dynamic_cast(this->getChildByTag(6));

lable->setVisible(false);

for (size_t i = 0; i < RWO; i++)

{

for (size_t j = 0; j < LIE; j++)

{

_carSpriteAcrry[i][j]->setNum(0);

}

}

}

bool HelloWorld::onTouchBegan(Touch *touch, Event

*unused_event)

{

Vec2 pos =touch->getLocation();

_begainPosX = pos.x;

_begainPosY = pos.y;

return true;

}

void HelloWorld::onTouchMoved(Touch *touch, Event

*unused_event)

{

}

void HelloWorld::onTouchEnded(Touch *touch, Event

*unused_event)

{

Vec2 pos = touch->getLocation();

_endPosX = pos.x - _begainPosX;

_endPosY = pos.y - _begainPosY;

if (abs(_endPosX) > abs(_endPosY)){

if (_endPosX + 5 > 0){

moveRight();

}else{

moveLeft();

}

}

else if (abs(_endPosX) < abs(_endPosY)){

if (_endPosY + 5 > 0){

moveUp();

}else{

moveDw();

}

}

}

void HelloWorld::onKeyPressed(cocos2d::EventKeyboard::KeyCode

keyCode, cocos2d::Event* event)

{

switch (keyCode)

{

case cocos2d::EventKeyboard::KeyCode::KEY_W:

case cocos2d::EventKeyboard::KeyCode::KEY_CAPITAL_W:

case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW:

moveUp();

break;

case cocos2d::EventKeyboard::KeyCode::KEY_S:

case cocos2d::EventKeyboard::KeyCode::KEY_CAPITAL_S:

case cocos2d::EventKeyboard::KeyCode::KEY_DOWN_ARROW:

moveDw();

break;

case cocos2d::EventKeyboard::KeyCode::KEY_A:

case cocos2d::EventKeyboard::KeyCode::KEY_CAPITAL_A:

case cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW:

moveLeft();

break;

case cocos2d::EventKeyboard::KeyCode::KEY_D:

case cocos2d::EventKeyboard::KeyCode::KEY_CAPITAL_D:

case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW:

moveRight();

break;

default:

break;

}

}

void HelloWorld::moveLeft()

{

bool israndom = false;

for (int i = 0; i < 4;i ++)

{

for (int j = 0; j <4; j++)

{

for (int moveJ = j+1; moveJ < 4; moveJ++)

{

if (_carSpriteAcrry[i][moveJ]->getNum() > 0)

{

if (_carSpriteAcrry[i][j]->getNum() <= 0)

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][moveJ]->getNum());

_carSpriteAcrry[i][moveJ]->setNum(0);

j --;

israndom = true;

}

else if (_carSpriteAcrry[i][moveJ]->getNum() ==

_carSpriteAcrry[i][j]->getNum())

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][j]->getNum()

* 2);

_carSpriteAcrry[i][moveJ]->setNum(0);

updateSorce(_carSpriteAcrry[i][j]->getNum());

israndom = true;

}

break;

}

}

}

}

if (israndom){

randSprite();

}

checkFaile();

log("moveLeft");

}

void HelloWorld::moveRight()

{

bool israndom = false;

for (int i = 0; i < 4; i++)

{

for (int j = 3; j >=0; j--)

{

for (int moveJ = j - 1; moveJ >= 0; moveJ--)

{

if (_carSpriteAcrry[i][moveJ]->getNum() > 0)

{

if (_carSpriteAcrry[i][j]->getNum() <= 0)

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][moveJ]->getNum());

_carSpriteAcrry[i][moveJ]->setNum(0);

j++;

israndom = true;

}

else if (_carSpriteAcrry[i][moveJ]->getNum() ==

_carSpriteAcrry[i][j]->getNum())

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][j]->getNum()

* 2);

_carSpriteAcrry[i][moveJ]->setNum(0);

updateSorce(_carSpriteAcrry[i][j]->getNum());

israndom = true;

}

break;

}

}

}

}

if (israndom){

randSprite();

}

checkFaile();

log("moveRight");

}

void HelloWorld::moveUp()

{

bool israndom = false;

for (int j = 0; j < 4; j++)

{

for (int i = 0; i <4; i++)

{

for (int moveI = i+1; moveI < 4; moveI ++)

{

if (_carSpriteAcrry[moveI][j]->getNum() > 0)

{

if (_carSpriteAcrry[i][j]->getNum() <= 0)

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[moveI][j]->getNum());

_carSpriteAcrry[moveI][j]->setNum(0);

i --;

israndom = true;

}

else if (_carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[moveI][j]->getNum())

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][j]->getNum()

* 2);

_carSpriteAcrry[moveI][j]->setNum(0);

updateSorce(_carSpriteAcrry[i][j]->getNum());

israndom = true;

}

break;

}

}

}

}

if (israndom){

randSprite();

}

checkFaile();

log("moveUp");

}

void HelloWorld::moveDw()

{

bool israndom = false;

for (int j = 0; j < 4; j++)

{

for (int i = 3; i >=0; i --)

{

for (int moveI = i - 1; moveI >= 0; moveI--)

{

if (_carSpriteAcrry[moveI][j]->getNum() > 0)

{

if (_carSpriteAcrry[i][j]->getNum() <=0)

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[moveI][j]->getNum());

_carSpriteAcrry[moveI][j]->setNum(0);

i++;

israndom = true;

}

else if (_carSpriteAcrry[i][j]->getNum() ==

_carSpriteAcrry[moveI][j]->getNum())

{

_carSpriteAcrry[i][j]->setNum(_carSpriteAcrry[i][j]->getNum()

* 2);

_carSpriteAcrry[moveI][j]->setNum(0);

updateSorce(_carSpriteAcrry[i][j]->getNum());

israndom = true;

}

break;

}

}

}

}

if (israndom){

randSprite();

}

checkFaile();

log("moveDw");

}

void HelloWorld::updateSorce(int sorce)

{

_sorce += sorce;

_sorceLable->setString(__String::createWithFormat("SORCE:%d",

_sorce)->getCString());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值