📄 fivedlg.cpp
字号:
// FiveDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Five.h"
#include "AI.h"
#include "FiveDlg.h"
#include <Mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFiveDlg dialog
CFiveDlg::CFiveDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFiveDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFiveDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hBKG.CreateSolidBrush(RGB(33,65,96));
m_rtBoard = CRect(FIVE_MARGIN+10,FIVE_MARGIN+10,FIVE_MARGIN+FIVE_WIDTH*(FIVE_X-1)+10, FIVE_MARGIN+FIVE_HEIGHT*(FIVE_Y-1)+10);
m_rtSelect = CRect(0,0,0,0);
m_penSelect.CreatePen( PS_SOLID, 1, RGB(55,55,85) );
m_bmpWhite.LoadBitmap(IDB_WHITE);
m_bmpBlack.LoadBitmap(IDB_BLACK);
m_nGameStatus = GAME_END;
m_bSelect = FALSE;
m_bConnected = FALSE;
}
void CFiveDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFiveDlg)
DDX_Control(pDX, IDC_ANIMATE_SNOOPY, m_Animate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFiveDlg, CDialog)
//{{AFX_MSG_MAP(CFiveDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_WM_CTLCOLOR()
ON_COMMAND(ID_GAME_EXIT, OnGameExit)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_OPTIONS_HVH, OnOptionsHvh)
ON_UPDATE_COMMAND_UI(ID_ACTION_SURRENDER, OnUpdateActionSurrender)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_HVH, OnUpdateOptionsHvh)
ON_COMMAND(ID_GAME_NEW, OnGameNew)
ON_COMMAND(ID_OPTIONS_COMPUTER, OnOptionsComputer)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_COMPUTER, OnUpdateOptionsComputer)
ON_COMMAND(ID_OPTIONS_HUMAN, OnOptionsHuman)
ON_UPDATE_COMMAND_UI(ID_OPTIONS_HUMAN, OnUpdateOptionsHuman)
ON_COMMAND(ID_ACTION_SURRENDER, OnActionSurrender)
ON_COMMAND(ID_OPTIONS_SETTINGS, OnOptionsSettings)
ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
ON_COMMAND(ID_OPTIONS_SERVER, OnOptionsServer)
ON_COMMAND(ID_OPTIONS_CLIENT, OnOptionsClient)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFiveDlg message handlers
void CFiveDlg::OnOK(){}
void CFiveDlg::OnCancel(){}
BOOL CFiveDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ai.SetParentWnd(this);
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_nCurrentSide = FIVE_NULL;
if(GetMenu()->GetMenuState(ID_OPTIONS_HUMAN, MF_CHECKED)){// human white
m_PlayerWhite = FIVE_HUMAN;
m_PlayerBlack = FIVE_COMPUTER;
}
if(GetMenu()->GetMenuState(ID_OPTIONS_COMPUTER, MF_CHECKED)){// computer white
m_PlayerWhite = FIVE_COMPUTER;
m_PlayerBlack = FIVE_HUMAN;
}
if(GetMenu()->GetMenuState(ID_OPTIONS_HVH, MF_CHECKED)){// human vs human
m_PlayerWhite = FIVE_HUMAN;
m_PlayerBlack = FIVE_HUMAN;
}
if(GetMenu()->GetMenuState(ID_OPTIONS_SERVER, MF_CHECKED)){// net vs
m_PlayerWhite = FIVE_NETServer;
m_PlayerBlack = FIVE_NETClient;
}
if(GetMenu()->GetMenuState(ID_OPTIONS_CLIENT, MF_CHECKED)){// net vs
m_PlayerWhite = FIVE_NETServer;
m_PlayerBlack = FIVE_NETClient;
}
//default value
// 0 5 15000 15000 15000
// 100 3000 5000 100
// 500 1500 500 100
// 5000 500 100 30 6
m_pSetDlg.m_edit1 = 0;
m_pSetDlg.m_edit2 = 8;
m_pSetDlg.m_edit3 = 15000;
m_pSetDlg.m_edit4 = 15000;
m_pSetDlg.m_edit5 = 15000;
m_pSetDlg.m_edit6 = 100;
m_pSetDlg.m_edit7 = 30;
m_pSetDlg.m_edit8 = 5000;
m_pSetDlg.m_edit9 = 100;
m_pSetDlg.m_edit10 = 500;
m_pSetDlg.m_edit11 = 1500;
m_pSetDlg.m_edit12 = 250;
m_pSetDlg.m_edit13 = 100;
m_pSetDlg.m_edit14 = 5000;
m_pSetDlg.m_edit15 = 250;
m_pSetDlg.m_edit16 = 100;
m_pSetDlg.m_edit17 = 30;
m_pSetDlg.m_edit18 = 10;
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);
m_Animate.Open("snoopy.avi");
m_Animate.Play(0, -1, -1);
return TRUE; // return TRUE unless you set the focus to a control
}
void CFiveDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CFiveDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
DrawBoard();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFiveDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CFiveDlg::OnClose()
{
if(MessageBox("你确定要退出吗?", "退出", MB_YESNO|MB_ICONQUESTION)==IDYES){
//CDialog::OnClose();
//m_bSelect = FALSE;
CDialog::OnOK();
}
}
HBRUSH CFiveDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch(nCtlColor){
case CTLCOLOR_DLG:
pDC->SetBkColor(RGB(33,65,96));
return m_hBKG;
default:
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
}
void CFiveDlg::OnGameExit()
{
if(MessageBox("你确定要退出吗?", "退出", MB_YESNO|MB_ICONQUESTION)==IDYES)
CDialog::OnOK();
}
char CFiveDlg::PlacePiece(char nSide, int x, int y, BOOL redraw)
{
if(m_nGameStatus==GAME_END) return FIVE_NULL;
if(m_ai.m_nboard[x][y]!=FIVE_NULL && !redraw) return FIVE_NULL;
if(nSide==FIVE_NULL ) return FIVE_NULL;
CClientDC dc(this);
CDC dcPiece;
dcPiece.CreateCompatibleDC(&dc);
if(!redraw && m_bSelect){//there is only one possible condition m_bSelect==false,
//that is cursor out of board. so erase select cursor
dc.SelectObject(&m_penSelect);
dc.SetROP2(R2_NOTXORPEN);
dc.Rectangle(&m_rtSelect);
m_bSelect=FALSE;
}
if(nSide==FIVE_WHITE)
dcPiece.SelectObject(&m_bmpWhite);
else if(nSide==FIVE_BLACK)
dcPiece.SelectObject(&m_bmpBlack);
dc.BitBlt(m_rtBoard.left+x*FIVE_WIDTH-FIVE_CURSOR_WIDTH/2,
m_rtBoard.top+y*FIVE_HEIGHT-FIVE_CURSOR_HEIGHT/2,
m_rtBoard.left+(x+1)*FIVE_WIDTH+FIVE_CURSOR_WIDTH/2,
m_rtBoard.top+(y+1)*FIVE_HEIGHT+FIVE_CURSOR_HEIGHT/2,
&dcPiece,0,0,SRCCOPY);
if(!redraw){
SoundEffect(SOUND_PUT);
m_ai.m_nboard[x][y]=nSide;
m_nCurrentSide = (m_nCurrentSide==FIVE_WHITE)?FIVE_BLACK:FIVE_WHITE;
}
if(!redraw && !m_bSelect){
dc.SelectObject(&m_penSelect);
dc.SetROP2(R2_NOTXORPEN);
dc.Rectangle(&m_rtSelect);
m_bSelect=TRUE;
}
if(!redraw){
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("白方");
}
if(!redraw && m_ai.IfWin(nSide)){
CEdit * pEdit = (CEdit*)GetDlgItem(IDC_EDIT_WINNER);
pEdit->SetSel(0,-1);
if(nSide==FIVE_BLACK){
pEdit->ReplaceSel("黑方获胜");
if (m_PlayerBlack==FIVE_HUMAN)
SoundEffect(SOUND_WIN);
else
SoundEffect(SOUND_LOSE);
}
if(nSide==FIVE_WHITE){
pEdit->ReplaceSel("白方获胜");
if(m_PlayerWhite==FIVE_HUMAN)
SoundEffect(SOUND_WIN);
else
SoundEffect(SOUND_LOSE);
}
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SIDE);
pEdit->SetSel(0,-1);
pEdit->ReplaceSel("游戏结束");
m_nGameStatus = GAME_END;
return nSide;
}
dc.SelectStockObject(BLACK_BRUSH);
dcPiece.SelectStockObject(BLACK_BRUSH);
ReleaseDC(&dc);
ReleaseDC(&dcPiece);
return FIVE_NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -