📄 chessdlg.cpp
字号:
//AddOneStep(go,&HaveMoveTable);
m_Loop ++;
PrintStep(go,0);
UpdateWindow();
AddDepth();
fo = m_Evaluation->FindBetter(m_ChessInfo,&go);
::AfxGetApp()->LoadStandardCursor(IDC_ARROW);
if(fo.srcCol==-1 && fo.srcRow ==-1 )
{
MessageBox("我输了,你太厉害了!","DeepThink",0);
return;
}
MoveTo(fo.desRow ,fo.desCol ,fo.srcRow ,fo.srcCol);
m_ChessInfo.FindChess();
//AddOneStep(fo,&HaveMoveTable);
m_Loop ++;
PrintStep(fo,1);
m_Evaluation->m_Depth = m_OldDepth;
if(RedLose())
{
MessageBox("对不起,你输了!","DeepThink",0);
return;
}
}
CDialog::OnLButtonDown(nFlags, point);
}
void CChessDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
}
void CChessDlg::UpdateFace(int col,int row,int chess)
{
CClientDC dc(this);
MakeBoard();
for (int i=0;i<10;i++)
for(int j=0;j<9;j++)
{
m_CDCBuf.DrawIcon(j*XX+2,i*YY+2,m_hCheIco[m_ChessInfo.ChessMap[i][j].ChessPos]);
m_CDCBuf.DrawIcon(j*XX+2,i*YY+2,m_hCheIco[m_ChessInfo.ChessMap[i][j].Icon]);
if(m_ChessInfo.ChessMap[i][j].Choise ==1 )
m_CDCBuf.DrawIcon(j*XX+2,i*YY+2,m_hCheIco[16]);
}
if(col!=0 && row!=0 && chess!=0)
{
m_CDCBuf.DrawIcon(col,row,m_hCheIco[chess]);
}
dc.BitBlt(0,0,8*XX+m_iSX+2*(iOffset+m_iSX),9*YY+m_iSY+2*(iOffset+m_iSY),&m_CDCBuf,0,0,SRCCOPY);
// UpdateWindow();
}
void CChessDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonDown(nFlags, point);
}
//摆棋子
void CChessDlg::MakeChess()
{
HICON htemp;
for (int i=0;i<10;i++)
for(int j=0;j<9;j++)
{
htemp = m_hCheIco[m_ChessInfo.ChessMap[i][j].ChessPos];
m_CDCBuf.DrawIcon(j*XX,i*YY,htemp);
}
}
void CChessDlg::OnMenuitemRestart()
{
// TODO: Add your command handler code here
for (int i=0;i<10;i++)
for(int j=0;j<9;j++)
{
m_ChessInfo.ChessMap[i][j].ChessPos = CHESSPOS[i][j];
m_ChessInfo.ChessMap[i][j].Choise = 0;
m_ChessInfo.ChessMap[i][j].Icon = 0;
}
m_ChessInfo.m_Turn = 0;
m_Evaluation->m_Depth = m_OldDepth;
m_Loop = 0;
m_Edit.SetWindowText("");
MakeBoard();
MakeChess();
UpdateFace(0,0,0);
}
//移动棋子
int CChessDlg::MoveTo(int desRow, int desCol, int srcRow, int srcCol)
{
int eat = -1;
POSINFO fo;
fo.desCol = desCol;
fo.desRow = desRow;
fo.srcCol = srcCol;
fo.srcRow = srcRow;
fo.eat = eat;
if(m_ChessInfo.CanGO(fo,eat) == FALSE)
{
CanNotGo(srcRow,srcCol,desRow,desCol);
return eat;
}
else
{
if (eat == 1) //eat
{
CanGo(srcRow,srcCol,desRow,desCol);
m_ChessInfo.ChessMap[desRow][desCol].ChessPos = m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos;
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = 0;
for(int i=0;i<10;i++)
for(int j=0;j<11;j++)
{
m_ChessInfo.ChessMap[i][j].Icon = 0;
}
m_ChessInfo.ChessMap[srcRow][srcCol].Icon = 15;
m_ChessInfo.ChessMap[desRow][desCol].Icon = 15;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = 0;
m_ChessInfo.ChessMap[desRow][desCol].Choise = 0;
if(m_ChessInfo.m_Turn == 0)
{
m_ChessInfo.m_Turn = 1;
m_StatusBar.SetText(" 该黑方走了",0,0);
}
else
{
m_ChessInfo.m_Turn = 0;
m_StatusBar.SetText(" 该红方走了",0,0);
}
}
if (eat == 0) //move
{
CanGo(srcRow,srcCol,desRow,desCol);
m_ChessInfo.ChessMap[desRow][desCol].ChessPos = m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos;
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = 0;
for(int i=0;i<10;i++)
for(int j=0;j<11;j++)
{
m_ChessInfo.ChessMap[i][j].Icon = 0;
}
m_ChessInfo.ChessMap[srcRow][srcCol].Icon = 15;
m_ChessInfo.ChessMap[desRow][desCol].Icon = 15;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = 0;
if(m_ChessInfo.m_Turn == 0)
{
m_ChessInfo.m_Turn = 1;
m_StatusBar.SetText(" 该黑方走了",0,0);
}
else
{
m_ChessInfo.m_Turn = 0;
m_StatusBar.SetText(" 该红方走了",0,0);
}
}
else
{
if (eat = 0)
{
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = 0;
m_ChessInfo.ChessMap[desRow][desCol].Choise = 1;
}
}
}
UpdateFace(0,0,0);
return eat;
}
void CChessDlg::OnMenuitemComgo()
{
POSINFO fo,go={0};
m_ChessInfo.m_Turn = 1;
m_ChessInfo.FindChess();
SetCursor( m_hcuBusy );
//AddOneStep(go,&HaveMoveTable);
m_Loop ++;
AddDepth();
fo = m_Evaluation->FindBetter(m_ChessInfo,&go);
::AfxGetApp()->LoadStandardCursor(IDC_ARROW);
if(fo.srcCol==-1 && fo.srcRow ==-1 )
{
MessageBox("我输了,你太厉害了!","DeepThink",0);
return;
}
MoveTo(fo.desRow ,fo.desCol ,fo.srcRow ,fo.srcCol);
m_ChessInfo.FindChess();
//AddOneStep(fo,&HaveMoveTable);
m_Loop ++;
PrintStep(fo,1);
m_Evaluation->m_Depth = m_OldDepth;
if(RedLose())
{
MessageBox("对不起,你输了!","DeepThink",0);
return;
}
}
void CChessDlg::CanNotGo(int srcRow, int srcCol, int desRow, int desCol)
{
int srow,scol,/*drow,dcol,*/old,oldcho;
double stepx,stepy,drow,dcol;
srow = srcRow*YY+m_iSY-16;
scol = srcCol*XX+m_iSX-16;
drow = desRow*YY+m_iSY-16;
dcol = desCol*XX+m_iSX-16;
old = m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos;
oldcho = m_ChessInfo.ChessMap[srcRow][srcCol].Choise;
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = 0;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = 0;
m_CDCBuf.DrawIcon(scol,srow,m_hCheIco[old]);
UpdateFace(0,0,0);
stepx =(dcol-scol)/30;
stepy =(drow-srow)/30;
for(;;)
{
if(fabs(dcol-scol)<5 && fabs(drow-srow)<5) break;
dcol -= stepx;
drow -= stepy;
UpdateFace(int(dcol),int(drow),old);
}
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = old;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = oldcho ;
UpdateFace(0,0,0);
}
void CChessDlg::CanGo(int srcRow, int srcCol, int desRow, int desCol)
{
int /*srow,scol*/drow,dcol,old,oldcho;
double srow,scol,stepx,stepy;
srow = srcRow*YY+m_iSY-16;
scol = srcCol*XX+m_iSX-16;
drow = desRow*YY+m_iSY-16;
dcol = desCol*XX+m_iSX-16;
stepx =(dcol-scol)/20;
stepy =(drow-srow)/20;
old = m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos;
oldcho = m_ChessInfo.ChessMap[srcRow][srcCol].Choise;
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = 0;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = 0;
m_CDCBuf.DrawIcon(int(scol),int(srow),m_hCheIco[old]);
UpdateFace(0,0,0);
for(;;)
{
if(fabs(dcol-scol)<5 && fabs(drow-srow)<5) break;
scol +=stepx;
srow +=stepy;
UpdateFace(int(scol),int(srow),old);
}
m_ChessInfo.ChessMap[srcRow][srcCol].ChessPos = old;
m_ChessInfo.ChessMap[srcRow][srcCol].Choise = oldcho ;
UpdateFace(0,0,0);
}
void CChessDlg::DeleteAll()
{
}
int CChessDlg::GameStop()
{
int i=0,stop = 0;
m_ChessInfo.FindChess();
for(i=0;i<16;i++)
{
if(m_ChessInfo.Pos_16[RED][i].ChessPos == 1) stop++;
if(m_ChessInfo.Pos_16[BLA][i].ChessPos == 8) stop++;
}
if(stop==2) return FALSE;
else return TRUE;
}
void CChessDlg::OnUpdateMENUITEMClass1(CCmdUI* pCmdUI)
{
m_Evaluation->m_Depth = m_OldDepth = 2;
m_StatusBar.SetText(" 等级: 初学者",1,0);
}
void CChessDlg::OnUpdateMENUITEMClass2(CCmdUI* pCmdUI)
{
m_Evaluation->m_Depth = m_OldDepth = 3;
m_StatusBar.SetText(" 等级: 业余选手",1,0);
}
void CChessDlg::OnUpdateMENUITEMClass3(CCmdUI* pCmdUI)
{
m_Evaluation->m_Depth = m_OldDepth = 4;
m_StatusBar.SetText(" 等级: 专业选手",1,0);
}
void CChessDlg::OnUpdateMENUITEMClass4(CCmdUI* pCmdUI)
{
m_Evaluation->m_Depth = m_OldDepth = 5;
m_StatusBar.SetText(" 等级: 职业选手",1,0);
}
void CChessDlg::PrintStep(POSINFO p,int Turn)
{
CString s,temp;
m_Edit.GetWindowText(s);
if(Turn == 0)
{
if (p.ChessPos == RED_S || p.ChessPos == BLA_S ||
p.ChessPos == RED_X || p.ChessPos == BLA_X ||
p.ChessPos == RED_M || p.ChessPos == BLA_M)
{
if(p.desRow < p.srcRow)
{
temp.Format("%2d.%s%s进%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
if(p.desRow > p.srcRow)
{
temp.Format("%2d.%s%s退%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
}
else
{
if(p.desRow == p.srcRow)
{
temp.Format("%2d.%s%s平%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
if(p.desRow < p.srcRow)
{
temp.Format("%2d.%s%s进%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][9-(p.srcRow-p.desRow)]);
}
if(p.desRow > p.srcRow)
{
temp.Format("%2d.%s%s退%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][9-(p.desRow-p.srcRow)]);
}
}
}
else
{
if (p.ChessPos == RED_S || p.ChessPos == BLA_S ||
p.ChessPos == RED_X || p.ChessPos == BLA_X ||
p.ChessPos == RED_M || p.ChessPos == BLA_M)
{
if(p.desRow < p.srcRow)
{
temp.Format("%2d.%s%s退%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
if(p.desRow > p.srcRow)
{
temp.Format("%2d.%s%s进%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
}
else
{
if(p.desRow == p.srcRow)
{
temp.Format("%2d.%s%s平%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desCol]);
}
if(p.desRow < p.srcRow)
{
temp.Format("%2d.%s%s退%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.srcRow-p.desRow-1]);
}
if(p.desRow > p.srcRow)
{
temp.Format("%2d.%s%s进%s\r\n",m_Loop,CHESSNAME[p.ChessPos],ORDER[Turn][p.srcCol],ORDER[Turn][p.desRow-p.srcRow-1]);
}
}
}
s = temp + s;
m_Edit.SetWindowText(s);
}
void CChessDlg::AddDepth()
{
int i=0,count=0;
for(i=0;i<16;i++)
{
if(m_ChessInfo.Pos_16[0][i].ChessPos == 0) break;
else count++;
}
for(i=0;i<16;i++)
{
if(m_ChessInfo.Pos_16[1][i].ChessPos == 0) break;
else count++;
}
if(count<24 && count >=10) {m_Evaluation->m_Depth+=1;}
if(count<10 && count >=0) m_Evaluation->m_Depth+=2;
CString s;
s.Format("DeepThink -> %d", m_Evaluation->m_Depth);
SetWindowText(s);
}
void CChessDlg::OnMenuitemIlose()
{
if(MessageBox("你确定要认输?想想清楚哦!","DeepThink",4|MB_ICONQUESTION)==6)
{
OnMenuitemRestart();
}
}
int CChessDlg::RedLose()
{
POSINFO *pEat;
int count,old;
old = m_ChessInfo.m_Turn;
m_ChessInfo.m_Turn = 0;
pEat = m_ChessInfo.EnumList(count,0);
m_ChessInfo.DeletePoint(pEat);
m_ChessInfo.m_Turn = old;
if(count == 0) return 1;
else return 0;
}
void CChessDlg::AddOneStep(POSINFO fo, POSINFO **pHead)
{
POSINFO *node;
node = new POSINFO;
node->ChessPos = fo.ChessPos;
node->desCol = fo.desCol;
node->desRow = fo.desRow;
node->eat = fo.eat;
node->srcCol = fo.srcCol;
node->srcRow = fo.srcRow;
if(*pHead == NULL)
{
m_pTail = *pHead = node;
m_pTail->next = NULL;
}
else
{
m_pTail->next = node;
m_pTail = node;
m_pTail->next = NULL;
}
}
void CChessDlg::OnMenuitemAbout()
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -