实例介绍
【实例简介】
c 开发的简易中国象棋,资源中包含完整工程,代码有非常详细的注释,易于理解。
【实例截图】
【核心代码】
#include<iostream>
#include"MouseClickControl.h"
#include"InitializeControl.h"
#include"../common/Common.h"
#include"../service/TransForm.h"
#include"../service/SpriteFactory.h"
#include"../service/SpriteFunction.h"
using namespace std;
//初始化成员指针
MouseClickControl*MouseClickControl::clickControl=0;
//获取成员指针
MouseClickControl* MouseClickControl::getClickControl()
{
if(clickControl==0)
{
clickControl=new MouseClickControl;//如果没有实例化,则实例化成员指针
}
return clickControl;
}
MouseClickControl::MouseClickControl(const MouseClickControl& mControl){}//拷贝构造函数
MouseClickControl::MouseClickControl(){}
/**
识别鼠标点击类型0,点击空白处,1,点击棋子,2点击棋盘外,(在2状态下可以判断是无效点击,还是点击按钮)
*/
int MouseClickControl::recognizeClick(float fMouseX,float fMouseY)
{
SPriteFunction spriteFunction;
//如果点击棋盘内
if(spriteFunction.isClickInChessBoard(fMouseX,fMouseY))
{
Point point(fMouseX,fMouseY);
TransForm transForm;
//点击处存在棋子
//将鼠标点击坐标转换成棋盘坐标
if(spriteFunction.isPointExistsChess(transForm.mousePointToChessBoardPoint(point)))return 1;
else return 0;
}
return 2;
}
/**
接受鼠标点击事件,进行处理
*/
void MouseClickControl::receiveClick(float x,float y)
{
SPriteFunction spriteFunction;
//接收鼠标点击类型
int clickType=recognizeClick(x,y);
TransForm transForm;
Point tempPoint(x,y);
//鼠标坐标转换成棋盘坐标
Point chessBoardPoint=transForm.mousePointToChessBoardPoint(tempPoint);
switch(clickType)
{
case 0://0表示点击空白处
{
if(Common::getCommon()->whoWin!=-1)return;//游戏需要继续进行,如果已经分出胜负,则不能操作棋子,只能点击重新开始按钮,或者点击悔棋
if(spriteFunction.hasChessSelected())//有选中的棋子
{
//找到被选中的棋子
Chess *chess=spriteFunction.findSelectedChess();
//当前点击的点符合走棋规则,并且没有障碍棋子,可以移动
if(chess->isChessMove(chessBoardPoint)&&chess->isMobeToPointInObstacles(chessBoardPoint)==0)
{
//移动棋子
chess->moveChess(chessBoardPoint);
//当前是红方走完棋
if(Common::getCommon()->redMove>0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==0)
{ //提示黑方方走棋
Common::getCommon()->noteArray[1][0]->SetSpriteVisible(true);
Common::getCommon()->noteArray[0][0]->SetSpriteVisible(false);
//设置接下来黑方走棋
Common::getCommon()->redMove=-1;
//选择框移动到走动的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[7][7].getPointX(),Common::getCommon()->chessBoardPointArray[7][7].getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[7][7].getPointX(),Common::getCommon()->chessBoardPointArray[7][7].getPointY());
}
//当前黑方走完棋
else if(Common::getCommon()->redMove<0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==1)
{
//提示红方走棋
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[2][1].getPointX(),Common::getCommon()->chessBoardPointArray[2][1].getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[2][1].getPointX(),Common::getCommon()->chessBoardPointArray[2][1].getPointY());
//设置接下来红方走棋
Common::getCommon()->redMove=1;
//选择框移动到走动的棋子上
Common::getCommon()->noteArray[0][0]->SetSpriteVisible(true);
Common::getCommon()->noteArray[1][0]->SetSpriteVisible(false);
}
}
else//点击的点不符合棋子走棋规则
{
//选择框0停留在选中的棋子上,选择框1停留在鼠标点击处
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
break;
}
else//没有选中的棋子,选择框停留在鼠标点击处
{
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
break;
}
}
case 1://1表示点击棋子
{
if(Common::getCommon()->whoWin!=-1)return;//游戏需要继续进行,如果已经分出胜负,则不能操作棋子,只能点击重新开始按钮,或者点击悔棋
if(spriteFunction.hasChessSelected())//有选中的棋子
{
//获取选中的棋子
Chess *chess=spriteFunction.findSelectedChess();
//当前点击的点符合走棋规则,并且障碍棋子(敌方)在点击处,可以吃掉
if(chess->isChessMove(chessBoardPoint)&&chess->isMobeToPointInObstacles(chessBoardPoint)==2)
{
//吃掉棋子
chess->eat(spriteFunction.findChessByPoint(chessBoardPoint));
//红棋吃棋,则红旗锁住自己,同时打开了黑棋的锁
if(Common::getCommon()->redMove>0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==0)
{
//接下来黑棋走
Common::getCommon()->redMove=-1;
//提示黑棋走棋
Common::getCommon()->noteArray[1][0]->SetSpriteVisible(true);
Common::getCommon()->noteArray[0][0]->SetSpriteVisible(false);
//选择框移动到走动的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[7][7].getPointX(),Common::getCommon()->chessBoardPointArray[7][7].getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[7][7].getPointX(),Common::getCommon()->chessBoardPointArray[7][7].getPointY());
}
//黑棋吃棋,则打开红旗的锁,让自己锁住
else if(Common::getCommon()->redMove<0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==1)
{
//接下来红棋走棋
Common::getCommon()->redMove=1;
//提示红旗走棋
Common::getCommon()->noteArray[0][0]->SetSpriteVisible(true);
Common::getCommon()->noteArray[1][0]->SetSpriteVisible(false);
//选择框移动到走动的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[2][1].getPointX(),Common::getCommon()->chessBoardPointArray[2][1].getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(Common::getCommon()->chessBoardPointArray[2][1].getPointX(),Common::getCommon()->chessBoardPointArray[2][1].getPointY());
}
// Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
else//点击的棋子不符合吃棋规则
{
//将当前选中的棋子置为未选中
chess->setChessState(1);
//当前是轮到红棋走棋,则只能选中红棋,不能选中黑棋
if(Common::getCommon()->redMove>0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==0)
{
//选中鼠标点击处的红方棋子
spriteFunction.selectChess(chessBoardPoint);
//选择框移动到选中的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
//当前是轮到黑棋走棋,则只能选中黑棋,不能选中红棋
else if(Common::getCommon()->redMove<0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==1)
{
//选中鼠标点击处的黑方棋子
spriteFunction.selectChess(chessBoardPoint);
//选择框移动到选中的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
}
break;
}
else//没有选中的棋子
{
//轮到红方走棋,则选中红棋,黑棋不能被选中
if(Common::getCommon()->redMove>0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==0)
{
//选中鼠标点击处的红方棋子
spriteFunction.selectChess(chessBoardPoint);
//选择框移动到选中的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
//轮到黑方走棋,则选中黑棋,红棋不能被选中,
else if(Common::getCommon()->redMove<0&&spriteFunction.findChessByPoint(chessBoardPoint)->getCamp()==1)
{
//选中鼠标点击处的黑方棋子
spriteFunction.selectChess(chessBoardPoint);
//选择框移动到选中的棋子上
Common::getCommon()->chessFrameArray[0]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
Common::getCommon()->chessFrameArray[1]->SetSpritePosition(chessBoardPoint.getPointX(),chessBoardPoint.getPointY());
}
break;
}
break;
}
case 2://2表示点击按钮
{
InitializeControl iControl;
//判断点击的是哪个按钮
int whichButtonClicked=spriteFunction.whichButtonClicked(tempPoint);
if(whichButtonClicked==-1)return;
switch(whichButtonClicked)
{
case 0://0 表示点击重新开始按钮
{
//初始化
iControl.initial();
break;
}
case 1://,1表示点击保存按钮
{
break;
}
case 2://2表示点击打开按钮
{
break;
}
case 3://3表示点击悔棋按钮
{
//当前没有走棋,不能悔棋
if(Common::getCommon()->walkRecordPos<=0)return;
//悔棋
regret();
break;
}
}
break;
}
}
}
/**
判断游戏状态,-1,游戏继续,0,红方赢,1,黑方赢
*/
int MouseClickControl::whoWin()
{
if(Common::getCommon()->chessArray[4][0]->getChessState()==3)//红方帅被吃掉,黑方赢
{
Common::getCommon()->whoWin=1;
//提示黑方赢
Common::getCommon()->noteArray[0][0]->SetSpriteVisible(false);
Common::getCommon()->noteArray[3][0]->SetSpriteVisible(true);
return 1;
}
else if(Common::getCommon()->chessArray[11][0]->getChessState()==3)//黑方帅被吃掉,红方赢
{
Common::getCommon()->whoWin=0;
//提示红方赢
Common::getCommon()->noteArray[1][0]->SetSpriteVisible(false);
Common::getCommon()->noteArray[2][0]->SetSpriteVisible(true);
return 0;
}
return -1;
}
/**
处理悔棋操作
*/
void MouseClickControl::regret()
{
Common* common=Common::getCommon();
if(common->redMove==1)//当前轮到红方走棋,说明悔棋的黑方
{
common->noteArray[5][0]->SetSpriteVisible(true);//提示悔棋
common->noteArray[5][0]->SetSpritePosition(common->notePointArray[0].getPointX(),common->notePointArray[0].getPointY());
common->noteArray[5][0]->SetSpriteLinearVelocity(35,38);//从黑方左下角开始移动
}
else if(common->redMove==-1)//当前轮到黑方走棋,说明悔棋的是红方
{
common->noteArray[5][0]->SetSpriteVisible(true);//提示悔棋
common->noteArray[5][0]->SetSpritePosition(common->notePointArray[6].getPointX(),common->notePointArray[6].getPointY());
common->noteArray[5][0]->SetSpriteLinearVelocity(35,-38);//从红方左上角开始移动
}
//获取移动的棋子
Chess* moveChess=common->walkRecord[common->walkRecordPos-1].first;
//获取被吃掉的棋子(如果是空白,说明是移动步骤,或者是吃棋步骤)
Chess* diedChess=common->walkRecord[common->walkRecordPos-1].second;
//获取棋子阵营
int camp=moveChess->getCamp();
//红方悔棋,提示红方走棋,redMove设置为1,使得当前轮到红方走棋
if(camp==0)
{
common->redMove=1;//设置红方能走棋
common->noteArray[0][0]->SetSpriteVisible(true);//设置红方走棋提示精灵可见
common->noteArray[1][0]->SetSpriteVisible(false);//设置黑方走棋提示精灵不可见
}
//黑方悔棋,提示黑方走棋,redMove设置为1,使得当前轮到黑方走棋
else if(camp==1)
{
common->redMove=-1;//设置黑方能走棋
common->noteArray[1][0]->SetSpriteVisible(true);//设置黑方走棋提示精灵可见
common->noteArray[0][0]->SetSpriteVisible(false);//设置红方走棋提示精灵不可见
}
common->whoWin=-1;//悔棋后,设置游戏继续
common->walkRecordPos--;//悔棋后,游戏行走步数减一
//设置棋子当前的位置为初始位置
moveChess->setCurrentPoint(*common->recordMovePoint[common->walkRecordPos]);
//设置棋子初始的位置为移动前的当前位置
moveChess->setInitPoint(common->recordMovePoint[common->walkRecordPos-1]);
float x=moveChess->getCurrentPoint().getPointX();
float y=moveChess->getCurrentPoint().getPointY();
//设置棋子精灵位置
moveChess->SetSpritePosition(x,y);
//设置被吃掉的棋子状态为正常(如果是吃棋操作,则diedChess的状态为3,如果是移动操作,diedChess就是moveChess)
diedChess->setChessState(1);
//设置被吃掉的棋子可见
diedChess->SetSpriteVisible(true);
//设置红方胜利提示精灵不可见
common->noteArray[2][0]->SetSpriteVisible(false);
//设置黑方胜利提示精灵不可见
common->noteArray[3][0]->SetSpriteVisible(false);
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论