📄 chessdlg.cpp
字号:
}
if(bIsAgain)
{
if(i>nFromY-1)
{
if(nFromY>nToY)
str.Format("黑:后象退%d",nToX);
else
str.Format("黑:后象进%d",nToX);
}
else
{
if(nFromY>nToY)
str.Format("黑:前象退%d",nToX);
else
str.Format("黑:前象进%d",nToX);
}
}
else
{
if(nFromY>nToY)
str.Format("黑:象%d退%d",nFromX,nToX);
else
str.Format("黑:象%d进%d",nFromX,nToX);
}
break;
case B_PAWN://黑卒
nCount=0;
j=0;
for(i=0;i<5;i++)
nPos[i]=-1;
for(i=0;i<10;i++)
if(m_byChessBoard[i][nFromX-1]==B_PAWN && i!=nFromY-1 && i!=nToY-1)
{
nPos[j]=i;
nCount++;
}
if(nCount==0)
{
if(nFromY==nToY)
str.Format("黑:卒%d平%d",nFromX,nToX);
else
str.Format("黑:卒%d进%d",nFromX,1);
break;
}
if(nCount==1)
{
if(nFromY>nPos[0])
{
if(nFromY==nToY)
str.Format("黑:前卒平%d",nToX);
else
str.Format("黑:前卒进%d",1);
}
else
{
if(nFromY==nToY)
str.Format("黑:后卒平%d",nToX);
else
str.Format("黑:后卒进%d",1);
}
break;
}
j=0;
if(nCount>1)
{
for(i=0;i<5;i++)
if(nPos[i]==-1)
break;
else
if(nPos[i]>nFromY)
break;
else
j++;
if(nFromY==nToY)
str.Format("黑:%d卒平%d",j+1,1);
else
str.Format("黑:%d卒进%d",j+1,1);
break;
}
case R_KING://红帅
if(nFromX==nToX)
{
if(nFromY>nToY)
str="红:帅"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(nFromY-nToY);
else
str="红:帅"+ConvertDigit2Chinese(10-nFromX)+"退"+ConvertDigit2Chinese(nToY-nFromY);
}
else
str="红:帅"+ConvertDigit2Chinese(10-nFromX)+"平"+ConvertDigit2Chinese(10-nToX);
break;
case R_CAR://红车
bIsAgain=false;
for(i=0;i<10;i++)
if(m_byChessBoard[i][nFromX-1]==R_CAR && i!=nFromY-1 && i!=nToY-1)
{
bIsAgain=true;
break;
}
if(nFromY>nToY)
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:前车进"+ConvertDigit2Chinese(nFromY-nToY);
else
str="红:后车进"+ConvertDigit2Chinese(nFromY-nToY);
}
else
str="红:车"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(nFromY-nToY);
}
else
if(nFromY<nToY)
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:后车退"+ConvertDigit2Chinese(nToY-nFromY);
else
str="红:前车退"+ConvertDigit2Chinese(nToY-nFromY);
}
else
str="红:车"+ConvertDigit2Chinese(10-nFromX)+"退"+ConvertDigit2Chinese(nToY-nFromY);
}
else
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:后车平"+ConvertDigit2Chinese(nToX);
else
str="红:前车平"+ConvertDigit2Chinese(nToX);
}
else
str="红:车"+ConvertDigit2Chinese(10-nFromX)+"平"+ConvertDigit2Chinese(10-nToX);
break;
}
break;
case R_HORSE://红马
bIsAgain=false;
for(i=0;i<10;i++)
if(m_byChessBoard[i][nFromX-1]==R_HORSE && i!=nFromY-1 && i!=nToY-1)
{
bIsAgain=true;
break;
}
if(bIsAgain)
{
if(i>nFromY-1)
{
if(nFromY>nToY)
str="红:前马进"+ConvertDigit2Chinese(10-nToX);
else
str="红:前马退"+ConvertDigit2Chinese(10-nToX);
}
else
{
if(nFromY>nToY)
str="红:前马进"+ConvertDigit2Chinese(10-nToX);
else
str="红:前马退"+ConvertDigit2Chinese(10-nToX);
}
}
else
{
if(nFromY>nToY)
str="红:马"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(10-nToX);
else
str="红:马"+ConvertDigit2Chinese(10-nFromX)+"退"+ConvertDigit2Chinese(10-nToX);
}
break;
case R_CANON://红炮
bIsAgain=false;
for(i=0;i<10;i++)
if(m_byChessBoard[i][nFromX-1]==R_CANON && i!=nFromY-1 && i!=nToY-1)
{
bIsAgain=true;
break;
}
if(nFromY>nToY)
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:前炮进"+ConvertDigit2Chinese(nFromY-nToY);
else
str="红:后炮进"+ConvertDigit2Chinese(nFromY-nToY);
}
else
str="红:炮"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(nFromY-nToY);
}
else
if(nFromY<nToY)
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:前炮退"+ConvertDigit2Chinese(nToY-nFromY);
else
str="红:后炮退"+ConvertDigit2Chinese(nToY-nFromY);
}
else
str="红:炮"+ConvertDigit2Chinese(nFromX)+"退"+ConvertDigit2Chinese(nToY-nFromY);
}
else
{
if(bIsAgain)
{
if(i>nFromY-1)
str="红:前炮平"+ConvertDigit2Chinese(10-nToX);
else
str="红:后炮平"+ConvertDigit2Chinese(10-nToX);
}
else
str="红:炮"+ConvertDigit2Chinese(10-nFromX)+"平"+ConvertDigit2Chinese(10-nToX);
}
break;
case R_BISHOP://红士
if(nFromY>nToY)
str="红:士"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(10-nToX);
else
str="红:士"+ConvertDigit2Chinese(10-nFromX)+"退"+ConvertDigit2Chinese(10-nToX);
break;
case R_ELEPHANT://红相
bIsAgain=false;
for(i=0;i<5;i++)
if(m_byChessBoard[i][nFromX-1]==R_ELEPHANT && i!=nFromY-1 && i!=nToY-1)
{
bIsAgain=true;
break;
}
if(bIsAgain)
{
if(i>nFromY-1)
{
if(nFromY>nToY)
str="红:前相退"+ConvertDigit2Chinese(10-nToX);
else
str="红:前相进"+ConvertDigit2Chinese(10-nToX);
}
else
{
if(nFromY>nToY)
str="红:后相退"+ConvertDigit2Chinese(10-nToX);
else
str="红:后相进"+ConvertDigit2Chinese(10-nToX);
}
}
else
{
if(nFromY>nToY)
str="红:相"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(10-nToX);
else
str="红:相"+ConvertDigit2Chinese(10-nFromX)+"退"+ConvertDigit2Chinese(10-nToX);
}
break;
case R_PAWN://红兵
nCount=0;
j=0;
for(i=0;i<5;i++)
nPos[i]=-1;
for(i=0;i<10;i++)
if(m_byChessBoard[i][nFromX-1]==R_PAWN && i!=nFromY-1 && i!=nToY-1)
{
nPos[j]=i;
nCount++;
}
if(nCount==0)
{
if(nFromY==nToY)
str="红:兵"+ConvertDigit2Chinese(10-nFromX)+"平"+ConvertDigit2Chinese(10-nToX);
else
str="红:兵"+ConvertDigit2Chinese(10-nFromX)+"进"+ConvertDigit2Chinese(1);
break;
}
if(nCount==1)
{
if(nFromY-1>nPos[0])
{
if(nFromY==nToY)
str="红:前兵平"+ConvertDigit2Chinese(10-nToX);
else
str="红:前兵进"+ConvertDigit2Chinese(1);
}
else
{
if(nFromY==nToY)
str="红:后兵平"+ConvertDigit2Chinese(10-nToX);
else
str="红:后兵进"+ConvertDigit2Chinese(1);
}
break;
}
j=0;
if(nCount>1)
{
for(i=0;i<5;i++)
if(nPos[i]==-1)
break;
else
if(nPos[i]>nFromY-1)
break;
else
j++;
if(nFromY==nToY)
str="红:"+ConvertDigit2Chinese(j+1)+"兵平"+ConvertDigit2Chinese(nToX);
else
str="红:"+ConvertDigit2Chinese(j+1)+"兵进"+ConvertDigit2Chinese(1);
}
break;
default:
break;
}
return str;
}
void CChessDlg::OnDblclkListchessrecord()
{
// TODO: Add your control notification handler code here
int nSel=m_lstChessRecord.GetCurSel();
int nNum=m_lstChessRecord.GetCount();
int nCount=0;
while(nCount<nNum-nSel)
{
this->OnBtnundo();
nCount+=2;
}
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_btnOk.SetBitmap(m_bitmapOk);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CChessDlg::Think()
{
int timecount;
CString sNodeCount;
timecount=GetTickCount();//取初始时间
m_staticTip.SetWindowText("我正在思考,请勿打扰...");
if(m_nUserChessColor==BLACKCHESS)
m_iBout++;
m_bIsThinking=true;
m_pSE->SearchAGoodMove(m_byChessBoard);
memcpy(m_byShowChessBoard,m_byChessBoard,90);
memcpy(m_byBackupChessBoard,m_byChessBoard,90);
m_cmBestMove=m_pSE->GetBestMove();//得到最佳走法
m_umUndoMove=m_pSE->GetUndoMove();
m_stackUndoMove.push(m_umUndoMove);//将电脑走法压栈
this->AddChessRecord(m_cmBestMove.From.x+1,m_cmBestMove.From.y+1,m_cmBestMove.To.x+1,m_cmBestMove.To.y+1,m_nUserChessColor,m_cmBestMove.nChessID);
m_bIsThinking=false;
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
sNodeCount.Format("共访问%d个节点,花费时间%.3fs",m_pEvel->GetAccessCount(),(GetTickCount()-timecount)/1000.0);
m_staticTip.SetWindowText(sNodeCount);
::FlashWindow(this->GetSafeHwnd(),TRUE);
m_btnStop.EnableWindow(0);
m_pEvel->ClearAccessCount();
switch(IsGameOver(m_byChessBoard))
{
case -1:
m_staticTip.SetWindowText("老兄,你好强哦");
break;
case 1:
m_staticTip.SetWindowText("老兄,看来你不是我的对手啊");
break;
default:
return;
}
m_bIsGameOver=true;
}
BOOL CChessDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
m_tooltip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
void CChessDlg::OnBtnStop()
{
// TODO: Add your control notification handler code here
::TerminateThread(m_hHandle,0);
::WaitForSingleObject(m_hHandle,INFINITE);
::CloseHandle(m_hHandle);
m_btnStop.EnableWindow(0);
m_bIsThinking=0;
m_progressThink.SetPos(0);
m_staticTip.SetWindowText("我的思绪已被你打断");
//撤销用户走法
memcpy(m_byShowChessBoard,m_byBackupChessBoard,90);
memcpy(m_byChessBoard,m_byBackupChessBoard,90);
m_stackUndoMove.pop();
m_lstChessRecord.DeleteString(m_lstChessRecord.GetCount()-1);
m_iBout--;
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
}
void CChessDlg::OnSelchangeListchessrecord()
{
// TODO: Add your control notification handler code here
if(m_Status!=Previewing)
{
m_staticTip.SetWindowText("你要想查看以前的局面的话,请弹出右键菜单点“预览”");
return;
}
int nSel=m_lstChessRecord.GetCurSel();
int nNum=m_lstChessRecord.GetCount();
int nCount=0;
if(!nNum)
return;
m_btnRedo.EnableWindow(1);//激活还原按钮
m_bIsGameOver=false;
memcpy(m_byShowChessBoard,m_byChessBoard,90);
while(nCount<nNum-nSel)
{
for(int i=0;i<2;i++)
{
m_umUndoMove=m_stackUndoMove.top();
m_stackRedoMove.push(m_umUndoMove);
m_pSE->UndoChessMove(m_byShowChessBoard,&m_umUndoMove.cmChessMove,m_umUndoMove.nChessID);
memcpy(m_byBackupChessBoard,m_byShowChessBoard,90);
m_stackUndoMove.pop();
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
}
nCount+=2;
}
//还原栈m_stackUndoMove和m_stackRedoMove
while(nCount)
{
for(int i=0;i<2;i++)
{
m_stackUndoMove.push(m_stackRedoMove.top());
m_stackRedoMove.pop();
}
nCount-=2;
}
}
void CChessDlg::OnPreview()
{
// TODO: Add your command handler code here
m_Status=Previewing;
}
void CChessDlg::OnPreviewover()
{
// TODO: Add your command handler code here
m_Status=Chessing;
memcpy(m_byShowChessBoard,m_byChessBoard,90);
m_staticTip.SetWindowText("呵呵,进入下棋状态,你可以下咯");
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
}
void CChessDlg::WinHelp(DWORD dwData, UINT nCmd)
{
// TODO: Add your specialized code here and/or call the base class
CHelpDlg dlg;
dlg.DoModal();
// CDialog::WinHelp(dwData, nCmd);
}
void CChessDlg::OnHelp()
{
// TODO: Add your command handler code here
CHelpDlg dlg;
dlg.DoModal();
}
void CChessDlg::OnInversecb()
{
// TODO: Add your command handler code here
this->InvertChessBoard(m_byShowChessBoard);
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -