基本信息
源码名称:FunCode平台下中国象棋游戏
源码大小:26.98M
文件格式:.zip
开发语言:C/C++
更新时间:2016-04-01
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

        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);
}