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

📄 fivedlg.cpp

📁 用Microsoft .net编的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:


void CFiveDlg::DrawBoard()
{
	CClientDC dc(this);
	//CPen pen(PS_SOLID, 1, RGB(200,225,210));
	CBrush boardbrush(RGB(117, 186, 255));
	CPen pen(PS_SOLID, 1, RGB(33,65,96));
	//CPen boardpen(PS_SOLID, 1, RGB(1,21,0));
	//dc.SelectObject(&boardpen);
	dc.SelectObject(&boardbrush);
	dc.SetROP2(R2_COPYPEN);
	dc.Rectangle(m_rtBoard.left-FIVE_WIDTH/2,
				m_rtBoard.top-FIVE_HEIGHT/2 ,
				m_rtBoard.right+FIVE_WIDTH/2 ,
				m_rtBoard.bottom+FIVE_HEIGHT/2);
	CRgn rgn;
	rgn.CreateRectRgn(m_rtBoard.left-FIVE_WIDTH/2,
				m_rtBoard.top-FIVE_HEIGHT/2 ,
				m_rtBoard.right+FIVE_WIDTH/2 ,
				m_rtBoard.bottom+FIVE_HEIGHT/2);
	dc.FillRgn(&rgn, &boardbrush);
	dc.SelectObject(&pen);
	int i,j;
	for(i=0; i<FIVE_X-1; i++)
		for(j=0; j<FIVE_Y-1; j++)
			dc.Rectangle(
				m_rtBoard.left+FIVE_WIDTH*i,
				m_rtBoard.top+FIVE_HEIGHT*j,
				m_rtBoard.left+FIVE_WIDTH*(i+1),
				m_rtBoard.top+FIVE_HEIGHT*(j+1));
	for(i=0; i<FIVE_X; i++)
		for(j=0; j<FIVE_Y; j++)
			PlacePiece(m_ai.m_nboard[i][j], i, j, TRUE);
	//deselect
	dc.SelectStockObject(BLACK_BRUSH);
}

void CFiveDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(!GetFocus()) return;
	int x,y;
	CRect rt;
	CClientDC dc(this);
	dc.SelectObject(&m_penSelect);
	dc.SetROP2(R2_NOTXORPEN);

	if(CalLogicPos(point, x, y)){//in board
		if(m_bSelect) dc.Rectangle(&m_rtSelect);//erase cursor
		m_bSelect = FALSE;
		rt.left = m_rtBoard.left+FIVE_WIDTH*x-FIVE_CURSOR_WIDTH/2;
		rt.top = m_rtBoard.top+FIVE_HEIGHT*y-FIVE_CURSOR_HEIGHT/2;
		rt.right = m_rtBoard.left+FIVE_WIDTH*x+FIVE_CURSOR_WIDTH/2;
		rt.bottom = m_rtBoard.top+FIVE_HEIGHT*y+FIVE_CURSOR_HEIGHT/2;
		dc.Rectangle(&rt);//draw new cursor
		m_rtSelect = rt;
		m_bSelect = TRUE; 
	}else{//out of board, erase cursor temporarily.
		if(m_bSelect) dc.Rectangle(&m_rtSelect);
		m_bSelect = FALSE;
	}
	
	//deselect
	dc.SelectStockObject(BLACK_BRUSH);
	CDialog::OnMouseMove(nFlags, point);
}

void CFiveDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int x, y;
	//net play
	if(m_nGameStatus == GAME_END) return;
	//i am server and first play
	if(m_nCurrentSide==FIVE_WHITE && m_PlayerWhite==FIVE_NETServer && m_LocalPlayer==FIVE_NETServer ){
		if(CalLogicPos(point, x, y)) {
			//local
			m_ServerDlg.m_SocketTransfer.Send(&x, sizeof(int));
			m_ServerDlg.m_SocketTransfer.Send(&y, sizeof(int));
			PlacePiece(m_nCurrentSide, x, y, FALSE);
			if(m_ai.IfWin(FIVE_WHITE) || m_ai.IfWin(FIVE_BLACK))
			m_ServerDlg.m_SocketServer.Close();
			//remote
			m_ServerDlg.m_SocketTransfer.Receive(&x, sizeof(int));
			m_ServerDlg.m_SocketTransfer.Receive(&y, sizeof(int));
			PlacePiece(m_nCurrentSide, x, y, FALSE);
			if(m_ai.IfWin(FIVE_WHITE) || m_ai.IfWin(FIVE_BLACK))
			m_ServerDlg.m_SocketServer.Close();
		}
		return;
	}
	//or i am Client
	if(m_nCurrentSide==FIVE_BLACK && m_PlayerBlack==FIVE_NETClient && m_LocalPlayer==FIVE_NETClient ){
		if(CalLogicPos(point, x, y)) {
			//local
			m_ClientDlg.m_SocketClient.Send(&x, sizeof(int));
			m_ClientDlg.m_SocketClient.Send(&y, sizeof(int));
			PlacePiece(m_nCurrentSide, x, y, FALSE);
			if(m_ai.IfWin(FIVE_WHITE) || m_ai.IfWin(FIVE_BLACK))
			m_ClientDlg.m_SocketClient.Close();
			//remote
			m_ClientDlg.m_SocketClient.Receive(&x, sizeof(int));
			m_ClientDlg.m_SocketClient.Receive(&y, sizeof(int));
			PlacePiece(m_nCurrentSide, x, y, FALSE);
			if(m_ai.IfWin(FIVE_WHITE) || m_ai.IfWin(FIVE_BLACK))
			m_ClientDlg.m_SocketClient.Close();
		}
		return;
	}
	
	//assert not computer's turn (computer is not thinking)
	if(m_nGameStatus == GAME_END) return;
	if( !(m_nCurrentSide==FIVE_WHITE && m_PlayerWhite == FIVE_COMPUTER)
		&& !(m_nCurrentSide==FIVE_BLACK && m_PlayerBlack == FIVE_COMPUTER) ){
		CDialog::OnLButtonDown(nFlags, point);	
		if(CalLogicPos(point, x, y)) PlacePiece(m_nCurrentSide, x, y, FALSE);
	}

	//assert computer's turn
	if(m_nGameStatus == GAME_END) return;
	if( (m_nCurrentSide==FIVE_BLACK && m_PlayerBlack == FIVE_COMPUTER) ||
		(m_nCurrentSide==FIVE_WHITE && m_PlayerWhite == FIVE_COMPUTER)){
		m_ai.Play(x, y, m_nCurrentSide);
		PlacePiece(m_nCurrentSide, x, y, FALSE);
	}
}

BOOL CFiveDlg::CalLogicPos(CPoint point, int &x, int &y)
{
	CPoint pt;
	CSize sz;
	if(!m_rtBoard.PtInRect(point)) return FALSE;
	//mouse in board
	for(int i=0; i<FIVE_X; i++)
		for(int j=0; j<FIVE_Y; j++){
			pt.x=m_rtBoard.left+FIVE_WIDTH*i;
			pt.y=m_rtBoard.top+FIVE_HEIGHT*j;
			sz = pt - point;
			if (abs(sz.cx) < FIVE_CURSOR_WIDTH/2 && abs(sz.cy) < FIVE_CURSOR_HEIGHT/2){
				x = i; y = j;
				return TRUE;
			}
		}
	return FALSE;
}

void CFiveDlg::OnGameNew() 
{
	int i,j;
	for(i=0; i<FIVE_X; i++)
		for(j=0; j<FIVE_Y; j++)
			m_ai.m_nboard[i][j]=FIVE_NULL;
	DrawBoard();
	m_nGameStatus = GAME_RUN;
	m_nCurrentSide = FIVE_WHITE;
	if(m_PlayerWhite==FIVE_COMPUTER){
		m_ai.Play(i, j, m_nCurrentSide);
		PlacePiece(m_nCurrentSide, i, j, FALSE);
	}
	CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SIDE);
	pEdit->SetSel(0,-1);
	if(m_nCurrentSide==FIVE_BLACK)
		pEdit->ReplaceSel("黑方");
	if(m_nCurrentSide==FIVE_WHITE)
		pEdit->ReplaceSel("白方");
	pEdit = (CEdit*)GetDlgItem(IDC_EDIT_WINNER);
	pEdit->SetSel(0,-1);
	pEdit->ReplaceSel("游戏进行");
}

BOOL CFiveDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_PAINT){//erase old cursor
		//Invalidate();
		m_bSelect = FALSE;
	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CFiveDlg::OnOptionsHvh() 
{
	m_PlayerWhite = m_PlayerBlack = FIVE_HUMAN;
}
void CFiveDlg::OnOptionsHuman() 
{
	m_PlayerWhite=FIVE_HUMAN;
	m_PlayerBlack=FIVE_COMPUTER;
	GetMenu()->CheckMenuItem(ID_OPTIONS_HUMAN, MF_CHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_COMPUTER, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_HVH, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_SERVER, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_CLIENT, MF_UNCHECKED);
}
void CFiveDlg::OnOptionsComputer() 
{
	m_PlayerWhite=FIVE_COMPUTER;
	m_PlayerBlack=FIVE_HUMAN;
	GetMenu()->CheckMenuItem(ID_OPTIONS_HUMAN, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_COMPUTER, MF_CHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_HVH, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_SERVER, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_CLIENT, MF_UNCHECKED);
}


void CFiveDlg::OnUpdateOptionsHvh(CCmdUI* pCmdUI) 
{
	if(m_PlayerWhite==FIVE_HUMAN && m_PlayerBlack==FIVE_HUMAN)
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);
	GetMenu()->CheckMenuItem(ID_OPTIONS_HUMAN, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_COMPUTER, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_NET, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_HVH, MF_CHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_SERVER, MF_UNCHECKED);
	GetMenu()->CheckMenuItem(ID_OPTIONS_CLIENT, MF_UNCHECKED);


}

void CFiveDlg::OnUpdateOptionsHuman(CCmdUI* pCmdUI) 
{
	if(m_PlayerWhite==FIVE_HUMAN && m_PlayerBlack==FIVE_COMPUTER)
		pCmdUI->SetCheck(TRUE);	
	else
		pCmdUI->SetCheck(FALSE);
}

void CFiveDlg::OnUpdateOptionsComputer(CCmdUI* pCmdUI) 
{
	if(m_PlayerWhite==FIVE_COMPUTER && m_PlayerBlack==FIVE_HUMAN)
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);
}

void CFiveDlg::OnActionSurrender() 
{
	
	//m_bSelect = FALSE;
	if(m_nGameStatus == GAME_END) return;
	CEdit * pEdit = (CEdit*)GetDlgItem(IDC_EDIT_WINNER);
	pEdit->SetSel(0,-1);
	pEdit->ReplaceSel(m_nCurrentSide == FIVE_WHITE ? "白方获胜":"黑方获胜");
	if ((m_nCurrentSide == FIVE_WHITE && m_PlayerWhite == FIVE_HUMAN) ||
		(m_nCurrentSide == FIVE_BLACK && m_PlayerBlack == FIVE_HUMAN))
		SoundEffect(SOUND_LOSE);	
	else
		SoundEffect(SOUND_WIN);
		
	pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SIDE);
	pEdit->SetSel(0,-1);
	pEdit->ReplaceSel("游戏结束");
	m_nGameStatus = GAME_END;			
}

void CFiveDlg::OnUpdateActionSurrender(CCmdUI* pCmdUI) 
{
	if(m_nGameStatus == GAME_END)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}


void CFiveDlg::OnOptionsSettings() 
{
	
	if(m_pSetDlg.DoModal()==IDOK){
		int params[18];
		params[0]= m_pSetDlg.m_edit1;
		params[1]= m_pSetDlg.m_edit2;
		params[2]= m_pSetDlg.m_edit3;
		params[3]= m_pSetDlg.m_edit4;
		params[4]= m_pSetDlg.m_edit5;
		params[5]= m_pSetDlg.m_edit6;
		params[6]= m_pSetDlg.m_edit7;
		params[7]= m_pSetDlg.m_edit8;
		params[8]= m_pSetDlg.m_edit9;
		params[9]= m_pSetDlg.m_edit10;
		params[10]= m_pSetDlg.m_edit11;
		params[11]= m_pSetDlg.m_edit12;
		params[12]= m_pSetDlg.m_edit13;
		params[13]= m_pSetDlg.m_edit14;
		params[14]= m_pSetDlg.m_edit15;
		params[15]= m_pSetDlg.m_edit16;
		params[16]= m_pSetDlg.m_edit17;
		params[17]= m_pSetDlg.m_edit18;
		//set parameters to AI class
		m_ai.SetValueSettings(params, 18);
	}
}

void CFiveDlg::SoundEffect(int nType)
{
	CString file;
	switch(nType){
	case SOUND_PUT:
		::sndPlaySound("put.wav" ,SND_SYNC);
		break;
	case SOUND_WIN:
		file.Format("Win%d.wav", rand()%5);
		::sndPlaySound(file ,SND_ASYNC);
		break;
	case SOUND_LOSE:
		file.Format("Lose%d.wav", rand()%5);
		::sndPlaySound(file ,SND_ASYNC);
		break;
	case SOUND_CHIMES:
		::sndPlaySound("chimes.wav" ,SND_ASYNC);
		break;
	
	}
}

void CFiveDlg::OnHelpAbout() 
{
	CAboutDlg dlg;
	SoundEffect(SOUND_CHIMES);
	dlg.DoModal();
}

void CFiveDlg::OnOptionsServer() 
{
	
	if(m_ServerDlg.DoModal()==IDOK && m_ServerDlg.m_Connected){
		//connected
		m_PlayerWhite = FIVE_NETServer;
		m_PlayerBlack = FIVE_NETClient;
		GetMenu()->CheckMenuItem(ID_OPTIONS_HUMAN, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_COMPUTER, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_SERVER, MF_CHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_CLIENT, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_HVH, MF_UNCHECKED);
		m_LocalPlayer = FIVE_NETServer;
		m_PlayerWhite = FIVE_NETServer;
		m_PlayerBlack = FIVE_NETClient;
		m_nGameStatus = GAME_RUN;
		m_nCurrentSide = FIVE_WHITE;
	}
}

void CFiveDlg::OnOptionsClient() 
{
	if(m_ClientDlg.DoModal()==IDOK && m_ClientDlg.m_Connected){
		//connected
		m_PlayerWhite = FIVE_NETServer;
		m_PlayerBlack = FIVE_NETClient;
		GetMenu()->CheckMenuItem(ID_OPTIONS_HUMAN, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_COMPUTER, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_SERVER, MF_UNCHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_CLIENT, MF_CHECKED);
		GetMenu()->CheckMenuItem(ID_OPTIONS_HVH, MF_UNCHECKED);
		m_LocalPlayer = FIVE_NETClient;
		m_PlayerWhite = FIVE_NETServer;
		m_PlayerBlack = FIVE_NETClient;
		m_nGameStatus = GAME_RUN;
		m_nCurrentSide = FIVE_WHITE;
		//receive the first step
		int x, y;
		if(!m_ClientDlg.m_SocketClient.Receive(&x, sizeof(int))){
			MessageBox("Unknowned error!");
			m_ClientDlg.m_Connected = FALSE;
			return;
		}
		if(!m_ClientDlg.m_SocketClient.Receive(&y, sizeof(int))){
			MessageBox("Unknowned error!");
			m_ClientDlg.m_Connected = FALSE;
			return;
		}
		PlacePiece(m_nCurrentSide, x, y, FALSE);
		//m_nCurrentSide = FIVE_BLACK;
	}	
}

⌨️ 快捷键说明

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