📄 brewgame.cpp
字号:
case GAME_STATE_MENU:
switch(wParam){
case IDC_GAMEHELP:
ProcessHelp();
break;
case IDC_PLAYERINFO:
m_nGameState=GAME_STATE_PLAYERINFO;
// userItem = m_pUList->userNext;
// m_pUList->userNext = NULL;
m_pDlg = new CUserInfoDlg(m_pUList);
if(m_pDlg){
m_pDlg->setFrame2(this);
}
// m_pUList->userNext = userItem;
break;
case IDC_GAMEQUIT://退出棋局
if(m_nGameState==GAME_STATE_PLAY)
m_nPreGameState=GAME_STATE_PLAY;
if(m_nGameState==GAME_STATE_SELSTART)
m_nPreGameState=GAME_STATE_SELSTART;
if(m_nGameState==GAME_STATE_WAIT)
m_nPreGameState=GAME_STATE_WAIT;
IMENUCTL_SetActive(m_pMenu,FALSE);
m_nGameState=m_nPreGameState;
showMsg(GAME_STATE_QUITGAME,0,8,MESSAGE_WARNING_COLOR,0,MESSAGE_TEXT_CENTER|MESSAGE_YES|MESSAGE_CANCEL);
break;
case IDC_GAMEOVER://退出游戏
if(m_nGameState==GAME_STATE_PLAY)
m_nPreGameState=GAME_STATE_PLAY;
if(m_nGameState==GAME_STATE_SELSTART)
m_nPreGameState=GAME_STATE_SELSTART;
if(m_nGameState==GAME_STATE_WAIT)
m_nPreGameState=GAME_STATE_WAIT;
IMENUCTL_SetActive(m_pMenu,FALSE);
m_nGameState=m_nPreGameState;
showMsg(GAME_STATE_EXITGAME,0,9,MESSAGE_WARNING_COLOR,0,MESSAGE_TEXT_CENTER|MESSAGE_YES|MESSAGE_CANCEL);
break;
case IDC_QUITMENU:
m_nGameState = m_nPreGameState;
break;
}
break;
default:
break;
}
///////////////////////////////////////////////////////
break;
case EVT_USER:
switch (wParam){
case SWITCH_INTO:
frame->setCanvas(m_pIGameCanvas);
m_nGameRunFlag = TRUE;
/*===================================*/
m_nGameState=GAME_STATE_NONE; //进入游戏的初始状态
break;
default:
break;
}
break;
default:
break;
}
}
boolean CBrewGame::InitData()
{
AEEBitmapInfo ImageInfo;
NativeColor color;
UINT16 x,y,i;
if(m_pIGameCanvas==NULL){
m_pIGameCanvas = CreateGameCanvas();
if (m_pIGameCanvas != NULL)
m_pIGameCanvas->setFrame(this);
}
m_pIMWriter=CreateMessageWriter();
if(m_pIMWriter==NULL)
return FALSE;
m_pBoard=(ChessBoard*)MALLOC(sizeof(ChessBoard));
if(m_pBoard==NULL)
return FALSE;
m_pBoard->m_nChessBoardSize=GIRDSIZE;
SETAEERECT(&m_pBoard->m_rectBackGround,(m_pIDi->cxScreen-BGWIDTH)/2,(m_pIDi->cyScreen-BGHEIGHT)/2,BGWIDTH,BGHEIGHT);//整个棋盘
SETAEERECT(&m_pBoard->m_rectWrap,m_pBoard->m_rectBackGround.x+6,m_pBoard->m_rectBackGround.y+7,BGWIDTH-13,BGHEIGHT-14);//棋盘里第一个框
SETAEERECT(&m_pBoard->m_rectIn,m_pBoard->m_rectBackGround.x+9,m_pBoard->m_rectBackGround.y+10,BGWIDTH-19,BGHEIGHT-20);//棋盘里第二个框
for(x=0,i=0;x<10;x++){//采集90个交点
for(y=0;y<9;y++){
m_pBoard->m_joinPt[i].x=frame->getScreenOffsetX()+m_pBoard->m_rectIn.x+y*m_pBoard->m_nChessBoardSize;
m_pBoard->m_joinPt[i].y=frame->getScreenOffsetY()+m_pBoard->m_rectIn.y+x*m_pBoard->m_nChessBoardSize;
i++;
}
}
SETAEERECT(&m_pBoard->m_rectMiddle,m_pBoard->m_joinPt[36].x-frame->getScreenOffsetX(),m_pBoard->m_joinPt[36].y-frame->getScreenOffsetY(),m_pBoard->m_rectIn.dx,m_pBoard->m_nChessBoardSize+1);//河界
m_pRiver=ISHELL_LoadResBitmap(m_pIShell,GAMEVV_RES_FILE,IDM_WORD);
if(m_pRiver==NULL)
return FALSE;
IBITMAP_GetInfo(m_pRiver,&ImageInfo,sizeof(AEEBitmapInfo));
m_nPicW=ImageInfo.cx;
m_nPicH=ImageInfo.cy;
color = IBITMAP_RGBToNative(m_pRiver, MAKE_RGB(255,0,255));
IBITMAP_SetTransparencyColor(m_pRiver, color);
m_pImage=ISHELL_LoadResBitmap(m_pIShell,GAMEVV_RES_FILE,IDM_TOTALGRID);
if(m_pImage==NULL)
return FALSE;
color = IBITMAP_RGBToNative(m_pImage, MAKE_RGB(255,0,255));
IBITMAP_SetTransparencyColor(m_pImage, color);
m_pHand=ISHELL_LoadResBitmap(m_pIShell,GAMEVV_RES_FILE,IDM_HAND);
if(m_pHand==NULL)
return FALSE;
IBITMAP_GetInfo(m_pHand,&ImageInfo,sizeof(AEEBitmapInfo));
m_handcx=ImageInfo.cx;
m_handcy=ImageInfo.cy;
color = IBITMAP_RGBToNative(m_pHand, MAKE_RGB(255,0,255));
IBITMAP_SetTransparencyColor(m_pHand, color);
m_HandPos.x=m_pBoard->m_joinPt[48].x;
m_HandPos.y=m_pBoard->m_joinPt[48].y;
m_pGeneral=ISHELL_LoadResBitmap(m_pIShell,GAMEVV_RES_FILE,IDM_GENERAL);//将
if(m_pGeneral==NULL)
return FALSE;
color = IBITMAP_RGBToNative(m_pGeneral, MAKE_RGB(255,0,255));
IBITMAP_SetTransparencyColor(m_pGeneral, color);
IBITMAP_GetInfo(m_pGeneral,&ImageInfo,sizeof(AEEBitmapInfo));
cx=ImageInfo.cx;
cy=ImageInfo.cy;
m_GeneralPos.x=frame->getScreenOffsetX()+(m_pIDi->cxScreen-cx)/2;
m_GeneralPos.y=frame->getScreenOffsetY()+(m_pIDi->cyScreen-cy)/2;
m_pChess=ISHELL_LoadResBitmap(m_pIShell,GAMEVV_RES_FILE,IDM_CHESS);
if(m_pChess==NULL)
return FALSE;
color = IBITMAP_RGBToNative(m_pChess, MAKE_RGB(255,0,255));
IBITMAP_SetTransparencyColor(m_pChess, color);
if (ISHELL_CreateInstance(m_pIShell, AEECLSID_ICONVIEWCTL, (void **)&m_pMainMenuCtl))
return FALSE;
SETAEERECT( &m_rRect, 0, frame->getScreenOffsetY()+m_pIDi->cyScreen-MAINMENUHEIGHT,frame->getScreenOffsetX()+m_pIDi->cxScreen,MAINMENUHEIGHT);
if (ISHELL_CreateInstance(m_pIShell, AEECLSID_MENUCTL, (void **)&m_pMenu))
return FALSE;
SETAEERECT( &m_rMenuRect, frame->getScreenOffsetX()+(m_pIDi->cxScreen-MENUWIDTH)/2, frame->getScreenOffsetY()+m_pIDi->cyScreen-MAINMENUHEIGHT-MENUHEIGHT,MENUWIDTH,MENUHEIGHT);
return TRUE;
}
void CBrewGame::ProcessMFC_M_INDmsg(IMessageReader *mReader){
INT8 *TypeName=NULL;
INT8 *IDName=NULL;
INT8 *pBuffer=NULL;
INT8 temp8;
int i=0,j=0,nPos,nlength,nStrLen,temp;
nlength=mReader->getFieldLength(0);
pBuffer=(INT8*)MALLOC(nlength*sizeof(INT8));
if(pBuffer)
MEMSET(pBuffer, '\0', nlength); //清0
mReader->getBuffer(0,pBuffer, (UINT16*)&nlength);
switch(pBuffer[0]){
case 0://主动查询结果
break;
case 3://房间固定谱
break;
case 5://桌固定谱
break;
case 6://随机谱
break;
default:
break;
}
m_pChessMap.m_cType=pBuffer[1];
m_pChessMap.m_cTurn=pBuffer[6];
m_pChessMap.m_cWiner=pBuffer[7];
m_pChessMap.m_cLevel=pBuffer[8];
m_pChessMap.m_cScoreRule[0]=pBuffer[13];
m_pChessMap.m_cScoreRule[2]=pBuffer[15];
temp8=pBuffer[14];
if(temp8>=16){
m_pChessMap.m_cScoreRule[1]=-(INT8)(temp8&0x0F);//屏蔽前4位
}
else{
m_pChessMap.m_cScoreRule[1]=(INT8)(temp8&0x0F);
}
nStrLen=pBuffer[16];//棋谱类型名称
TypeName=(INT8*)MALLOC(nStrLen*sizeof(INT8));
MEMCPY(TypeName,&pBuffer[17],nStrLen);
MEMSET(m_psTypeName, '\0', sizeof(m_psTypeName));//清0
while(TypeName[i]){
temp=*(UINT16*)&TypeName[i];
temp=NTOHS(temp);
m_psTypeName[j]=temp;
i+=2;
j++;
}
i=j=0;//棋谱名称
nPos=16+nStrLen+1;
nStrLen=pBuffer[nPos];
IDName=(INT8*)MALLOC(nStrLen*sizeof(INT8));
MEMCPY(IDName,&pBuffer[nPos+1],nStrLen);
MEMSET(m_psIDName, '\0', sizeof(m_psIDName));//清0
while(IDName[i]){
temp=*(UINT16 *)&IDName[i];
temp=NTOHS(temp);
m_psIDName[j]=temp;
i+=2;
j++;
}
i=j=0;//棋谱故事
nPos=nPos+1+nStrLen;
nStrLen=pBuffer[nPos];
nPos=nPos+1+nStrLen;//棋子布局
nStrLen=pBuffer[nPos];
MEMSET(m_psLayout, '\0', sizeof(m_psLayout));//清0
MEMCPY(m_psLayout,&pBuffer[nPos+1],nStrLen);//7-15
FREE(TypeName);
FREE(IDName);
FREE(pBuffer);
return;
}
void CBrewGame::ProcessMFC_TIME_INDmsg(IMessageReader *mReader){
UINT16 Len,i;
INT8* pBuffer=NULL;
Len=mReader->getFieldLength(0);
pBuffer=(INT8*)MALLOC(Len*sizeof(INT8));
if(pBuffer)
MEMSET(pBuffer, '\0', Len);
mReader->getBuffer(0,pBuffer,&Len);
m_sChessState.m_stateID[0]=pBuffer[0];
m_sChessState.m_stateID[1]=pBuffer[1];
m_sChessState.m_turn=pBuffer[2];
m_sChessState.m_redUseTime[0]=pBuffer[3];
m_sChessState.m_redUseTime[1]=pBuffer[4];
m_sChessState.m_blackUseTime[0]=pBuffer[5];
m_sChessState.m_blackUseTime[1]=pBuffer[6];
m_sChessState.m_turnClock=(pBuffer[7]<<8)+(pBuffer[8]&255);
DBGPRINTF("m_sChessState.m_turnClock=%d",m_sChessState.m_turnClock);
m_sChessState.m_ChessState=pBuffer[9];
if((m_sChessState.m_ChessState==1)||(m_sChessState.m_ChessState==5))//走子\将军状态7-17
for(i=0;i<4;i++){
m_sChessState.m_ChessGo[i]=0;
m_sChessState.m_ChessGo[i]=pBuffer[10+i];
}
Len=mReader->getFieldLength(1);
MEMSET(m_ChessMapField, '\0', 96);
mReader->getBuffer(1,m_ChessMapField,&Len);
FREE(pBuffer);
m_bProcessedTIMEIND=TRUE;
return;
}
void CBrewGame::ProcessMFC_ROUNDEND_INDmsg(IMessageReader *mReader)
{
INT32 temp;
mReader->getInt8(0,&m_sRoundOver.m_result);
mReader->getInt32(1,&temp);
temp=NTOHL(temp);
m_sRoundOver.m_RedMoneyChange=temp;
mReader->getInt32(2,&temp);
temp=NTOHL(temp);
m_sRoundOver.m_RedPointChange=temp;
mReader->getInt32(3,&temp);
temp=NTOHL(temp);
m_sRoundOver.m_BlackMoneyChange=temp;
mReader->getInt32(4,&temp);
temp=NTOHL(temp);
m_sRoundOver.m_BlackPointChange=temp;
}
void CBrewGame::ProcessMFC_CLAIM_INDmsg(IMessageReader *mReader){
mReader->getInt8(0,&m_ApplyInd[0]);
mReader->getInt8(1,&m_ApplyInd[1]);
m_nPreGameState=m_nGameState;
switch(m_ApplyInd[0]){
case 0:
m_nGameState = GAME_STATE_COMPROMISE;
break;
case 1:
m_nGameState = GAME_STATE_REGRET;
break;
case 2:
m_nGameState = GAME_STATE_CHANGE;
break;
}
showMsg(m_nGameState,1,6,MESSAGE_WARNING_COLOR,30000,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
return;
}
void CBrewGame::ProcessMFC_CLAIM_REQmsg(IMessageReader *mReader){
mReader->getInt8(0,&m_pApplyResult[0]);
mReader->getInt8(1,&m_pApplyResult[1]);
m_nPreGameState=m_nGameState;
switch(m_pApplyResult[0]){
case 0:
m_nGameState=GAME_STATE_COMPROMISE;
break;
case 1:
m_nGameState=GAME_STATE_REGRET;
break;
case 2:
m_nGameState=GAME_STATE_CHANGE;
break;
default:
break;
}
m_time=ISHELL_GetUpTimeMS(m_pIShell);
showMsg(m_nGameState,0,0,MESSAGE_WARNING_COLOR,30000,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
return;
}
void CBrewGame::ProcessMFC_ACTION_INDmsg(IMessageReader *mReader)
{
DBGPRINTF("处理了走棋反馈问题");
UINT16 Len;
INT16 x,y;
INT8 pBuffer='\0';
mReader->getBuffer(0,&pBuffer,&Len);
if((pBuffer&0x0F)!=0){//7-14,不能移动的棋子移动后,用于复位
m_bChessCanMove=FALSE;
x=m_SelChessPos.x;
y=m_SelChessPos.y;
m_cChessVal[x][y]=m_cSelectedChess;
x=m_EndPos.x;
y=m_EndPos.y;
m_cChessVal[x][y]=m_cEndChess;
m_cSelectedChess=0;
m_cEndChess=0;
}
return;
}
void CBrewGame::CheckPos(){
UINT16 x,y,i=0;
INT8 buffer[4];
if(m_setupCnt==0)
m_bMyturn=CheckWhoTurn();
if(!m_bMyturn)//如果轮到自己下了就可以动棋子
return;
for(x=0;x<9;x++)
for(y=0;y<10;y++){
if(!m_bChessSelected){//没有选中棋子
if(m_cMycolor==RED){//红方
if((m_cChessVal[x][y]>0)&&m_cChessVal[x][y]<='G'){//属于自己可以操作的棋子
i=(UINT16)(x+y*9);
if((m_HandPos.x==m_pBoard->m_joinPt[i].x)&&(m_HandPos.y==m_pBoard->m_joinPt[i].y)){
m_bShowRect=TRUE;
m_bChessSelected=TRUE;
m_cSelectedChess=m_cChessVal[x][y];
m_SelChessPos.x=x;
m_SelChessPos.y=y;
return;
}
}
}
else{//第二个位置上的人的情况
if(m_cChessVal[x][y]>='H'&&m_cChessVal[x][y]<='N'){//属于自己可以操作的棋子
i=x+y*9;
if((m_HandPos.x==m_pBoard->m_joinPt[i].x)&&(m_HandPos.y==m_pBoard->m_joinPt[i].y)){
m_bShowRect=TRUE;
m_bChessSelected=TRUE;
m_cSelectedChess=m_cChessVal[x][y];
m_SelChessPos.x=x;
m_SelChessPos.y=y;
return;
}
}
}
}
else{//已经选中棋子后
if(((m_cMycolor==RED)&&(m_cChessVal[x][y]!=0)&&(m_cChessVal[x][y]<='G'))
||((m_cMycolor==BLACK)&&(m_cChessVal[x][y]!=0)&&(m_cChessVal[x][y]>='H')&&(m_cChessVal[x][y]<='N'))){//已经选好棋子后,仍然点的是自己的棋子
i=x+y*9;
if((m_HandPos.x==m_pBoard->m_joinPt[i].x)&&(m_HandPos.y==m_pBoard->m_joinPt[i].y)){
if(m_cSelectedChess==m_cChessVal[x][y]){//再次点了选好的棋子,那就是放弃原来的选择
m_bShowRect=FALSE;
m_bChessSelected=FALSE;
m_cSelectedChess=0;
m_SelChessPos.x=0;
m_SelChessPos.y=0;
return;
}
m_bShowRect=TRUE;
m_bChessSelected=TRUE;
m_cSelectedChess=m_cChessVal[x][y];//换一个棋子把它选中
m_SelChessPos.x=x;
m_SelChessPos.y=y;
return;
}
}
else if(((m_cMycolor==RED)&&((m_cChessVal[x][y]>='H')||(m_cChessVal[x][y]==0)))
||((m_cMycolor==BLACK)&&(((m_cChessVal[x][y]>0)&&(m_cChessVal[x][y]<='G'))||(m_cChessVal[x][y]==0)))){//已经选好棋子后,点的是对家的棋子,或者放到了空地上
i=x+y*9;
if((m_HandPos.x==m_pBoard->m_joinPt[i].x)&&(m_HandPos.y==m_pBoard->m_joinPt[i].y)){
m_EndPos.x=x;//2维数组的第一维的值
m_EndPos.y=y;//2维数组的第二维的值
DBGPRINTF("m_EndPos.x=%d,m_EndPos.y=%d!",m_EndPos.x,m_EndPos.y);
if(CheckMove(m_cMycolor,m_cSelectedChess,m_SelChessPos,m_EndPos)){
m_bShowRect=FALSE;
m_bChessSelected=FALSE;
m_cEndChess=0;//7-15
if(m_cChessVal[m_EndPos.x][m_EndPos.y]!=0)
m_cEndChess=m_cChessVal[m_EndPos.x][m_EndPos.y];
m_cChessVal[m_EndPos.x][m_EndPos.y]=m_cSelectedChess;//将它吃掉
m_cChessVal[m_SelChessPos.x][m_SelChessPos.y]=0;//从原来的位置把它擦除
///////这里要将走过的棋子发送出去,向服务器汇报
if(m_cMycolor==RED){
buffer[0]=(INT8)('J'-(INT8)m_SelChessPos.x);
buffer[1]='K'-(INT8)m_SelChessPos.y;
buffer[2]='J'-(INT8)m_EndPos.x;
buffer[3]='K'-(INT8)m_EndPos.y;
}
else{
buffer[0]='J'+(INT8)m_SelChessPos.x-8;
buffer[1]='K'+(INT8)m_SelChessPos.y-9;
buffer[2]='J'+(INT8)m_EndPos.x-8;
buffer[3]='K'+(INT8)m_EndPos.y-9;
}
sendProBuf(MKND_CHESS,MFC_ACTION_REQ,0,0,buffer,4);
m_bChessCanMove=TRUE;//每次走棋默认为可以走
return;
}
}
}
}
}
}
boolean CBrewGame::CheckMove(INT8 colorside,INT8 seledchess,AEEPoint start,AEEPoint end)
{
UINT16 i=0,j=0,k=0,n=0,num=0;
INT16 min,max;
if((start.x>=3)&&(start.x<=5)){//在三条线内移动了棋子
if(end.x!=start.x){//如果不在Y轴移动
if(end.x>start.x){//保证在走棋范围内搜寻
min=start.x;
max=5;
}else{
min=3;
max=start.x;
}
if((seledchess=='L')||(seledchess=='E')){
for(n=0,num=0;n<10;n++){
if((m_cChessVal[end.x][n]!=0)&&(m_cChessVal[k][n]!='L')&&(m_cChessVal[k][n]!='E'))
num++;
else if((m_cChessVal[k][n]=='L')||(m_cChessVal[k][n]=='E')){
j++;
if((n==9)&&(num==0)&&(j==1))
return FALSE;
}
}
}else{
for(k=min;k<=max;k++)
for(n=0,num=0,j=0;n<10;n++){
if((m_cChessVal[k][n]!=0)&&(m_cChessVal[k][n]!='L')&&(m_cChessVal[k][n]!='E')){
if(m_cChessVal[k][n]!=seledchess)
num++;
}else if((m_cChessVal[k][n]=='L')||(m_cChessVal[k][n]=='E')){
j++;
if((num==0)&&(j==2)){//一条直线上有将和帅在一起了
j=0;
return FALSE;
}
}
}
}
}
}
switch(seledchess){
case 'A'://红车
case 'H'://黑车
i=0;
if ((end.x != start.x) && (end.y != start.y))//这里面XY代表的是2维数组中的标号
return FALSE;
if (end.x == start.x){
if (end.y >start. y){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -