⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brewgame.cpp

📁 象棋框架
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -