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

📄 brewgame.cpp

📁 象棋框架
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				for (i = start.y + 1; i < end.y; i ++){
		            if (m_cChessVal[start.x][i] != 0)
						return FALSE;
				}
			}else{
				for (i = end.y + 1; i < start.y; i ++){
                   if (m_cChessVal[start.x][i] != 0)
					   return FALSE;
				}
			}
		}
		if (end.y == start.y){
			if (end.x > start.x){
				for (i = start.x + 1; i < end.x; i ++){
		                  if (m_cChessVal[i][start.y] != 0)
							  return FALSE;
				}
			}else{
				for (i = end.x + 1; i < start.x; i ++){
		                  if (m_cChessVal[i][start.y] != 0)
							  return FALSE;
				}
			}
		}
		break;
	case 'B'://红马
	case 'I'://黑马
		if (ABSDIFF(end.x, start.x) + ABSDIFF(end.y, start.y) != 3)
			return FALSE;
		if ((ABSDIFF(end.x, start.x) != 1) && (ABSDIFF(end.x, start.x) != 2))
			return FALSE;
		if ((ABSDIFF(end.y, start.y) != 1) && (ABSDIFF(end.y, start.y) != 2))
			return FALSE;
		if ((start.x + 2 == end.x) && (m_cChessVal[start.x + 1][start.y] != 0))
			return FALSE;
		if ((end.x + 2 == start.x) && (m_cChessVal[end.x + 1][start.y] != 0))
			return FALSE;
		if ((start.y + 2 == end.y) && (m_cChessVal[start.x][start.y + 1] != 0))
			return FALSE;
		if ((end.y + 2 == start.y) && (m_cChessVal[start.x][end.y + 1] != 0))
			return FALSE;
		break;
	case 'C'://象
	case 'J'://黑象
		if ((colorside==RED)&&(end.y < 5))
			return FALSE;
		if(((colorside==RED)&&(end.x + end.y) % 4 != 3))
			return FALSE;
		if ((ABSDIFF(end.x,start.x) != 2) || (ABSDIFF(end.y,start.y) != 2))
			return FALSE;
		if (m_cChessVal[(end.x+start.x) / 2][(end.y+start.y) / 2] != 0)
			return FALSE;
		break;
	case 'D'://士
	case 'K'://黑士
			if((end.y<7)||(end.x>5)||(end.x<3))
				return FALSE;
			if((end.x+end.y)%2!=0)
				return FALSE;
			if((ABSDIFF(end.x,start.x)!=1)||(ABSDIFF(end.y,start.y)!=1))
				return FALSE;
			break;
	case 'E'://帅
	case 'L'://将
		if((end.y<7)||(end.x>5)||(end.x<3))
			return FALSE;			
		if((ABSDIFF(end.x,start.x)+ABSDIFF(end.y,start.y))!=1)
			return FALSE;		
		break;		
	case 'F'://红炮
	case 'M'://黑炮
		i=0;
		if ((end.x != start.x && end.y != start.y))
			return FALSE;
		if (end.x == start.x){
			j=0;
			if (end.y >start. y){
				for (i = start.y + 1; i < end.y; i ++){
		            if (m_cChessVal[start.x][i] != 0)
						j++;
				}
			}else{
				for (i = end.y + 1; i < start.y; i ++){
                   if (m_cChessVal[start.x][i] != 0)
					   j++;
				}
			}
			if(j==0)
				if(m_cChessVal[end.x][end.y]!=0)
					return FALSE;
			if(j>1)
				return FALSE;
			if(j==1)
				if(m_cChessVal[end.x][end.y]==0||((colorside==RED)&&(m_cChessVal[end.x][end.y]<='G')&&(m_cChessVal[end.x][end.y]!=0))||((colorside==BLACK)&&(m_cChessVal[end.x][end.y]>='H')&&(m_cChessVal[end.x][end.y]<='N')))
					return FALSE;
		}
		if (end.y == start.y){
			j=0;
			if (end.x >start. x){
				for (i = start.x + 1; i < end.x; i ++){
		            if (m_cChessVal[i][start.y] != 0)
						j++;
				}
			}else{
				for (i = end.x + 1; i < start.x; i ++){
                   if (m_cChessVal[i][start.y] != 0)
					   j++;
				}
			}
			if(j==0)
				if(m_cChessVal[end.x][end.y]!=0)
					return FALSE;
			if(j>1)
				return FALSE;
			if(j==1)
				if(m_cChessVal[end.x][end.y]==0||((colorside==RED)&&(m_cChessVal[end.x][end.y]<='G')&&(m_cChessVal[end.x][end.y]!=0))||((colorside==BLACK)&&(m_cChessVal[end.x][end.y]>='H')&&(m_cChessVal[end.x][end.y]<='N')))
					return FALSE;
		}		
		break;
	case 'G':// 兵
	case 'N'://卒
		if((end.y>=5)&&(end.x!=start.x))//未过河
			return FALSE;
		if((start.y<5)&&(end.y>start.y))//过河卒子不回头
			return FALSE;
		if((ABSDIFF(end.x,start.x)+ABSDIFF(end.y,start.y))!=1)
			return FALSE;
		break;
	}	
	return TRUE;
}

UINT16 CBrewGame::ABSDIFF(UINT16 a, UINT16 b)
{
	if(a>=b)
		return (a-b);
	else 
		return (b-a);
}

boolean CBrewGame::CheckWhoTurn(){
	if(((m_sChessState.m_turn&0x0F)==0)&&(m_cMycolor==RED))
			return TRUE;
	if(((m_sChessState.m_turn&0x0F)!=0)&&(m_cMycolor==BLACK))
			return TRUE;
	return FALSE;
}
void CBrewGame::onSitDown(UINT8 tableId, UINT8 seatId, UINT8 action, UINT8 retCode)
{
	frame->showHint(NULL,0,HINT_TOP);
	frame->showHint(NULL,0,HINT_BOTTOM);
	m_nCurrentSeatId=seatId;
	m_nCurrentTableId=tableId;
	if(m_nCurrentSeatId==1)//							
		m_cMycolor=RED;				
	else				
		m_cMycolor=BLACK;
	if(m_bInitData==FALSE)
		m_bInitData=InitData();//加载资源
	gameReset();
	SetOrigin(m_cMycolor);
}

void CBrewGame::freeMyData()//7-12
{
	if (m_pIGameCanvas != NULL){
		m_pIGameCanvas->Release();
		m_pIGameCanvas = NULL;
	}
	if(m_pMainMenuCtl){
		IMENUCTL_Release(m_pMainMenuCtl);
		m_pMainMenuCtl=NULL;
	}	
	if(m_pRiver){
		IBITMAP_Release(m_pRiver);
		m_pRiver=NULL;
	}
	
	if(m_pImage){
		IBITMAP_Release(m_pImage);
		m_pImage=NULL;
	}

	if(m_pChess){
		IBITMAP_Release(m_pChess);
		m_pChess=NULL;
	}

	if(m_pHand){
		IBITMAP_Release(m_pHand);
		m_pHand=NULL;
	}
	if(m_pGeneral){//7-16
		IBITMAP_Release(m_pGeneral);
		m_pGeneral=NULL;
	}
	if(m_pBoard){
		FREE(m_pBoard);
		m_pBoard=NULL;
	}
	if(m_pMenu){
		IMENUCTL_Release(m_pMenu);
		m_pMenu=NULL;
	}
	if (m_pIMWriter != NULL){ 
		m_pIMWriter->Release(); 
		m_pIMWriter = NULL; 
	} 
	if(m_pChatMenu){
		IMENUCTL_Release(m_pChatMenu);
		m_pChatMenu=NULL;
	}

	if(m_pDlg){
		m_pDlg->Release();
		m_pDlg=NULL;
	}
	if(m_pHelp){			
		m_pHelp->Release();
		m_pHelp=NULL;		
	}
	m_bInitData=FALSE;	
}

void CBrewGame::gameReset()//7-12
{
	UINT16 x,y;
	m_bShowMenuOnly=TRUE;
	m_bNextRound=TRUE;
	m_pApplyResult[0]='\0';
	m_pApplyResult[1]='\0';
	m_ApplyInd[0]='\0';
	m_ApplyInd[1]='\0';
    m_bShowGeneral=FALSE;
	m_time=0;
	m_clock=0;
	m_bProcessedTIMEIND=FALSE;
	for(x=0;x<9;x++)
		for(y=0;y<10;y++)
			m_cChessVal[x][y]=0;
	m_cSelectedChess=0;
	m_cEndChess=0;
	m_setupCnt=0;
	m_bChessSelected=FALSE;
	m_bShowRect=FALSE;
	m_bMyturn=FALSE;
	m_eMove=ENONE;	
	m_bShowOppRect=FALSE;
	m_bChessCanMove=FALSE;//7-19改为FALSE
	m_bShowClock=FALSE;
	if(m_nCurrentSeatId==1)//是否交换了以后就一直是交换好的颜色
		m_cMycolor=RED;
	else
		m_cMycolor=BLACK;
	m_bMainMenuCtl=FALSE;
	m_bMainMenu=FALSE;
	m_bChatMenu=FALSE;
	m_bHelpView=FALSE;
	m_bYouBack=FALSE;
	m_bGameStart=FALSE;
}

void CBrewGame::SetOrigin(INT8 clr){
	UINT16 i=0;
	INT8   x,y;
	for(x=0;x<9;x++)
		for(y=0;y<10;y++)
			m_cChessVal[x][y]=0;
	if(clr==RED){//(m_MyInfo.seatId&0x7F)==1){//坐标系的切换		
		while(m_psLayout[i]){
			x=(INT8)('J'-m_psLayout[i]);
			y=(INT8)('K'-m_psLayout[i+1]);
			m_cChessVal[x][y]=m_psLayout[i+2];
			i+=3;
		}
	}else {
		while(m_psLayout[i]){
			x=(INT8)(8-('J'-m_psLayout[i]));
			y=(INT8)(9-('K'-m_psLayout[i+1]));
			m_cChessVal[x][y]=m_psLayout[i+2];
			i+=3;
		}		
	}
	((CBrewGameCanvas*)m_pIGameCanvas)->m_bShowHand=TRUE;
	frame->showHint(NULL,0,HINT_BOTTOM);
}
void CBrewGame::ProcessSelStart()
{
	if(m_nGameState==GAME_STATE_MAINMENU){
		IMENUCTL_SetActive(m_pMainMenuCtl,FALSE);
	}else if(m_nGameState==GAME_STATE_MENU){
		IMENUCTL_SetActive(m_pMenu,FALSE);
	}else if(m_nGameState==GAME_STATE_HELP){
		if(m_pHelp){			
			m_pHelp->Release();
			m_pHelp=NULL;
			
		}
	}else if(m_nGameState==GAME_STATE_PLAYERINFO){
		if(m_pDlg){
			m_pDlg->Release();
			m_pDlg=NULL;
		}
	}
	m_nGameState=GAME_STATE_PLAY;
	m_bGameStart=TRUE;
	m_bMyturn=CheckWhoTurn();
	if(m_bMyturn){
		m_bShowClock=TRUE;
		m_clock=ISHELL_GetUpTimeMS(m_pIShell);
	}
	else
		frame->showHint(NULL,0,HINT_TOP);
	m_setupCnt=(m_sChessState.m_stateID[0]<<8)+(m_sChessState.m_stateID[1]&255);	
}

void CBrewGame::ProcessRegret()
{
	MEMSET(m_psLayout,'\0',sizeof(m_psLayout));
	MEMCPY(m_psLayout,m_ChessMapField,sizeof(m_ChessMapField));
	SetOrigin(m_cMycolor);//实时更新棋谱
	m_bMyturn=CheckWhoTurn();
	m_clock=ISHELL_GetUpTimeMS(m_pIShell);
	m_bShowClock=TRUE;
	m_bShowOppRect=FALSE;
	m_bChessCanMove=FALSE;
	m_cSelectedChess=0;
	m_cEndChess=0;	
	m_bChessSelected=FALSE;
	m_bShowRect=FALSE;
	return;
}

void CBrewGame::ProcessChange(){
	if(m_cMycolor==RED)
		m_cMycolor=BLACK;
	else
		m_cMycolor=RED;
	SetOrigin(m_cMycolor);//实时更新棋谱
	m_bMyturn=CheckWhoTurn();
	m_clock=ISHELL_GetUpTimeMS(m_pIShell);
	m_bShowClock=TRUE;
	m_bChessCanMove=FALSE;
	m_bShowOppRect=FALSE;
	m_cSelectedChess=0;
	m_cEndChess=0;	
	m_bChessSelected=FALSE;
	m_bShowRect=FALSE;
	return;
}

void CBrewGame::ProcessGoResult()
{
	UINT16 x,y;
	m_bMyturn=CheckWhoTurn();
	if(m_bMyturn){
		m_bShowClock=TRUE;
		m_time=ISHELL_GetUpTimeMS(m_pIShell);//为了在我这里画出对家给我的将军
		m_clock=ISHELL_GetUpTimeMS(m_pIShell);//CLOCK
		if(m_cMycolor==RED){
			x='J'-m_sChessState.m_ChessGo[0];
			y='K'-m_sChessState.m_ChessGo[1];						
			m_OppEndPos.x='J'-m_sChessState.m_ChessGo[2];
			m_OppEndPos.y='K'-m_sChessState.m_ChessGo[3];
			m_cChessVal[m_OppEndPos.x][m_OppEndPos.y]=m_cChessVal[x][y];
			m_cChessVal[x][y]=0;			
		}
		else{
			x=8-('J'-m_sChessState.m_ChessGo[0]);
			y=9-('K'-m_sChessState.m_ChessGo[1]);
			m_OppEndPos.x=8-('J'-m_sChessState.m_ChessGo[2]);
			m_OppEndPos.y=9-('K'-m_sChessState.m_ChessGo[3]);
			m_cChessVal[m_OppEndPos.x][m_OppEndPos.y]=m_cChessVal[x][y];
			m_cChessVal[x][y]=0;							
		}
		m_bShowOppRect=TRUE;
	}					
	return;
}
void CBrewGame::ProcessHelp()
{
	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;
	m_pHelp = new CBrewHelpAndIntro;
	if(m_pHelp != NULL)	{
		m_pHelp->setFrame(this);
	}
	m_nGameState=GAME_STATE_HELP;	
}

void CBrewGame::ProcessChat()
{
	AEERect rectChat;
	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;
	if (ISHELL_CreateInstance(m_pIShell, AEECLSID_MENUCTL, (void **)&m_pChatMenu)){
		m_nGameState=m_nPreGameState;
		return ;
	}
	SETAEERECT(&rectChat,frame->getScreenOffsetX()+(m_pIDi->cxScreen-BGWIDTH)/2,frame->getScreenOffsetY()+(m_pIDi->cyScreen-BGHEIGHT)/2,BGWIDTH,BGHEIGHT);
	((CBrewGameCanvas*)m_pIGameCanvas)->SetMenuStyle(m_pChatMenu);
	IMENUCTL_SetTitle(m_pChatMenu, GAMEVV_RES_FILE, IDC_CHATCONTENT, NULL); 
	IMENUCTL_AddItem (m_pChatMenu,GAMEVV_RES_FILE,IDC_CHAT1,IDC_CHAT1,NULL,0);
	IMENUCTL_AddItem (m_pChatMenu,GAMEVV_RES_FILE,IDC_CHAT2,IDC_CHAT2,NULL,0);
	IMENUCTL_SetRect( m_pChatMenu, &rectChat );
	IMENUCTL_SetActive(m_pChatMenu,TRUE);
	m_nGameState=GAME_STATE_CHAT;
	return;
}

void CBrewGame::DispatchChatMsg(UINT16 wParam)
{
	INT8 table,buffer[62];
	AECHAR szChatBuffer[31];
	UINT16 bufLen,i;
	MEMSET(szChatBuffer,'\0',sizeof(szChatBuffer));
	switch (wParam){
	case IDC_CHAT1:
		table=1;
		ISHELL_LoadResString(m_pIShell,GAMEVV_RES_FILE,IDC_CHAT1,szChatBuffer,12);
		frame->postMessage(szChatBuffer,0,MESSAGE_WARNING_COLOR,5000,MESSAGE_TEXT_CENTER);
		i=0;
		while(szChatBuffer[i]){
			szChatBuffer[i]=HTONS(szChatBuffer[i]);
			i++;
		}
		szChatBuffer[i]='\0';
		MEMCPY(buffer,szChatBuffer,62);
		bufLen=12;
		break;
	case IDC_CHAT2:
		table=1;
		ISHELL_LoadResString(m_pIShell,GAMEVV_RES_FILE,IDC_CHAT2,szChatBuffer,18);
		frame->postMessage(szChatBuffer,0,MESSAGE_WARNING_COLOR,5000,MESSAGE_TEXT_CENTER);
		i=0;
		while(szChatBuffer[i]){
			szChatBuffer[i]=HTONS(szChatBuffer[i]);
			i++;
		}
		szChatBuffer[i]='\0';
		MEMCPY(buffer,szChatBuffer,62);
		bufLen=18;
		break;
	default:
		break;
	}
	m_pIMWriter->reset(); 
	m_pIMWriter->setModuleKind(MKND_HALL); 
	m_pIMWriter->setMessageID(MT_CHAT_REQ);
	m_pIMWriter->setVersion(0); 
	m_pIMWriter->setCrypt(0); 							
	m_pIMWriter->setInt8(0,table); 
	m_pIMWriter->setInt32(1,MESSAGE_WARNING_COLOR); 
	m_pIMWriter->setBuffer(2,buffer,bufLen); 
	m_pIMWriter->setBuffer(3,buffer,bufLen); 
	frame->sendPackage(m_pIMWriter);
	IMENUCTL_Release(m_pChatMenu);
	m_pChatMenu=NULL;
}
void CBrewGame::ProcessUserInfo(UserInfoStruct *userInfo){
	AECHAR szMsg[7];
	UINT16 hintType;
	if(userInfo->tableId==m_nCurrentTableId){
		if(userInfo->seatId==m_nCurrentSeatId){
			MEMCPY(&m_MyInfo,userInfo,sizeof(UserInfoStruct));
			if(m_MyInfo.state==4){
				m_bShowClock=TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -