welcome to my chinese chess on line
project name: chinese chess
project role: leader and main developer
project technique: vs 2005 ,c++,p2p,MFC
project introduction: this project uses p2p
technique ,two persons can connect to each other to play chess .They can not only play but also talk on line .
project core code:
//////chessman.h
#ifndef CHESSMAN_H_
#define CHESSMAN_H_
#include "resource.h"
#include "stdafx.h"
#include "paper.h"
//#include "chessmap.h"
enum {A_LEFT_SOLDIER=1,A_MID_LEFT_SOLDIER,A_MID_SOLDIER,A_MID_RIGHT_SOLDIER,A_RIGHT_SOLDIER,A_LEFT_CANNON,
A_RIGHT_CANNON,A_LEFT_CAR,A_RIGHT_CAR,A_LEFT_HORSE,A_RIGHT_HORSE,A_LEFT_XIANG,A_RIGHT_XIANG,A_LEFT_GUARD,
A_RIGHT_GUARD,A_HEAD,B_LEFT_SOLIDER,B_MID_LEFT_SOLIDER,B_MID_SOLDIER,B_MID_RIGHT_SOLDIER,B_RIGHT_SOLDIER,
B_LEFT_CANNON,B_RIGHT_CANNON,B_LEFT_CAR,B_RIGHT_CAR,B_LEFT_HORSE,B_RIGHT_HORSE,B_LEFT_XIANG,B_RIGHT_XIANG,
B_LEFT_GUARD,B_RIGHT_GUARD,B_HEAD};
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class CChessMan
{
public:
CChessMan(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY);
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY);
void ResetPos(POINT newPos);//重新设置棋子的物理位置
void ResetPos(int ni,int nj);//重新设置棋子的逻辑位置
void DPTOLP();//物理位置向逻辑位置的转换
void LPTODP();//;逻辑位置向物理位置的转换
void Draw(CDC *pDC);//显示棋子
void ShowIAmHere(CDC *pDC);
bool IfThisPosMe(POINT thisPos);////判断鼠标点击的当前位置是不是棋子所在位置
//virtual bool NextStep(POINT nextPos,CDC *pDC,CChessMap*chessMap)=0;//下一步的发展情况
void InvalidateMyRect(CDC *pDC);//重新绘制自己的区域,是小范围的 防止发生闪烁的情况
void InvalidateMyRect(CDC *pDC,UINT uRow,UINT uCol);
//void GetRect(CRect &rect);//得到位图的rect
bool NextStep(CChessMan*nextChessMan,int nNewRow,int nNewCol);//下一步的发展情况
virtual bool IfNextPosLegal(POINT nextPos)=0;
public:
static int m_stcChosenID;
UINT m_uRoleID;//棋子的角色
UINT m_BTIDD;//位图ID
POINT m_ptNowPos;//棋子位置,指棋子中心点在棋盘上的位置
UINT uRow,uCol;//指棋子的逻辑位置
int m_nEachX,m_nEachY;//将棋子的物理坐标位置转化成逻辑坐标位置的单位
int m_nChessPaperBeginX,m_nChessPaperBeginY;//记录棋纸的左上角的位置
CBitmap m_btMapRole;//位图
BITMAP m_btBM;//记录位图的长宽
};
/////下面是兵
class CSoldier:public CChessMan
{
public:
CSoldier(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, initPos, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, iIndex, jIndex, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
//bool NextStep(POINT nextPos,CDC *pDC,CChessMap*chessMap);
//bool NextStep(CChessMan*nextChessMan,int nNewRow,int nNewCol);
bool IfNextPosLegal(POINT nextPos);
};
/////下面是马
class CHorse:public CChessMan
{
public:
CHorse(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, initPos, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, iIndex, jIndex, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos);
};
////下面是炮
class CCannon:public CChessMan
{
public:
CCannon(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, initPos, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, iIndex, jIndex, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos);
};
///下面是将
class CHead:public CChessMan
{
public:
CHead(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, initPos, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, iIndex, jIndex, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos);
};
////下面是车
class CVehicle:public CChessMan
{
public:
CVehicle(){}
void Create(UINT roleID,UINT nID,POINT CenterPos,int eachX,int eachY,int ChessPaperBeginX,int ChessPaperBeginY){CChessMan::Create(roleID,nID,CenterPos,eachX,eachY,ChessPaperBeginX,ChessPaperBeginY);};
void Create (UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int ChessPaperBeginX,int ChessPaperBeginY){CChessMan::Create(roleID,nID,iIndex,jIndex,eachX,eachY,ChessPaperBeginX,ChessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos); //判断下一步的目标地是否是有效位置
};
class COfficial:public CChessMan
{
public:
COfficial(){}
void Create(UINT roleID,UINT nID,POINT CenterPos,int eachX,int eachY,int ChessPaperBeginX,int ChessPaperBeginY){CChessMan::Create(roleID,nID,CenterPos,eachX,eachY,ChessPaperBeginX,ChessPaperBeginY);};
void Create (UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int ChessPaperBeginX,int ChessPaperBeginY){CChessMan::Create(roleID,nID,iIndex,jIndex,eachX,eachY,ChessPaperBeginX,ChessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos);
};
class CXiang:public CChessMan
{
public:
CXiang(){};
void Create(UINT roleID,UINT nID,POINT initPos,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, initPos, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
void Create(UINT roleID,UINT nID,int iIndex,int jIndex,int eachX,int eachY,int chessPaperBeginX,int chessPaperBeginY){CChessMan::Create(roleID,nID, iIndex, jIndex, eachX, eachY, chessPaperBeginX, chessPaperBeginY);};
bool IfNextPosLegal(POINT nextPos);
};
#endif
//////chessmap.h
#ifndef CHESSMAP_H_
#define CHESSMAP_H_
#include "stdafx.h"
#include "windows.h"
#include "chessman.h"
#include "paper.h"
////这个对象里存的是整张棋盘上每个点对应的棋子的情况, //////////////分为有棋子,没有棋子,有棋子的时候存的是棋子的指针,没有棋子的时候存的是空指针
class CChessMap
{
public:
CChessMap(){};
void Create(CChessMan *initChessState[][9],int nRow,int nCol);
void ResetStatePos(int i,int j,CChessMan* thisChess);
CChessMan *FindStatePos(POINT thisPos,int &nPosX,int &nPosY);
CChessMan *FindStatePos(int i,int j);
void ShowCurrentRole(int i,int j,CDC *pDC);
void Draw(CDC *pDC);
bool IfManInMidOfHead(int row,int col);
bool IfHeadCanGo(CChessMan *pOldChess,POINT nextPos,int nFlag);
bool IfHeadSafe(CChessMan *pChess,UINT uNextRow,UINT uNextCol);
void Clear();
void Show();
~CChessMap();
public:
int m_nSteps;
int m_nRow,m_nCol;
CChessMan *TheStateOfAllChess[10][9];
};
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#endif