📄 brewgame.cpp
字号:
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 + -