// BWChessDlg.cpp : implementation file
#include "stdafx.h"
#include <math.h>
#include <mmsystem.h>//播放声音的头文件
#include "BWChess.h"
#include "SetupDlg.h"
#include "AboutDlg.h"
#include "Globalvar0.h"
#include "HelperAPI.h" //定义了3个对话框函数
#include "BWChessDlg.h"
#include "RecorDdlg.h"
#include "BestDlg.h"
#include <time.h>
#include "SettingDlg.h"
#include "Demo.h"
#include "windows.h"
#include "Message1.h"
#include "ip1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBWChessDlg dialog
BOOL PlaySounds(UINT IDSoundRes, WORD wFlag)//播放声音
{ //PlaySound 是标准函数<win.h>
if (g_bSoundOn)
if (PlaySound(MAKEINTRESOURCE(IDSoundRes),//播放的声音资源
AfxGetInstanceHandle(),//指明实例
wFlag|SND_RESOURCE|SND_NODEFAULT))//标志位:不默认,使用实例包含的资源
return TRUE;
return FALSE;
}
CBWChessDlg::CBWChessDlg(CWnd* pParent ): CDialog(IDD_BWCHESS_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//载入图标 to m_hIcon ,不载入则使用默认图标
m_pMenu = new CMenu();//菜单
m_PaintNum=0;
hAccelerator=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACC));
//载入加速键
g_nCanHintTimeB= 3;
g_nCanHintTimeW= 3;
g_nStrollSpeed= 2;
//获得时间和速度
g_nStrollSpeed=abs(g_nStrollSpeed);
g_nStrollSpeed%=3;//速度分为3种:低 中 高
g_nCanHintTimeB=abs(g_nCanHintTimeB);
g_nCanHintTimeB%=31;
if(g_nCanHintTimeB<3)
g_nCanHintTimeB=3;
g_nCanHintTimeW=abs(g_nCanHintTimeW);
g_nCanHintTimeW%=31;
if(g_nCanHintTimeW<3)
g_nCanHintTimeW=3;
//读注册表(关于英雄榜)
g_nTime1 =AfxGetApp()->GetProfileInt(pSettings, _T("Time1"), 0);
g_nTime2 =AfxGetApp()->GetProfileInt(pSettings, _T("Time2"), 0);
g_nTime3 =AfxGetApp()->GetProfileInt(pSettings, _T("Time3"), 0);
g_nMark1 =AfxGetApp()->GetProfileInt(pSettings, _T("Mark1"), 0);
g_nMark2 =AfxGetApp()->GetProfileInt(pSettings, _T("Mark2"), 0);
g_nMark3 =AfxGetApp()->GetProfileInt(pSettings, _T("Mark3"), 0);
g_strName1 =AfxGetApp()->GetProfileString(pSettings, _T("Name1"), _T("Anonymous"));
g_strName2 =AfxGetApp()->GetProfileString(pSettings, _T("Name2"), _T("Anonymous"));
g_strName3 =AfxGetApp()->GetProfileString(pSettings, _T("Name3"), _T("Anonymous"));
//写入注册表(关于英雄榜)
CString str;
str.LoadString (IDS_AUTHOR);//载入字符串 “庞长才 制作”
AfxGetApp()->WriteProfileString(_T("Author"), _T("Shuker"), str);
AfxGetApp()->WriteProfileInt(pSettings, _T("Time1"), g_nTime1);
AfxGetApp()->WriteProfileInt(pSettings, _T("Time2"), g_nTime2);
AfxGetApp()->WriteProfileInt(pSettings, _T("Time3"), g_nTime3);
AfxGetApp()->WriteProfileInt(pSettings, _T("Mark1"), g_nMark1);
AfxGetApp()->WriteProfileInt(pSettings, _T("Mark2"), g_nMark2);
AfxGetApp()->WriteProfileInt(pSettings, _T("Mark3"), g_nMark3);
AfxGetApp()->WriteProfileString(pSettings, _T("Name1"), g_strName1);
AfxGetApp()->WriteProfileString(pSettings, _T("Name2"), g_strName2);
AfxGetApp()->WriteProfileString(pSettings, _T("Name3"), g_strName3);
}
CBWChessDlg::~CBWChessDlg()//释放资源
{ //以下为new对应的资源
delete m_pMenu;
}
void CBWChessDlg::InitParams()
{
for (int i=0; i<NUM;i++)
for (int j=0; j<NUM; j++)
kernel[i][j] = 0; //0 for none,1 for white,2 for black,棋盘的初态
kernel[3][3]=kernel[4][4]=2;//开局的
kernel[3][4]=kernel[4][3]=1;// 4颗子
m_CurPt.x = m_CurPt.y =-1;//放子的位置(初态)
num_black=2;//黑白子
num_white=2;//的颗数
m_PassedTime=0;//黑棋流逝的时间
m_PassedTime0=0;//白棋流逝的时间
m_bGameOver = FALSE;//游戏是否已经结束
//m_byColor是本程序的核心变量!!!!!!!!!!!!!!!
m_byColor = 0; //代表棋手的颜色,在使用之前代表前一个棋手的颜色,
//使用完之后代表当前棋手的颜色,因此使用之前要将其取反 1:黑 0:白
m_Skip=0;//对方是否无子可下,即对方是否跳过不下
g_nStoneNum=0;//格子的个数
m_TimerOn=0;//时间是否在计数
m_HintOnce=0;//是否提示
m_PeekOnce=0;//是否查看可下棋的位置
m_IsGameStart=0;//游戏是否已经开始
m_ListInfo.ResetContent();//清空列表
m_HintTime0=0;//白棋点击的次数
m_HintTime1=0;//黑棋点击的次数
ListInfo.destroy();//stack 类,清空信息空栈
m_UndoPoint.Destroy();//undo类,清空悔棋信息空栈
}
void CBWChessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBWChessDlg)
//以下部分是将控件与变量联系起来
DDX_Control(pDX, IDC_TIME_CHINESE0, m_Time0);//白棋用时
DDX_Control(pDX, IDC_INFO, m_Info);//走棋信息
DDX_Control(pDX, IDC_LISTINFO, m_ListInfo);//走棋信息列表
DDX_Control(pDX, IDC_WNUM, m_Wnum);//白棋数目
DDX_Control(pDX, IDC_TIME_CHINESE, m_Time);//黑棋用时
DDX_Control(pDX, IDC_BNUM, m_Bnum);////黑棋数目
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBWChessDlg, CDialog)//消息映射函数
//{{AFX_MSG_MAP(CBWChessDlg)
ON_WM_PAINT()//窗口内画图
ON_WM_LBUTTONDOWN() //鼠标左击
ON_COMMAND(IDM_NEW, OnNew) //菜
ON_COMMAND(IDM_EXIT, OnExit) //单
ON_COMMAND(IDM_ABOUT, OnAbout) //命令
ON_WM_SETCURSOR()
ON_WM_QUERYDRAGICON()
ON_WM_SYSCOMMAND()
ON_WM_CONTEXTMENU()//弹出菜单
ON_WM_TIMER()
ON_COMMAND(IDM_UNDO, OnUndo)//以下全为菜单命令
ON_COMMAND(IDM_BEST, OnBest)
ON_COMMAND(IDM_HINT, OnHint)
ON_COMMAND(IDM_CANPLACE, OnCanplace)
ON_COMMAND(IDM_SETTING, OnSetting)
ON_COMMAND(IDM_OPEN, OnOpen)
ON_COMMAND(IDM_SAVE, OnSave)
ON_COMMAND(IDM_SAVEINFO, OnSaveinfo)
ON_COMMAND(IDM_DEMO, OnDemo)
ON_COMMAND(ID_Onhost, OnHost)
ON_COMMAND(ID_Onconnect, OnConnect)
ON_COMMAND(ID_Unlink, OnUnlink)
ON_COMMAND(IDM_REPLAY, OnReplay)
//}}AFX_MSG_MAP
ON_LBN_DBLCLK(IDC_LISTINFO , OnListDoubleClicked)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBWChessDlg message handlers
BOOL CBWChessDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon,m_hIcon是图标变量
SetIcon(m_hIcon, FALSE); // Set small icon
CBitmap bitmap;
bitmap.LoadBitmap(IDB_EMPTY);
BITMAP bm;
bitmap.GetBitmap(&bm);
m_wStoneWidth=(unsigned short) bm.bmWidth; //bmWidth,bm.bmHeight
m_wStoneHeight=(unsigned short)bm.bmHeight;
CBitmap bitmap1;
bitmap1.LoadBitmap(IDB_F1_2);
bitmap1.GetBitmap(&bm);
m_wFrameWidth=(unsigned short)bm.bmWidth; //bmWidth,bm.bmHeight
m_wFrameHeight=(unsigned short)bm.bmHeight;
//获取系统的相关信息
int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
int cyScreen = ::GetSystemMetrics(SM_CYSCREEN);
int cxDlgFrame = ::GetSystemMetrics(SM_CXDLGFRAME);
int cyDlgFrame = ::GetSystemMetrics(SM_CYDLGFRAME);
int cxCaption = ::GetSystemMetrics(SM_CYCAPTION);
int cyMenu = ::GetSystemMetrics(SM_CYMENU);//系统菜单的宽度
int nWidth = m_wFrameHeight*2+ m_wFrameWidth*8 + 2*cxDlgFrame;//根据位图和系统参数
int nHeight = m_wFrameHeight*2+ m_wFrameWidth*8 + cxCaption + 2*cyDlgFrame + cyMenu;//确定界面的大下
MoveWindow((cxScreen-nWidth-230)/2, (cyScreen-nHeight)/2,nWidth+230, nHeight+2);
//确定窗口的位置和大小,默认状态是响应重画消息
TimeCount.Create(this,nWidth+ 20, 40 ,0,4);//时间和棋子计数控件(自定义)的创建,4代表4位数,0无效
TimeCount0.Create(this,nWidth+20, 120 ,0,4);
BCount.Create (this,nWidth+ 34, 230 ,0,2);
WCount.Create (this,nWidth+ 34 ,310 ,0,2);
// ShowNumber(1);static文本控件的位置和大小,以像素为单位,this的左上角为(0,0)
m_Time.MoveWindow(nWidth+18 ,20 ,60,20);
m_Time0.MoveWindow(nWidth+18 ,100 ,60,20);
m_Bnum.MoveWindow(nWidth+18 ,210 ,60,20);
m_Wnum.MoveWindow(nWidth+18 ,290 ,60,20);
m_ListInfo.MoveWindow(nWidth+95,22,110,410);//列表
m_Info.MoveWindow(nWidth+95,2,110,20);//m_Infostatic文本
m_IsGameStart=1;//游戏是否开始
//设置系统菜单
CMenu* sysmenu=GetSystemMenu(