📄 ms5dlg.cpp
字号:
// ms5Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "ms5.h"
#include "ms5Dlg.h"
#include "math.h"
#include "FiveStoneProcess.h"
#include "fstream.h"
#include "mmsystem.h"
#include "CVSCDlg.h"
#include "About.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define STRLEN 1024
BOOL m_renren;//是否是人人模式
BOOL stop;
int debugcolor = 1;//1为黑,2为白
BOOL debug = false;//标志是否处于调试程序状态
FiveStoneProcess fivestone;
CWnd *thisdlg;
HWND thiswnd;
BOOL first = false;//表示计算机是否先走
int points[16][16];
POINT steps[225];//保存一盘中走的棋
int stepcount;//走的总棋数
BOOL soundeffect;//是否有音效
BOOL is_cvsc;//是否是电脑宝宝对下
int grade;//1-5,表示计算机的智力等级
BOOL goblack;//控制是否在cvsc线程中走黑棋
HANDLE cvscThread = NULL;
CBitmap bmp[9];//这里存放各个图片
int round(double x)
{
double iptr;
if (modf(x,&iptr)>=0.5) iptr+=1;
return (int)iptr;
}
BOOL IsFileValid(LPCSTR path)
{
unsigned int attribs;
attribs = GetFileAttributes(path);
if (attribs == 0xFFFFFFFF)
return FALSE;
else
return (attribs & FILE_ATTRIBUTE_DIRECTORY ? FALSE : TRUE);
}
CRect getpointRect(int x, int y)
{
//用于得到一个子的矩形区域
CRect rect;
rect.top = 24*y-5;
rect.bottom = 24*y+15;
rect.left = 24*x-5;
rect.right = 24*x+15;
return rect;
}
/////////////////////////////////////////////////////////////////////////////
// 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)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMs5Dlg dialog
CMs5Dlg::CMs5Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMs5Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMs5Dlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
soundeffect = true;
is_cvsc = false;
stop = false;
m_renren = false;
}
CMs5Dlg::~CMs5Dlg()
{
for (int i=0;i<9;i++)
bmp[i].DeleteObject();
conn.Close();
}
void CMs5Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMs5Dlg)
DDX_Control(pDX, IDC_THINKPROCESS, m_thinkprocess);
DDX_Control(pDX, IDC_CLEARSCORE, m_clearscore);
DDX_Control(pDX, IDC_WINRATIO, m_winratio);
DDX_Control(pDX, IDC_TIERATIO, m_tieratio);
DDX_Control(pDX, IDC_WINNUM, m_winnum);
DDX_Control(pDX, IDC_TIENUM, m_tienum);
DDX_Control(pDX, IDC_LOSSRATIO, m_lossratio);
DDX_Control(pDX, IDC_LOSSNUM, m_lossnum);
DDX_Control(pDX, IDC_CONTINUE, m_continue);
DDX_Control(pDX, IDC_LAST, m_last);
DDX_Control(pDX, IDC_FIRST, m_first);
DDX_Control(pDX, IDC_NEXT, m_next);
DDX_Control(pDX, IDC_PRE, m_pre);
DDX_Control(pDX, IDC_OUTINFO, m_outinfo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMs5Dlg, CDialog)
//{{AFX_MSG_MAP(CMs5Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_LBUTTONDOWN()
ON_COMMAND(IDM_START, OnStart)
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDM_EXIT, OnExit)
ON_COMMAND(IDM_ALIVE, OnAlive)
ON_COMMAND(IDM_TWOLEVEL, OnTwolevel)
ON_COMMAND(IDM_ERASE, OnErase)
ON_COMMAND(IDM_MAKEALIVE, OnMakealive)
ON_COMMAND(IDM_MAKETWOLEVEL, OnMaketwolevel)
ON_COMMAND(IDM_GETALLPOINTS, OnGetallpoints)
ON_COMMAND(IDM_AROUND, OnAround)
ON_COMMAND(IDM_RUN, OnRun)
ON_COMMAND(IDM_DEBUG, OnDebug)
ON_COMMAND(IDM_FIVE, OnFive)
ON_COMMAND(IDM_CHANGE, OnChange)
ON_COMMAND(IDM_ADVICE, OnAdvice)
ON_COMMAND(IDM_SAVE, OnSave)
ON_COMMAND(IDM_LOAD, OnLoad)
ON_COMMAND(IDM_REGRET, OnRegret)
ON_COMMAND(IDM_QIANMODEL, OnQianmodel)
ON_COMMAND(IDM_QIANADDONE, OnQianaddone)
ON_BN_CLICKED(IDC_PRE, OnPre)
ON_BN_CLICKED(IDC_NEXT, OnNext)
ON_BN_CLICKED(IDC_FIRST, OnFirst)
ON_BN_CLICKED(IDC_LAST, OnLast)
ON_BN_CLICKED(IDC_CONTINUE, OnContinue)
ON_COMMAND(IDM_TWOLEVELQIANMODEL, OnTwolevelqianmodel)
ON_COMMAND(IDM_DEBUGQIAN, OnDebugqian)
ON_COMMAND(IDM_HASFIVE, OnHasfive)
ON_COMMAND(IDM_DEFENT, OnDefent)
ON_COMMAND(IDM_DEBUGCHANGE, OnDebugchange)
ON_COMMAND(IDM_SUB, OnSub)
ON_COMMAND(IDM_TWOMODEL, OnTwomodel)
ON_COMMAND(IDM_THREEQIANMODEL, OnThreeqianmodel)
ON_WM_CTLCOLOR()
ON_COMMAND(IDM_GRADE1, OnGrade1)
ON_COMMAND(IDM_GRADE2, OnGrade2)
ON_COMMAND(IDM_GRADE3, OnGrade3)
ON_COMMAND(IDM_GRADE4, OnGrade4)
ON_COMMAND(IDM_GRADE5, OnGrade5)
ON_COMMAND(ID_ABOUT, OnAbout)
ON_COMMAND(IDM_SOUND, OnSound)
ON_COMMAND(IDM_BEATPOINT, OnBeatpoint)
ON_COMMAND(IDM_MAKETWOALIVE, OnMaketwoalive)
ON_COMMAND(IDM_TWOLEVELBEAT, OnTwolevelbeat)
ON_COMMAND(IDM_CVSC, OnCvsc)
ON_BN_CLICKED(IDC_CLEARSCORE, OnClearscore)
ON_COMMAND(IDM_QIANGQIANMODELADDONE, OnQiangqianmodeladdone)
ON_COMMAND(IDM_QIANGQIANMODEL, OnQiangqianmodel)
ON_COMMAND(IDM_QIANGTOWLEVELQIANMODEL, OnQiangtowlevelqianmodel)
ON_COMMAND(IDM_SHOW, OnShow)
ON_COMMAND(IDM_HASCANFOUR, OnHascanfour)
ON_COMMAND(IDM_QIANGTWOLEVEL, OnQiangtwolevel)
ON_COMMAND(IDM_MAKEQIAN, OnMakeqian)
ON_COMMAND(IDM_SMALLSUBQIAN, OnSmallsubqian)
ON_COMMAND(IDM_BEAT, OnBeat)
ON_COMMAND(IDM_MAKEBEAT, OnMakebeat)
ON_COMMAND(IDM_VALUE, OnValue)
ON_COMMAND(IDM_DEFENTPOINT, OnDefentpoint)
ON_COMMAND(IDM_CHONGTWO, OnChongtwo)
ON_COMMAND(IDM_GETCLOSETWOLEVEL, OnGetclosetwolevel)
ON_COMMAND(IDM_TWOLEVELDEFENT, OnTwoleveldefent)
ON_WM_TIMER()
ON_COMMAND(IDM_RENREN, OnRenren)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMs5Dlg message handlers
BOOL CMs5Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
bmp[0].LoadBitmap("1raw");
bmp[1].LoadBitmap("2raw");
bmp[2].LoadBitmap("3raw");
bmp[3].LoadBitmap("4raw");
bmp[4].LoadBitmap("5raw");
bmp[5].LoadBitmap("dark");
bmp[6].LoadBitmap("white");
bmp[7].LoadBitmap("gray1");
bmp[8].LoadBitmap("gray2");
m_thinkprocess.SetRange(0,100);
m_thinkprocess.SetStartColor(RGB(255,0,0));
m_thinkprocess.SetEndColor(RGB(0,255,0));
SetTimer(1,1,NULL);
if (!IsFileValid("score.m"))
{
//文件不存在,那么使用单体分离技术分离出这个文件
HINSTANCE hModule=AfxGetResourceHandle();
HRSRC hRes=::FindResource(hModule,MAKEINTRESOURCE(IDR_SCORE),_T("score"));
HGLOBAL hGlobal=LoadResource(hModule,hRes);
BYTE *pRes=(LPBYTE)LockResource(hGlobal);
CFile tempFile("score.m",CFile::modeCreate|CFile::modeWrite);
tempFile.Write(pRes,SizeofResource(hModule,hRes));
tempFile.Close();
UnlockResource(pRes);
FreeResource(hGlobal);
}
CBitmap bmp;
bmp.LoadBitmap("ms5");
m_brush=CreatePatternBrush((HBITMAP)bmp);
bmp.DeleteObject();
m_pre.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
m_next.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
m_first.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
m_last.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
m_continue.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
m_clearscore.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
conn.Open("score.m",FALSE,FALSE,_T(""));
CDaoRecordset rs(&conn);
rs.Open(dbOpenDynaset,"select win,loss,tie from score");
if(!rs.IsEOF()){
CString winnum,lossnum,tienum;
COleVariant var;
rs.GetFieldValue("win",var);
win_num = var.intVal;
rs.GetFieldValue("loss",var);
loss_num = var.intVal;
rs.GetFieldValue("tie",var);
tie_num = var.intVal;
winnum.Format("%d",win_num);
lossnum.Format("%d",loss_num);
tienum.Format("%d",tie_num);
m_winnum.SetWindowText(winnum);
m_lossnum.SetWindowText(lossnum);
m_tienum.SetWindowText(tienum);
SetRatio();
}
rs.Close();
fivestone.m_outinfo = &m_outinfo;
thiswnd = this->GetSafeHwnd();
thisdlg = this;
OnGrade3();
OnStart();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CMs5Dlg::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 CMs5Dlg::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
{
CPaintDC dc(this);
CDC dcmem;BITMAP bm;
dcmem.CreateCompatibleDC(&dc);
switch(grade)
{
case 1:
dcmem.SelectObject(&bmp[0]);//"1raw"
GetObject(bmp[0],sizeof(BITMAP),(LPVOID)&bm);
dc.BitBlt(406,84,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 2:
dcmem.SelectObject(&bmp[1]);//"2raw"
GetObject(bmp[1],sizeof(BITMAP),(LPVOID)&bm);
dc.BitBlt(446,53,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 3:
dcmem.SelectObject(&bmp[2]);//"3raw"
GetObject(bmp[2],sizeof(BITMAP),(LPVOID)&bm);
dc.BitBlt(441,53,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 4:
dcmem.SelectObject(&bmp[3]);//"4raw"
GetObject(bmp[3],sizeof(BITMAP),(LPVOID)&bm);
dc.BitBlt(410,49,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 5:
dcmem.SelectObject(&bmp[4]);//"5raw"
GetObject(bmp[4],sizeof(BITMAP),(LPVOID)&bm);
dc.BitBlt(430,60,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
}
for (int i=1;i<=15;i++)
for(int j=1;j<=15;j++)
{
int tempx,tempy;
switch (points[i][j])
{
case 1://黑色棋
GetObject(bmp[5],sizeof(BITMAP),(LPVOID)&bm);//"dark"
tempx = 24*i-bm.bmWidth/2-5;
tempy = 24*j-bm.bmHeight/2-5;
dcmem.SelectObject(&bmp[5]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 2://白色棋
GetObject(bmp[6],sizeof(BITMAP),(LPVOID)&bm);//"white"
tempx = 24*i-bm.bmWidth/2-5;
tempy = 24*j-bm.bmHeight/2-5;
dcmem.SelectObject(&bmp[6]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
break;
case 3://gray1,表示机器刚走的黑子
GetObject(bmp[7],sizeof(BITMAP),(LPVOID)&bm);//"gray1"
tempx = 24*i-bm.bmWidth/2-5;
tempy = 24*j-bm.bmHeight/2-5;
dcmem.SelectObject(&bmp[7]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
if (!debug) points[i][j] = 1;//变回正常色
break;
case 4://gray2,表示机器刚走的白子
GetObject(bmp[8],sizeof(BITMAP),(LPVOID)&bm);//"gray2"
tempx = 24*i-bm.bmWidth/2-5;
tempy = 24*j-bm.bmHeight/2-5;
dcmem.SelectObject(&bmp[8]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
if (!debug) points[i][j] = 2;//变回正常色
break;
default:break;
}
}
if (!is_cvsc)
{
if (!stop&&fivestone.has_tie())
{
if (soundeffect)
sndPlaySound("win",SND_RESOURCE|SND_ASYNC);
stop = true;
if (!m_renren)
{
tie_num++;
CString s;
s.Format("%d",tie_num);
updatescore("tie",tie_num);
m_tienum.SetWindowText(s);
SetRatio();
}
else SetWindowText("五子棋进阶");
if (!m_renren) MyMessageBox("累死我了,终于平了!");
else MyMessageBox("你们平了,累不累呀?");
}
if (!stop&&fivestone.has_five(1))
{
stop = true;
if (first)
{
if (soundeffect)
sndPlaySound("loss",SND_RESOURCE|SND_ASYNC);
if (!m_renren)
{
loss_num++;
CString s;
s.Format("%d",loss_num);
updatescore("loss",loss_num);
m_lossnum.SetWindowText(s);
SetRatio();
}
else SetWindowText("五子棋进阶");
if (!m_renren) MyMessageBox("哈哈,你输了!");
else MyMessageBox("了不起啊,黑棋胜!");
}
else
{
if (soundeffect)
sndPlaySound("win",SND_RESOURCE|SND_ASYNC);
if (!m_renren)
{
win_num++;
CString s;
s.Format("%d",win_num);
updatescore("win",win_num);
m_winnum.SetWindowText(s);
SetRatio();
}
else SetWindowText("五子棋进阶");
if (!m_renren) MyMessageBox("啊,你居然赢了!");
else MyMessageBox("了不起啊,黑棋胜!");
}
}
if (!stop&&fivestone.has_five(2))
{
stop = true;
if (!first)
{
if (soundeffect)
sndPlaySound("loss",SND_RESOURCE|SND_ASYNC);
if (!m_renren)
{
loss_num++;
CString s;
s.Format("%d",loss_num);
updatescore("loss",loss_num);
m_lossnum.SetWindowText(s);
SetRatio();
}
else SetWindowText("五子棋进阶");
if (!m_renren) MyMessageBox("哈哈,你输了!");
else MyMessageBox("白棋胜!很不容易啊!");
}
else
{
if (soundeffect)
sndPlaySound("win",SND_RESOURCE|SND_ASYNC);
if (!m_renren)
{
win_num++;
CString s;
s.Format("%d",win_num);
updatescore("win",win_num);
m_winnum.SetWindowText(s);
SetRatio();
}
else SetWindowText("五子棋进阶");
if (!m_renren) MyMessageBox("啊,你居然赢了!");
else MyMessageBox("白棋胜!很不容易啊!");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -