局域网五子棋对战带局域网聊天和人机对战

这是一个局域网五子棋对战程序,包含了局域网聊天和人机对战的实现。程序通过C++编写,使用了棋盘类、客户端类和计算机对手类来处理游戏逻辑和网络通信。客户端类支持语音聊天功能,通过套接字进行数据传输。同时,计算机对手类实现了智能算法,能够根据棋盘状态选择最佳落子位置。
摘要由CSDN通过智能技术生成

//Chessboard.h

#pragma once

#define NUM 15
#define PLAYONE 1
#define PLAYTWO 2
#define NOCHESS 0
#define COMCHESS 1
#define OPPCHESS 2


class CChessboard
{
public:
 CChessboard(void);
public:
 ~CChessboard(void);

///用户自定义数据-开始///
public:
 bool AllPlayOneChess[NUM][NUM];//用于存储所有电脑的棋子
 bool AllPlayTwoChess[NUM][NUM];//用于存储所有对手的棋子
 int SpaceBetween;//用于存储两条线之间的距离
 int PlayOneChNum[NUM][NUM];
 int PlayTwoChNum[NUM][NUM];
 int AllPlayOneChNum;
 int AllPlayTwoChNum;
///用户自定义数据-结束///

///用户自定义函数-开始///
 bool UpdateSpaceBetween(int x,int y);//当窗口重画时,改变两条线之间的距离
 bool DrawChessboard(CWnd *wnd);//绘制棋盘
 bool AddNewChess(int x,int y,int flag);//添加新棋子
 int JudgeCoordinate(int x,int y);//判断一个坐标的棋子是否已经被占用,若没被占用返回NOCHESS,
            //若被computer的棋子占用返回COMCHESS,若被opp的棋子占用返回OPPCHESS
 bool JudgeWiner();//判断是否已经有人胜利
 bool ContinuumComNum(int x,int y,int &left,int &right,
   int &top,int &bottom,int &leftT,int &leftB,int &rightT,int &rightB,int flag);//计算一个点在各个方向上各有几个点相连   
 bool JudgeCoordinate(int x,int y,int flag);//判断一个坐标是否已经被playerone或者playertwo的棋子所占用(没有占用返回true)
 bool ClearAllChess();//将所有棋子清空
///用户自定义函数-结束///
};
//Client.h

//#pragma once
#include"NetDialog.h"
#ifndef _CClient_h_//用于防止头文件嵌套多次1
#define _CClient_h_//用于防止头文件嵌套多次2

class CNetDialog;
#include"Mmsystem.h"//用于录音的函数
#define BUFSIZE 1000
#define MAX_BUFFER_SIZE 2048
#define CHESSDATA 10
#define CHATDATA 20

class CNetDialog;

class CClient
{
public:

//用于语音聊天定义-开始///
 SOCKET ClientSocket;
 struct sockaddr_in ServerAddress;//服务器的ip地址以及端口号
 struct sockaddr_in ClientAddress;//客户端的ip地址以及端口号
 char SendBuf[BUFSIZE];//发送缓存大小
 char ReceiveBuf[BUFSIZE];//接收缓存大小
//用于语音聊天定义-结束///

//用于语音聊天定义-开始///
 SOCKET ClientSocketSound;//用于客户端的音频聊天的套接字
 struct sockaddr_in ServerAddSound;//用于进行音频聊天的服务器的ip地址以及端口号
 struct sockaddr_in ClientAddSound;//用于进行音频聊天的客户端的ip地址以及端口号
//用于语音聊天定义-结束///

用于传输棋子坐标数据定义-开始///
// SOCKET ClientSocketChess; //服务器连接成功后,用于传输数据的套接字
// struct sockaddr_in ServerAddChess;//服务器的ip地址以及端口号
// struct sockaddr_in ClientAddChess;//客户端的ip地址以及端口号
// WORD SendChess;//发送缓存大小
// WORD ReceiveChess;//接收缓存大小
用于传输棋子坐标数据定义-结束///

 CNetDialog *m_dlg;
 int ReceiveFlag;
 WORD SendChess;//发送缓存大小
 WORD ReceiveChess;//接收缓存大小
 HWND hWnd;
public:
 CClient(void);
 ~CClient(void);
    bool AddSocketLib();//加载套接字库
 bool CreateSocket();//创建监听套接字
    bool ConnectSocket();//连接到服务器
 bool SendData(WAVEHDR* p);//向客户端发送数据
 bool ReceiveData(WAVEHDR* p,CNetDialog *dialog);//接收客户端发来的数据
 bool InitM_dlg(CNetDialog *Dlg);//将CChatDlg的对象传递给m_dlg
 bool GetServerAddress();//将ip控件框里面的ip地址赋值给ServerAddress
 bool GetSendBuf(CString SendData);//将发送框里面的内容赋值给SendBuf
 bool GetReceiveBuf(CString & RecData);//将ReceiveBuf中的数据保存到一个cstring类型中
 bool SendMark(int mark);//发送标识,表示下一个收到的数据是文字数据还是,五子棋数据
// bool SendSound(char *buf,int len);//向服务器发送音频数据

用于传输棋子坐标数据定义-开始///
// bool GetServerAddressChess();//将ip控件框里面的ip地址赋值给ServerAddressChess
// bool CreateSocketChess();
//    bool ConnectSocketChess();//连接到服务器
// bool SendDataChess();
// bool ReceiveDataChess();
用于传输棋子坐标数据定义-结束///
};
#endif

//Computer.h

//#include"RenjuView.h"
class CRenjuView;
#ifndef _Computer_h_//用于防止头文件嵌套多次1
#define _Computer_h_//用于防止头文件嵌套多次2

 

///
#define NUM 15
#define MAXPRI 500
#define DEFENPRI 90
#define NULL 0
///优先级定义
#define PRI_0 0
#define PRI_1 1
#define PRI_2 2
#define PRI_3 3
#define PRI_4 4
#define PRI_5 5
/
#define COMCHESSMAN 1
#define OPPCHESSMAN 2
#define NOCHESSMAN 0
/
#define COMWIN 1
#define OPPWIN 2
#define NOWIN 0

#define PLAYONE 1
#define PLAYTWO 2

#include <windows.h>
#include<iostream>
#include "IPHlpApi.h"
#include "Iphlpapi.h"
#include "Iphlpapi.h"
#include <string.h>
#include <stdio.h>
#include<cstring>
#include "resource.h"
#include<atlstr.h>//使用cstring类用到
#pragma comment(lib,"Iphlpapi.lib")

using namespace std;

typedef struct
{
 int x; //棋盘的x坐标
 int y; //棋盘的y坐标
}Point;

typedef struct po
{
 Point point;
    struct po *next;
}*LPoint; //某一个优先级上的所有下一步可能下法

typedef struct
{
 LPoint PRI[MAXPRI];
}NextPri;  //在优先级0~MAXPRI-1上的所有下一步可能下法


class Computer
{
private:
 //
  Point ComExistChessman[(NUM*NUM)/2+1]; //棋盘上所有电脑已有棋子坐标
  NextPri ComNext;  //电脑一方下一步的所有可能下法,按优先级存储(用于计算下一步棋的进攻下法)
 //
  Point OppExistChessman[(NUM*NUM)/2+1];//棋盘上所有对手已有棋子坐标
  NextPri OppNext; //对方下一步的所有可能下法,按优先级存储(用于计算防御下法)
 //
public:
 Computer(void);//构造函数,初始化该类的各数据成员
 ~Computer(void);
  int ComCount;//棋盘上所有电脑已有棋子个数
  int OppCount;//棋盘上所有对手已有棋子个数
 int CoordinateR[NUM][NUM]; //在图形上面显示的所有棋子坐标
 int CoordinateSNum[NUM][NUM];//各个棋子的先后序号
 int Result;//表示胜利的为哪一方。初始值为0,表示比赛正在进行;如果电脑胜利者值为1;对手胜利则为2;
 bool JudgeCoordinate(int x,int y);//判断一个坐标是否已经被占用(没有占用返回true)
 int Max(int a,int b,int c,int d,int &count);//函数返回4各数的最大值,并计算出有几个值并列为最大值
 int RandNum(int min,int max);//生成一个min到max的随机数(不包括max和min)
 bool  DeleCoordinateR();//清空图形上面显示的所有棋子坐标
 ///computer核心算法///
 bool AttackNextPri();//计算computer的最优下一步棋子,并添加到ComNext数据成员中
 bool AddComNewCh(CRenjuView * p);//添加确定最优的棋子为下一步,并且添加到ComExistChessman中
 bool ContinuumComNum(int x,int y,int &left,int &right,
   int &top,int &bottom,int &leftT,int &leftB,int &rightT,int &rightB);//计算一个点在各个方向上各有几个点相连
 bool AddToComNext(int x,int y,int pri); //添加新的棋子到ComNext成员
 bool DeleComNext();//清空ComNext数据成员中的所有内容
 bool DeleComExistChessman();//清空ComExistChessman的所有内容
 bool JudgeComCoordinate(int x,int y);//判断一个坐标是否已经被Computer的棋子所占用(没有占用返回true)
 int GetComCount();//返回ComCount数据成员的值
 bool JudgeComWin();//判断是computer是否已经胜利 胜利则返回true
 ///computer核心算法///
 ///Opp核心算法///
 bool AddNewChessmanOpp(int x,int y,CRenjuView * p);//添加新的棋子到OppExistChessman数据成员
 bool AddDefend();//在continuumChessmanOpp中确定防御下一步棋
 bool ContinuumOppNum(int x,int y,int &left,int &right,
   int &top,int &bottom,int &leftT,int &leftB,int &rightT,int &rightB);//计算一个点在各个方向上各有几个Opp的点相连
 bool JudgeOppCoordinate(int x,int y);//判断一个坐标是否已经被Opp的棋子所占用(没有占用返回true)
 bool DeleOppExistChessman();// 清空OppExistChessman的所有内容
 int GetOppCount();//返回OppCount数据成员的值
 bool JudgeOppWin();//判断是Opp是否已经胜利 胜利则返回true
 ///Opp核心算法///
};
//
//LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
//PMIB_TCPTABLE MyGetTcpTable(BOOL bOrder);

 


#endif


//MainFrm.h

// MainFrm.h : CMainFrame 类的接口
//

#include"NetDialog.h"
#pragma once

class CMainFrame : public CFrameWnd
{
 
protected: // 仅从序列化创建
 CMainFrame();
 DECLARE_DYNCREATE(CMainFrame)

// 属性
public:

// 操作
public:

// 重写
public:
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

// 实现
public:
 virtual ~CMainFrame();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // 控件条嵌入成员
 CStatusBar  m_wndStatusBar;
 CToolBar    m_wndToolBar;

// 生成的消息映射函数
protected:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 DECLARE_MESSAGE_MAP()

///用户自定义数据-开始///
///用户自定义数据-结束///

public:
 afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
public:
 afx_msg void OnMoving(UINT fwSide, LPRECT pRect);
};

 

 


//NetDialog.h

#pragma once
//#ifndef _CNetDialog_h_//用于防止头文件嵌套多次1
//#define _CNetDialog_h_//用于防止头文件嵌套多次2

#include"Resource.h"
#include"Sound.h"
#include"Server.h"
#include"Client.h"

#define WM_DATAREACH WM_APP+110
#define WM_SERVERBUILTED WM_APP+310
#define WM_LINKEDSERVER WM_APP+311
#define CLIENT 1
#define SERVER 2


class CServer;
class CClient;
class CSound;

// CNetDialog 对话框

class CNetDialog : public CDialog
{
 DECLARE_DYNAMIC(CNetDialog)

public:
 CNetDialog(CWnd* pParent = NULL);   // 标准构造函数
 virtual ~CNetDialog();

// 对话框数据
 enum { IDD = IDD_VOICECHAT };

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 DECLARE_MESSAGE_MAP()
自定义数据/
public:
 bool ServerFlag;//用于表示是否已经建立了服务器,没有则为false,已经建立则为true
 bool ClientFlag;//用于表示是否已经连接了服务器,没有则为false,已经建立则为true
 CServer Server;//用于服务器端的操作
 CClient Client;//用于服务端的操作
 CSound Sound;//用于音频操作
 CString InPutCString;//用于保存输入窗口的文字数据
 CString AllCString;//用于保存所有聊天记录的文字数据
 int Mark;//用于标识是客户端还是服务器
 bool SoundChat;//用于标识是否已经开始语音聊天,false表示没有,true表示已经建立语音聊天了
 WAVEHDR *p;
 HWND ViewHwnd;
自定义消息响应函数-开始/
 LRESULT OnDataReach(WPARAM wParam, LPARAM lParam);//当有新数据到达时执行的代码
 afx_msg LRESULT GetInBufferFull(WPARAM wp, LPARAM lp);//一个buffer满后调用
 afx_msg LRESULT WriteOutBufferEmpty(WPARAM wp, LPARAM lp);//一个buffer播放完后调用
自定义消息响应函数-结束/
public:
 afx_msg void OnBnClickedBuildserver();
 afx_msg void OnBnClickedLinkserver();
 afx_msg void OnPaint();
 afx_msg void OnBnClickedSend();
 afx_msg void OnBnClickedVoicechat();
public:
 afx_msg void OnBnClickedAddip();
};
//#endif

 

//Renju.h

// Renju.h : Renju 应用程序的主头文件
//
#pragma once

#ifndef __AFXWIN_H__
 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h"       // 主符号


// CRenjuApp:
// 有关此类的实现,请参阅 Renju.cpp
//

class CRenjuApp : public CWinApp
{
public:
 CRenjuApp();


// 重写
public:
 virtual BOOL InitInstance();

// 实现
 afx_msg void OnAppAbout();
 DECLARE_MESSAGE_MAP()
};

extern CRenjuApp theApp;

 

 

//RenjuDoc.h

// RenjuDoc.h : CRenjuDoc 类的接口
//


#pragma once


class CRenjuDoc : public CDocument
{
protected: // 仅从序列化创建
 CRenjuDoc();
 DECLARE_DYNCREATE(CRenjuDoc)

// 属性
public:

// 操作
public:

// 重写
public:
 virtual BOOL OnNewDocument();
 virtual void Serialize(CArchive& ar);

// 实现
public:
 virtual ~CRenjuDoc();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
 DECLARE_MESSAGE_MAP()
};

 

 

 


//RenjuView.h

// RenjuView.h : CRenjuView 类的接口
//
#include"Computer.h"
#include"RenjuDoc.h"
#ifndef _CRenjuView_h_//用于防止头文件嵌套多次1
#define _CRenjuView_h_//用于防止头文件嵌套多次2


//#pragma once
#include"Chessboard.h"
#include"NetDialog.h"
#define LANMATCH 10
#define COMMATCH 20

class CNetDialog;
class Computer;

class CRenjuView : public CView
{
protected: // 仅从序列化创建
 CRenjuView();
 DECLARE_DYNCREATE(CRenjuView)

// 属性
public:
 CRenjuDoc* GetDocument() const;

// 操作
public:

// 重写
public:
 virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
 virtual ~CRenjuView();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
 DECLARE_MESSAGE_MAP()
用户定义-开始
public:
 CChessboard chessboard;
 int Turn;//表示当前该谁下下一步
 CNetDialog *LanDialog;
 bool InitTurn();//初始化Turn的值
 Computer *computer;
 int MatchType;
用户定义-结束

自定义消息响应函数-开始/
 LRESULT RecChess(WPARAM wParam, LPARAM lParam);//接收发送来的棋子
 LRESULT ServerBuilted(WPARAM wParam, LPARAM lParam);//当服务器已经建立后发送消息
 LRESULT LinkedServer(WPARAM wParam, LPARAM lParam);//当客户端已经连接到服务器后发送消息
自定义消息响应函数-结束/
public:
 afx_msg void OnSize(UINT nType, int cx, int cy);
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnLanmatch(void);
 afx_msg void OnComputermatch();
};

#ifndef _DEBUG  // RenjuView.cpp 中的调试版本
inline CRenjuDoc* CRenjuView::GetDocument() const
   { return reinterpret_cast<CRenjuDoc*>(m_pDocument); }
#endif

#endif

 

//Resource.h

//{ {NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Renju.rc
//
#define IDD_ABOUTBOX                    100
#define IDP_OLE_INIT_FAILED             100
#define IDR_MAINFRAME                   128
#define IDR_RenjuTYPE                   129
#define ID_LANMATCH                     130
#define IDE_CHAT                        1000
#define IDE_EDITCHAT                    1001
#define IDD_VOICECHAT                   1002
#define IDB_CLOSE                       1003
#define IDB_SEND                        1004
#define IDI_IPADDRESS                   1005
#define IDE_PORT                        1006
#define IDB_BUILDSERVER                 1007
#define IDB_LINKSERVER                  1008
#define IDE_BUILDSTATE                  1009
#define IDE_LINKSTATE                   1010
#define IDB_ADDIP                       1011
#define ID_LANMATCH32771                32771
#define IDM_LANMATCH                    32772
#define ID_LANMATCH2                    32773
#define IDM_LANMATCH2                   32774
#define ID_32775                        32775
#define ID_32776                        32776
#define IDM_COMPUTERMATCH               32777

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        131
#define _APS_NEXT_COMMAND_VALUE         32778
#define _APS_NEXT_CONTROL_VALUE         1010
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

 

 


//Server.h

//#pragma once
#include"NetDialog.h"

#ifndef _CServer_h_//用于防止头文件嵌套多次1
#define _CServer_h_//用于防止头文件嵌套多次2

class CNetDialog;
//class CRenjuView;

#include"Mmsystem.h"//用于录音的函数
#include<afxsock.h>//用于socket的相关定义
#include <string.h>

#define BUFSIZE 1000
#define MAX_BUFFER_SIZE 2048
#define CHESSDATA 1
#define CHATDATA 2
#define WM_CHESS WM_APP+210
class CNetDialog;

class CServer
{
public:
//用于文字聊天定义-开始///
 SOCKET ListenSocket;  //用于服务器进行监听的套接字
 SOCKET ConnectSocket; //服务器连接成功后,用于传输数据的套接字
 struct sockaddr_in ServerAddress;//服务器的ip地址以及端口号
 struct sockaddr_in ClientAddress;//客户端的ip地址以及端口号
 char SendBuf[BUFSIZE];//发送缓存大小
 char ReceiveBuf[BUFSIZE];//接收缓存大小
//用于文字聊天定义-结束///

//用于语音聊天定义-开始///
 SOCKET ListenSocketSound;//用于服务器的音频聊天进行监听的套接字
 SOCKET ConnectSocketSound;//服务器连接成功后,用于传输音频聊天的套接字
 struct sockaddr_in ServerAddSound;//用于进行音频聊天的服务器的ip地址以及端口号
 struct sockaddr_in ClientAddSound;//用于进行音频聊天的客户端的ip地址以及端口号
//用于语音聊天定义-结束///

用于传输棋子坐标数据定义-开始///
// SOCKET ListenSocketChess;  //用于服务器进行监听的套接字
// SOCKET ConnectSocketChess; //服务器连接成功后,用于传输数据的套接字
// struct sockaddr_in ServerAddChess;//服务器的ip地址以及端口号
// struct sockaddr_in ClientAddChess;//客户端的ip地址以及端口号
// WORD SendChess;//发送缓存大小
// WORD ReceiveChess;//接收缓存大小
用于传输棋子坐标数据定义-结束///
 CNetDialog *m_dlg;
 int ReceiveFlag;
 WORD SendChess;//发送缓存大小
 WORD ReceiveChess;//接收缓存大小
public:
 CServer(void);
 ~CServer(void);

    bool AddSocketLib();//加载套接字库
 bool CreateSocket();//创建监听套接字
 bool BindSocket();//绑定套接字到ServerAddress
 bool ListeSocket();//将套接字设置为监听模式,准备接收客户请求
 bool AcceptClient();//等待客户端请求
 bool SendData(WAVEHDR* p);//向客户端发送数据
 bool ReceiveData(WAVEHDR* p,CNetDialog *dialog);//接收客户端发来的数据
 bool InitM_dlg(CNetDialog *Dlg);//将CChatDlg的对象传递给m_dlg
 bool GetServerAddress();//将ip控件框里面的ip地址赋值给ServerAddress和ServerAddressSound
 bool GetSendBuf(CString SendData);//将发送框里面的内容赋值给SendBuf
 bool GetReceiveBuf(CString & RecData);//将ReceiveBuf中的数据保存到一个cstring类型中
// bool SendSound(char *buf,int len);//向客户端发送音频数据
 bool SendMark(int mark);//发送标识,表示下一个收到的数据是文字数据还是,五子棋数据
 HWND hWnd;
用于传输棋子坐标数据定义-开始///
// bool GetServerAddressChess();//将ip控件框里面的ip地址赋值给ServerAddressChess
// bool CreateSocketChess();
// bool BindSocketChess();
// bool ListeSocketChess();
// bool AcceptClientChess();
// bool SendDataChess();
// bool ReceiveDataChess();
用于传输棋子坐标数据定义-结束///

};
#endif

 

 

//Sound.h

//#pragma once
#include"NetDialog.h"
#ifndef _Sound_h_//用于防止头文件嵌套多次1
#define _Sound_h_//用于防止头文件嵌套多次2

class CNetDialog;
#include"Mmsystem.h"//用于录音的函数
#define BUFNUM 10
#define BUFSIZE 1000
#define MAX_BUFFER_SIZE 2048


class CSound
{
public:
 CSound(void);
 ~CSound(void);
 WAVEFORMATEX m_soundFormat;//存储录音以及播放格式的相关信息
 HWAVEIN m_hWaveIn; //输入设备句柄
 HWAVEOUT m_hWaveOut; //输出设备句柄
 WAVEHDR* m_bufferIn[BUFNUM];//用于录音的内存的相关信息
 WAVEHDR* m_bufferOut[BUFNUM];//用于播放的内存的相关信息
 bool m_Outusingflag[BUFNUM];//标识m_bufferOut是否已经与输出设备联系起来!没有为false,有为true


 bool Init(CNetDialog *m_dlg);//初始化音频输入、输出设备
 bool Record();//录音
 bool StopRecord();//停止录音
 bool Play(WAVEHDR *pWaveData);//播放
 bool FreeRecordBuffer(WAVEHDR *pWaveInBuffer);//释放音频输入设备和pWaveInBuffer指向缓存之间的联系
 bool AddRecordBuffer(WAVEHDR *pWaveInBuffer);//添加音频输入设备和pWaveInBuffer指向缓存之间的联系
 bool FreePlayBuffer(WAVEHDR *pWaveInBuffer);//释放音频输出设备和pWaveInBuffer指向缓存之间的联系
};
#endif//用于防止头文件嵌套多次3

 

 

//stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN  // 从 Windows 头中排除极少使用的资料
#endif

// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。
// 有关不同平台的相应值的最新信息,请参考 MSDN。
#ifndef WINVER    // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501  // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT  // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif     

#ifndef _WIN32_WINDOWS  // 允许使用特定于 Windows 98 或更高版本的功能。
#define _WIN32_WINDOWS 0x0410 // 将它更改为适合 Windows Me 或更高版本的相应值。
#endif

#ifndef _WIN32_IE   // 允许使用特定于 IE 6.0 或更高版本的功能。
#define _WIN32_IE 0x0600 // 将此值更改为相应的值,以适用于 IE 的其他版本。值。
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展


#include <afxdisp.h>        // MFC 自动化类

 

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>  // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>   // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT

 

 

 

 

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#else
#pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'/"")
#endif
#endif

 


//Chessboard.cpp

#include "StdAfx.h"
#include "Chessboard.h"

CChessboard::CChessboard(void)
{
 for(int i=0;i<NUM;i++)
  for(int j=0;j<NUM;j++)
  {
   PlayOneChNum[i][j]=0;
   PlayTwoChNum[i][j]=0;
   AllPlayOneChess[i][j]=false;
   AllPlayTwoChess[i][j]=false;
  }
 SpaceBetween=0;
 AllPlayOneChNum=0;
 AllPlayTwoChNum=0;
}

CChessboard::~CChessboard(void)
{

}


///
//      UpdateSpaceBetween函数-开始               //
//         当窗口重画时,改变两条线之间的距离            //
///
bool CChessboard::UpdateSpaceBetween(int x,int y)
{
 SpaceBetween=((NUM-2)*y/NUM)/(NUM-1);
 return true;
}
///
//      UpdateSpaceBetween函数-结束               //
//         当窗口重画时,改变两条线之间的距离            //
///

///
//        DrawChessboard函数-开始               //
//          绘制棋盘              //
///
bool CChessboard::DrawChessboard(CWnd *wnd)
{
 HDC hdc;
 CString tempI;
 static int cxChar,cyChar;
    TEXTMETRIC  tm ;

///获取字体的宽度-开始/      
 hdc=::GetDC (wnd->m_hWnd);
 ::GetTextMetrics (hdc, &tm);
 cxChar=tm.tmAveCharWidth;
 cyChar=tm.tmHeight+tm.tmExternalLeading;
 ::ReleaseDC (wnd->m_hWnd, hdc);
///获取字体的宽度-结束/
 
///绘制棋盘横竖线和边上的坐标-开始/
 hdc =::GetDC(wnd->m_hWnd) ;
 ::Rectangle(hdc,SpaceBetween-1,SpaceBetween-1,SpaceBetween*NUM,SpaceBetween*NUM);
 ::TextOut(hdc,SpaceBetween*4/10,SpaceBetween*4/10,TEXT("0"),1);
 for(int i=0;i<=NUM-1;i++)
 {
  ::MoveToEx(hdc,SpaceBetween,SpaceBetween+SpaceBetween*i,NULL);//绘制棋盘横竖线条
  ::LineTo(hdc,SpaceBetween*NUM,SpaceBetween+SpaceBetween*i);//绘制棋盘横竖线条
  ::MoveToEx(hdc,SpaceBetween+SpaceBetween*i,SpaceBetween,NULL);//绘制棋盘横竖线条
  ::LineTo(hdc,SpaceBetween+SpaceBetween*i,SpaceBetween*NUM);//绘制棋盘横竖线条
  tempI.Format("%d",i);
 ///绘制棋盘边上的数字-开始//
  if(i!=0&&i<=9)
  {
   TextOut(hdc,SpaceBetween*(i+1)-cxChar/2,SpaceBetween*2/10,tempI,1);
   TextOut(hdc,SpaceBetween*2/10,SpaceBetween*(i+1)-cxChar,tempI,1);
  }
  if(i!=0&&i>9)//大于9后为两位所以显示位置有改变
  {
   TextOut(hdc,SpaceBetween*(i+1)-cxChar,SpaceBetween*2/10,tempI,2);
   TextOut(hdc,SpaceBetween*2/10,SpaceBetween*(i+1)-cxChar,tempI,2);
  }
 ///绘制棋盘边上的数字-结束//
 }

///绘制棋盘横竖线和边上的坐标-结束/

///绘制棋盘上的四个小矩形-开始/
 HBRUSH hBrush;
 hBrush=(HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));//保存原来的画刷用于恢复
 Rectangle(hdc,4*SpaceBetween-SpaceBetween*1/5,4*SpaceBetween-SpaceBetween*1/5,
  4*SpaceBetween+SpaceBetween*1/5,4*SpaceBetween+SpaceBetween*1/5);
 Rectangle(hdc,12*SpaceBetween-SpaceBetween*1/5,4*SpaceBetween-SpaceBetween*1/5,
  12*SpaceBetween+SpaceBetween*1/5,4*SpaceBetween+SpaceBetween*1/5);
 Rectangle(hdc,4*SpaceBetween-SpaceBetween*1/5,12*SpaceBetween-SpaceBetween*1/5,
  4*SpaceBetween+SpaceBetween*1/5,12*SpaceBetween+SpaceBetween*1/5);
 Rectangle(hdc,12*SpaceBetween-SpaceBetween*1/5,12*SpaceBetween-SpaceBetween*1/5,
  12*SpaceBetween+SpaceBetween*1/5,12*SpaceBetween+SpaceBetween*1/5);
 SelectObject(hdc,hBrush);//恢复原来的画刷
///绘制棋盘上的四个小矩形-结束/

///绘制棋盘边的文字-开始/
 ::TextOut(hdc,SpaceBetween*(NUM+1),SpaceBetween*2,TEXT("Player time:"),12);
 ::TextOut(hdc,SpaceBetween*(NUM+1),SpaceBetween*3,TEXT("Computer time:"),14);
 ::TextOut(hdc,SpaceBetween*(NUM+1),SpaceBetween*5,TEXT("Step:"),5);
///绘制棋盘边的文字-结束/

///绘制棋盘上的棋子-开始/
for(int j=0;j<NUM;j++)
 for(int i=0;i<NUM;i++)
 {
  if(AllPlayOneChess[i][j]==true)
  {
   int tempCooX=(i+1)*SpaceBe

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值