📄 chessdlg.cpp
字号:
m_pointPickUp.y=(m_Face.man[man].y-1)*BWA+SW;
m_nManPickUp=man;
m_Face.man[man].x=0;
FixManMap();
}
void CChessDlg::PutDown(int x,int y)
{
m_Face.man[m_nManPickUp].x=x;
m_Face.man[m_nManPickUp].y=y;
m_nManPickUp=32;
FixManMap();
CRect rc;
CPoint point((x-1)*BWA,(y-1)*BWA);
rc=MakeUpdateRect(m_pointPickUp,point);
UpdateFace(rc);
}
CRect CChessDlg::MakeUpdateRect(CPoint p1, CPoint p2)
{
CRect rc;
rc.SetRect(p1,p2);
rc.NormalizeRect();
rc.bottom+=BWA;
rc.right+=BWA;
return rc;
}
BOOL CChessDlg::FaceToPoint(CPoint &point)
{
if((point.x-XOFFSET)%BWA<SW||(point.x-XOFFSET)%BWA>BWA-SW)return FALSE;
if((point.y-YOFFSET)%BWA<SW||(point.y-YOFFSET)%BWA>BWA-SW)return FALSE;
CPoint p;
p.x=(point.x-XOFFSET)/BWA+1;
p.y=(point.y-YOFFSET)/BWA+1;
if(p.x<1||p.x>9||p.y<1||p.y>10)return FALSE;
point=p;
return TRUE;
}
void CChessDlg::OnDestroy()
{
CDialog::OnDestroy();
m_Thinker.Exit();
}
void CChessDlg::OnFileBai()
{
CBaiDlg baidlg(this);
baidlg.DoModal();
}
void CChessDlg::New(CFace face)
{
m_Thinker.Cut();
m_StepList.RemoveAll();
while(m_listStep.GetCount()!=0)m_listStep.DeleteString(0);
m_nStepCount=1;
switch(m_Setting.m_nMode)
{
case 0:
m_Setting.m_nPlayer[0]=!m_Setting.m_nPlayer[0];
m_Setting.m_nPlayer[1]=!m_Setting.m_nPlayer[1];
break;
case 1:
m_Setting.m_nPlayer[0]=0;
m_Setting.m_nPlayer[1]=1;
break;
case 2:
m_Setting.m_nPlayer[0]=1;
m_Setting.m_nPlayer[1]=0;
break;
}
EnableCommand(CHESS_C_UNDO,FALSE);
EnableCommand(CHESS_C_REDO,FALSE);
EnableCommand(CHESS_C_CUT ,FALSE);
m_bThinking=FALSE;
m_Face=face;
FixManMap();
m_nManPickUp=32;
CRect rc(0,0,BWA*9,BWA*10);
UpdateFace(rc);
ShowStatus();
if(m_Setting.m_nCOrM[m_Setting.m_nPlayer[m_Face.side]]==COM)
Think();
}
void CChessDlg::New()
{
CFace face;
New(face);
}
void CChessDlg::OnFileNew()
{
New();
}
void CChessDlg::OnFileSave()
{
CFileDialog filedlg(FALSE,"ccr","未命名",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"棋谱|*.ccr||",this);
int respond=filedlg.DoModal();
if(respond==IDOK)m_Face.Save(filedlg.GetFileName());
}
void CChessDlg::OnFileOpen()
{
CFileDialog filedlg(TRUE,"ccr","",NULL,"棋谱|*.ccr||",this);
int respond=filedlg.DoModal();
if(respond==IDOK)
{
CFace face;
if(face.Open(filedlg.GetFileName()))
{
if(face.IsNormal())New(face);
else
{
CString str;
str.Format("\"%s\"\n不是正确的棋谱",filedlg.GetFileName());
MessageBox(str,"错误-象棋",MB_OK|MB_ICONERROR);
}
}
else
{
CString str;
str.Format("不能打开\"%s\"",filedlg.GetFileName());
MessageBox(str,"错误-象棋",MB_OK|MB_ICONERROR);
}
}
}
void CChessDlg::OnEditUndo()
{
m_nStepCount--;
CStep* pStep=m_StepList.Undo();
if(pStep==NULL)
{
return;
}
m_progressStep.SetPos(0);
PickUp(pStep->man);
if(pStep->eaten!=32)
{
m_Face.man[pStep->eaten]=pStep->to;
FixManMap();
}
EnableCommand(CHESS_C_REDO,TRUE);
if(m_StepList.IsHead()) EnableCommand(CHESS_C_UNDO,FALSE);
Move(32,pStep->from.x,pStep->from.y);
m_Face.side=!m_Face.side;
m_listStep.DeleteString(m_listStep.GetCount()-1);
m_listStep.SetCurSel(m_listStep.GetCount()-1);
m_bThinking=FALSE;
ShowStatus();
EnableCommand(CHESS_C_CUT,FALSE);
}
void CChessDlg::EnableCommand(int n, BOOL benable)
{
CMenu* menu=GetMenu();
switch(n)
{
case CHESS_C_UNDO:
m_btUndo.EnableWindow(benable);
menu->EnableMenuItem(ID_CHESS_UNDO,!benable);
break;
case CHESS_C_REDO:
m_btRedo.EnableWindow(benable);
menu->EnableMenuItem(ID_CHESS_REDO,!benable);
break;
case CHESS_C_HELP:
m_btHelp.EnableWindow(benable);
menu->EnableMenuItem(ID_CHESS_HELP,!benable);
break;
case CHESS_C_CUT:
m_btCut.EnableWindow(benable);
menu->EnableMenuItem(ID_CHESS_CUT,!benable);
break;
}
}
void CChessDlg::OnEditRedo()
{
CStep* pStep=m_StepList.Redo();
if(pStep==NULL)
{
return;
}
EnableCommand(CHESS_C_UNDO,TRUE);
if(m_StepList.IsEnd()) EnableCommand(CHESS_C_REDO,FALSE);
m_listStep.AddString(GetStepName(pStep->man,pStep->to.x,pStep->to.y));
m_listStep.SetCurSel(m_listStep.GetCount()-1);
if(pStep->eaten!=32)m_Face.man[pStep->eaten].x=0;
m_Face.side=!m_Face.side;
Move(pStep->man,pStep->to.x,pStep->to.y);
m_nStepCount++;
ShowStatus();
}
void CChessDlg::OnTimer(UINT nIDEvent)
{
if(m_bThinking)
{
m_progressStep.SetPos(m_Thinker.GetPercent());
if(m_Thinker.IsThinkOver())
{
CMove move;
if(m_bThinking&&m_Thinker.GetMove(move,m_Face))
{
m_progressStep.SetPos(0);
if(!Go(move))
{
TRACE("Result is error!\n");
Think();
}
else TRACE("Result is OK!\n");
}
else TRACE("Can't get Move!\n");
}
}
CDialog::OnTimer(nIDEvent);
}
CString CChessDlg::GetStepName(int man, int x, int y)
{
int xfrom,yfrom;
if (man==32)
{
man=m_nManPickUp;
xfrom=m_pointBeforePickUp.x;
yfrom=m_pointBeforePickUp.y;
}
else
{
xfrom=m_Face.man[man].x;
yfrom=m_Face.man[man].y;
}
const char strman[14][3]=
{"帅","仕","相","马","车","炮","兵","将","士","象","马","车","炮","卒"};
const char strnumc[10][3]=
{"零","一","二","三","四","五","六","七","八","九"};
const char strnuma[10][3]=
{"0","1","2","3","4","5","6","7","8","9"};
const char strjpt[3][3]={"进","退","平"};
const char strqh[2][3]={"前","后"};
int j,nformat,nresult,njpt,ndis,nA=0,nB=0;
CString strresult;
if(SideOfMan[man]==RED)
{
for(j=yfrom-1 ;j>0;j--)
if(ManToType[man]==ManToType[m_nManMap[xfrom][j]] )nA++;
for(j=yfrom+1 ;j<11;j++)
if(ManToType[man]==ManToType[m_nManMap[xfrom][j]] )nB++;
if (nA+nB> 1) {nformat=2;nresult=nA+1;}
else if (nA+nB==1) {nformat=1;nresult=nA==0?0:1;}
else {nformat=0;nresult=10-xfrom;}
if (y> yfrom) njpt=1;
else if (y==yfrom) njpt=2;
else njpt=0;
if( ManToType[man]==RED_M||
ManToType[man]==RED_S||
ManToType[man]==RED_X)ndis=10-x;
else
{
switch(njpt)
{
case 0: ndis = yfrom-y; break;
case 1: ndis = y-yfrom; break;
case 2: ndis =10-x; break;
default: break;
}
}
switch(nformat)
{
case 0: strresult.Format("%s%s%s%s",
strman[ManToType[man]],
strnumc[nresult],
strjpt[njpt],
strnumc[ndis]);
break;
case 2: strresult.Format("%s%s%s%s",
strnuma[nresult],
strman[ManToType[man]],
strjpt[njpt],
strnumc[ndis]);
break;
case 1: strresult.Format("%s%s%s%s",
strqh[nresult],
strman[ManToType[man]],
strjpt[njpt],
strnumc[ndis]);
break;
default:break;
}
}
else //Black side
{
for(j=yfrom+1 ;j<11;j++)
if(ManToType[man]==ManToType[m_nManMap[xfrom][j]] )nA++;
for(j=yfrom-1 ;j>0 ;j--)
if(ManToType[man]==ManToType[m_nManMap[xfrom][j]] )nB++;
if (nA+nB> 1) {nformat=2;nresult=nA+1;}
else if (nA+nB==1) {nformat=1;nresult=nA==0?0:1;}
else {nformat=0;nresult=xfrom;}
if (y< yfrom) njpt=1;
else if (y==yfrom) njpt=2;
else njpt=0;
if( ManToType[man]==BLACK_M||
ManToType[man]==BLACK_S||
ManToType[man]==BLACK_X)ndis=x;
else
{
switch(njpt)
{
case 0: ndis = y-yfrom; break;
case 1: ndis = yfrom-y; break;
case 2: ndis = x; break;
default: break;
}
}
switch(nformat)
{
case 0: strresult.Format("%s%s%s%s",
strman[ManToType[man]],
strnuma[nresult],
strjpt[njpt],
strnuma[ndis]);
break;
case 2: strresult.Format("%s%s%s%s",
strnuma[nresult],
strman[ManToType[man]],
strjpt[njpt],
strnuma[ndis]);
break;
case 1: strresult.Format("%s%s%s%s",
strqh[nresult],
strman[ManToType[man]],
strjpt[njpt],
strnuma[ndis]);
break;
default:break;
}
}
CString str1;
str1.Format("%2d ",m_nStepCount);
return str1+strresult;
}
void CChessDlg::ShowStatus()
{
CString str,str1,str2;
str1=m_Face.side==BLACK?"黑":"红";
TestCheck();
if(m_Setting.m_nCOrM[m_Setting.m_nPlayer[m_Face.side]]==COM)
str2.Format("电脑%d级",m_Setting.m_nLevel);
else
str2="人";
str.Format("第%d步-%s方-棋手%d(%s)",
m_nStepCount,str1,m_Setting.m_nPlayer[m_Face.side]+1,str2);
if(m_bThinking)str+=" [Thinking ...]";
else
{
if (m_bCheck[0]||m_bCheck[1])
{
str+=" 将军!";
}
if (m_bCheck[0])str+=" 红方危险!";
if (m_bCheck[1])str+=" 黑方危险!";
}
SetWindowText(str);
}
void CChessDlg::Think()
{
if(CanGo())
{
m_Thinker.Think(m_Face);
m_bThinking=TRUE;
EnableCommand(CHESS_C_CUT);
ShowStatus();
}
}
void CChessDlg::OnEditHelp()
{
if(!m_bThinking)Think();
}
BOOL CChessDlg::Go(CMove move)
{
return Go(move.man,move.x,move.y);
}
BOOL CChessDlg::CanGo( const CMove &move)
{
return CanGo(move.man,move.x,move.y);
}
void CChessDlg::OnDblclkSteplist()
{
int count=m_listStep.GetCurSel();
count++;
while(m_nStepCount!=count)OnEditUndo();
}
BOOL CChessDlg::OpenURL(const char *LinkName)
{
HINSTANCE hRun = ShellExecute(GetParent()->GetSafeHwnd(), _T("open"), LinkName, NULL, NULL, SW_SHOW);
if ((int) hRun <= 32)
{
TRACE("Failed to invoke URL using ShellExecute\n");
return FALSE;
}
return TRUE;
}
void CChessDlg::OnHelpEmail()
{
OpenEmail();
}
void CChessDlg::OnHelpWeb()
{
// TODO: Add your command handler code here
OpenWeb();
}
BOOL CChessDlg::OpenEmail()
{
return OpenURL("mailto:thecct@netease.com");
}
BOOL CChessDlg::OpenWeb()
{
return OpenURL("http://thecct.go.163.com");
}
void CAboutDlg::OnButtonweb()
{
((CChessDlg*)GetParent())->OpenWeb();
}
void CAboutDlg::OnButtonemail()
{
((CChessDlg*)GetParent())->OpenEmail();
}
void CChessDlg::OnEditCut()
{
if(m_bThinking)
{
m_Thinker.Cut();
m_bThinking=FALSE;
EnableCommand(CHESS_C_CUT,FALSE);
ShowStatus();
m_progressStep.SetPos(0);
}
}
void CChessDlg::OnFileThinkOption()
{
CThinkOptionDlg dlg;
m_Thinker.Cut();
m_bThinking=FALSE;
ShowStatus();
dlg.m_edits1=m_Thinker.BV1[1];
dlg.m_editx1=m_Thinker.BV1[2];
dlg.m_editm1=m_Thinker.BV1[3];
dlg.m_editj1=m_Thinker.BV1[4];
dlg.m_editp1=m_Thinker.BV1[5];
dlg.m_editb1=m_Thinker.BV1[6];
dlg.m_edits2=m_Thinker.BV2[1];
dlg.m_editx2=m_Thinker.BV2[2];
dlg.m_editm2=m_Thinker.BV2[3];
dlg.m_editj2=m_Thinker.BV2[4];
dlg.m_editp2=m_Thinker.BV2[5];
dlg.m_editb2=m_Thinker.BV2[6];
dlg.m_edit30=m_Thinker.BV3[0];
dlg.m_edit31=m_Thinker.BV3[1];
dlg.m_edit32=m_Thinker.BV3[2];
dlg.m_edit33=m_Thinker.BV3[3];
dlg.m_edit34=m_Thinker.BV3[4];
int respond=dlg.DoModal();
if(respond==IDOK)
{
m_Thinker.BV1[1]=dlg.m_edits1;
m_Thinker.BV1[2]=dlg.m_editx1;
m_Thinker.BV1[3]=dlg.m_editm1;
m_Thinker.BV1[4]=dlg.m_editj1;
m_Thinker.BV1[5]=dlg.m_editp1;
m_Thinker.BV1[6]=dlg.m_editb1;
m_Thinker.BV2[1]=dlg.m_edits2;
m_Thinker.BV2[2]=dlg.m_editx2;
m_Thinker.BV2[3]=dlg.m_editm2;
m_Thinker.BV2[4]=dlg.m_editj2;
m_Thinker.BV2[5]=dlg.m_editp2;
m_Thinker.BV2[6]=dlg.m_editb2;
m_Thinker.BV3[0]=dlg.m_edit30;
m_Thinker.BV3[1]=dlg.m_edit31;
m_Thinker.BV3[2]=dlg.m_edit32;
m_Thinker.BV3[3]=dlg.m_edit33;
m_Thinker.BV3[4]=dlg.m_edit34;
m_Thinker.SaveThinkSetting();
}
}
void CChessDlg::TestCheck()
{
int i;
m_bCheck[0]=FALSE;
m_bCheck[1]=FALSE;
FixManMap();
if(m_Face.man[16].x )
for (i=0;i<=15;i++)
{
if(!m_Face.man[i].x)continue;
if(::CanGo(m_nManMap
,i
,m_Face.man[i].x,m_Face.man[i].y
,m_Face.man[16].x,m_Face.man[16].y))
{
m_bCheck[1]=TRUE;
break;
}
}
if(m_Face.man[0].x )
for (i=16;i<=31;i++)
{
if(!m_Face.man[i].x)continue;
if(::CanGo(m_nManMap,i
,m_Face.man[i].x,m_Face.man[i].y
,m_Face.man[0].x,m_Face.man[0].y))
{
m_bCheck[0]=TRUE;
break;
}
}
}
void CChessDlg::OnHelpUse()
{
HINSTANCE hRun = ShellExecute(GetParent()->GetSafeHwnd(), _T("open"), "chesshelp.html", NULL, NULL, SW_SHOW);
if ((int) hRun <= 32)
{
MessageBox("找不到帮助文件\"chesshelp.html\"","错误",MB_ICONERROR);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -