⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chessdlg.cpp

📁 VC各工程的源码集合
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -