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

📄 chessdlg.cpp

📁 一个简单的象棋游戏源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			
			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);
	m_staticMail.SetMail("ahei080210114@hotmail.com");
	m_staticMyWeb.SetURL("http://home.pudn.com/ahei");
	m_ToolTip.Create(this);
	m_ToolTip.Activate(1);
	m_ToolTip.AddTool(GetDlgItem(IDC_STATIC_QQ),"单击复制我的QQ号");

	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--;

	if(m_stackUndoMove.empty())
		m_btnUndo.EnableWindow(0);

	//重绘屏幕  
	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_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
	if(m_stackUndoMove.empty())
	{
		m_staticTip.SetWindowText("呵呵,无棋局可预览");
		return;
	}

	m_Status=Previewing;
}

void CChessDlg::OnPreviewover() 
{
	// TODO: Add your command handler code here
	m_Status=Chessing;
	memcpy(m_byShowChessBoard,m_byChessBoard,90);
	memcpy(m_byBackupChessBoard,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);
	if(m_Status==Previewing)
		m_staticTip.SetWindowText("再单击一下右边的走法记录,即可恢复");
	else
		m_staticTip.SetWindowText("再单击一下棋盘,即可恢复");

	//重绘屏幕  
	InvalidateRect(NULL,FALSE);
	UpdateWindow();	
}

void CAboutDlg::OnOK() 
{
	// TODO: Add extra validation here
	AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_BLEND);

	CDialog::OnOK();
}

void CAboutDlg::OnStaticQq() 
{
	// TODO: Add your control notification handler code here
	CString str="8261525"; 
	HGLOBAL h=GlobalAlloc(GHND | GMEM_SHARE,str.GetLength()+1); 

	::OpenClipboard(this->m_hWnd); 
	::EmptyClipboard();
	
	strcpy((LPSTR)GlobalLock(h),str); 
	GlobalUnlock(h); 
	::SetClipboardData(CF_TEXT,h); 
	::CloseClipboard(); 
}

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_ToolTip.RelayEvent(pMsg);

	return CDialog::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -