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

📄 chessdlg.cpp

📁 算法比较复杂的人机像棋,运行速度也是非常之块的。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//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 + -