无聊的时候写的下程序玩玩。。。。
/
// 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) );
}