📄 fivedlg.cpp
字号:
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 + -