简单的c++五子棋的代码

无聊的时候写的下程序玩玩。。。。

/

//  FiveGameScene.cpp

//  nnRoom

//

//  Created by ChengC on 2018/2/7.

//

//


#include "FiveGameScene.hpp"


Scene * FiveGameScene::createScene()

{

    auto scene=Scene::create();

    auto layer=FiveGameScene::create();

    scene->addChild(layer);

    return scene;

}


bool FiveGameScene::init()

{

    if(!Layer::init())

    {

        return false;

    }

    m_isOver = false;

    

    m_playerType = PLAYER_TYPE_ONE;

    

    // 初始数据

    for (int r = 1; r < ROW ; ++r) {

        for (int c = 1; c < COL ; ++c) {

            

            m_map[r][c] = NULL;

            

        }

    }

    

    // 创建格子


    DrawNode* _drawNode = DrawNode::create();

    this->addChild(_drawNode);

    

    _drawNode ->drawDot(Vec2(0,50), 0, Color4F::RED);


    

    //

    for (int r = 0; r < ROW; ++r) {

        

        _drawNode->drawLine(ccp(0,r*80), ccp(COL*80, r*80),Color4F::RED);

       

    }

    

    for (int c = 0; c < COL; ++c) {

        

        _drawNode->drawLine(ccp(c*80,0), ccp( c*80,COL*80),Color4F::RED);

        

    }

    

    // 添加事件

    auto listener=EventListenerTouchOneByOne::create();

    listener->onTouchBegan=CC_CALLBACK_2(FiveGameScene::onTouchBegan,this);

    listener->onTouchMoved=CC_CALLBACK_2(FiveGameScene::onTouchMoved,this);

    listener->onTouchEnded=CC_CALLBACK_2(FiveGameScene::onTouchEnded,this);

    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    

    

    return true;

}


bool FiveGameScene::onTouchBegan(Touch *touch, Event *unused_event)

{

    startX=touch->getLocation().x;

    startY=touch->getLocation().y;

    if (m_isOver) {

        return false;

    }

    

    return true;

}


void FiveGameScene::onTouchMoved(Touch *touch, Event *unused_event)

{

    return;

}


void FiveGameScene::onTouchEnded(Touch *touch, Event *unused_event)

{


    int nowrow=startY/80;

    int nowcol=startX/80;

    

    if (nowrow < 0 || nowcol < 0  || nowcol >= COL || nowrow >= ROW) {

        return;

    }

    

    CCLOG("row=%d,col=%d",nowrow,nowcol);

    // 进行落子

    this->MoveInChess(nowrow,nowcol);

    

    

    

    return;

}


bool FiveGameScene::checkPlayerWin(int r,int c)

{

    int chess = m_map[r][c]->number;

    int sumnum = 0;

    

    // r检测

    for (int i = r + 1; i < ROW; ++i) {

        

        if (m_map[i][c] && chess == m_map[i][c]->number ) {

            sumnum++;

        }else

        {

            break;

        }

        

    }

    

    for (int i = r - 1; i >= 0; --i) {

        

        if (m_map[i][c] && chess == m_map[i][c]->number ) {

            sumnum++;

        }else

        {

            break;

        }

        

    }

    

    if (sumnum>=4) {

        

        return true;

    }

    

    sumnum = 0;

    

    // c检测

    for (int i = c + 1; i < ROW; ++i) {

        

        if (m_map[r][i] && chess == m_map[r][i]->number ) {

            sumnum++;

        }else

        {

            break;

        }

        

    }

    

    for (int i = c - 1; i >= 0; --i) {

        

        if (m_map[r][i] && chess == m_map[r][i]->number ) {

            sumnum++;

        }else

        {

            break;

        }

        

    }

    

    if (sumnum>=4) {

        

        return true;

    }

    

    // 对角检测1

    sumnum = 0;

    

    for (int i = r + 1,j = c - 1; i < ROW && j >= 0; ++i,--j) {

        if (m_map[i][j] && chess == m_map[i][j]->number ) {

            sumnum++;

        }else

        {

            break;

        }

    }

    

    for (int i = r - 1,j = c + 1; i >= 0 && j < COL; --i,++j) {

        if (m_map[i][j] && chess == m_map[i][j]->number ) {

            sumnum++;

        }else

        {

            break;

        }

    }

    

    if (sumnum>=4) {

        

        return true;

    }

    

    // 对角检测2

    sumnum = 0;

    

    for (int i = r + 1,j = c + 1; i < ROW && j < COL; ++i,++j) {

        if (m_map[i][j] && chess == m_map[i][j]->number ) {

            sumnum++;

        }else

        {

            break;

        }

    }

    

    for (int i = r - 1,j = c - 1; i >= 0 && j >= 0; --i,--j) {

        if (m_map[i][j] && chess == m_map[i][j]->number ) {

            sumnum++;

        }else

        {

            break;

        }

    }

    

    if (sumnum>=4) {

        

        return true;

    }

    

    return false;

}


void FiveGameScene::MoveInChess(int r,int c)

{

    // 点击的格子存在棋子

    if ( m_map[r][c] ) {

        return;

    }

    

    // 进行落子

    m_map[r][c] = FiveChess::createFiveChess(m_playerType,r,c);

    this->addChild(m_map[r][c]);

    

    // 判断当前玩家是否胜利

    bool isWin = this->checkPlayerWin(r,c);

    

    if (isWin) {

        this->showWinLayer();

        CCLOG("玩家%d获得胜利",m_playerType);

    }

    

    

    // 角色转换

    m_playerType = PLAYER_TYPE_MAX - m_playerType;

}


void FiveGameScene::showWinLayer()

{

    m_isOver = true;

    

    auto lab = Label::createWithSystemFont(m_playerType == 1 ? "玩家一胜利" : "玩家二胜利","", 35);

    this->addChild(lab,360);

    lab->setPosition(640,360);

    

    auto call = cocos2d::CallFunc::create([=]

  {

      // 清空棋盘

      for(int r = 0 ;r < ROW ;++r)

      {

          for (int c= 0; c < COL; ++c) {

              if (m_map[r][c]) {

                  m_map[r][c]->removeFromParent();

                  m_map[r][c] = NULL;

              }

          }

      }

      

      m_isOver = false;

      lab->removeFromParent();

  });

    

    lab->runAction( Sequence::create(DelayTime::create(3),call, NULL) );

}




猜你喜欢

转载自blog.csdn.net/erweimac/article/details/79805874
今日推荐