📄 chessdlg.cpp
字号:
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;
//sndPlaySound("E:\\movehint.wav",SND_ASYNC);
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;
// m_cmShow=m_cmBestMove;
//重绘屏幕
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:
MessageBox("YOU WIN,你好强哦","信息提示",MB_ICONINFORMATION);
break;
case 1:
MessageBox("YOU LOSE,看来你不是我的对手啊","信息提示",MB_ICONINFORMATION);
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::OnSelchangeListchessrecord()
{
// TODO: Add your control notification handler code here
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::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::OnExit()
{
// TODO: Add your command handler code here
OnClose();
}
void CChessDlg::OnInversecb()
{
// TODO: Add your command handler code here
this->InvertChessBoard(m_byShowChessBoard);
//重绘屏幕
InvalidateRect(NULL,FALSE);
UpdateWindow();
}
void CChessDlg::DrawTipBox(CDC *pDc, CPoint point,int iBitmap)
{
CBitmap m_QiZi;
int m_QiPangDistance;
m_QiPangDistance = GRILLEHEIGHT;
m_QiZi.LoadBitmap(iBitmap);
if(NULL != m_QiZi.GetSafeHandle())
{
//棋盘图片
BITMAP bitmap;
m_QiZi.GetBitmap(&bitmap);
CDC psdc;
psdc.CreateCompatibleDC(pDc);
psdc.SelectObject(m_QiZi);
TransparentBlt2(pDc->GetSafeHdc(), point.x - m_QiPangDistance, point.y -m_QiPangDistance, m_QiPangDistance, m_QiPangDistance,
psdc.GetSafeHdc(), 0, 0, bitmap.bmWidth, bitmap.bmHeight, RGB(255, 255, 255));
}
}
void CChessDlg::TransparentBlt2
( HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 设置透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -