class Game
{
public:
void Init(HWND); // 游戏初始化
void Render(HDC); // 绘制游戏对象
void DrawGameOver(HDC); // 绘制游戏结束
void DrawBackground(HDC); // 绘制游戏背景
void CheckGameOver(); // 检测是否游戏结束
void MouseDown(int, int); // 鼠标点击消息
private:
Board m_board; // 游戏棋盘
bool m_bIsGameOver; // 是否结束游戏
GameOverType m_over_type; // 游戏结局类型
HWND m_hWnd; // 窗口句柄
};
class Board
{
public:
~Board(); // 析构函数
public:
void Init(HWND); // 初始化
void Render(HDC); // 绘制棋盘
void DrawBoard(HDC); // 绘制棋盘
void MouseDown(int, int); // 鼠标点击消息
public:
Prece** GetPreces() { return m_ppPreces; } // 获取棋盘上的所有棋子
private:
RECT m_rect; // 棋盘矩形
ClickPlayer m_cur_click; // 当前玩家
Prece** m_ppPreces; // 棋盘上的所有棋子
};
class Prece
{
public:
Prece(int, int, int, int, int); // 构造函数
public:
void Render(HDC); // 绘制棋子
void DrawGraphics(HDC); // 绘制棋子点击后的图形,比如玩家1的是"×",玩家2的是"○"
void DrawPlayer1Graphics(HDC); // 绘制玩家1点击图形
void DrawPlayer2Graphics(HDC); // 绘制玩家2点击图形
bool CheckClick(int, int); // 当鼠标点击时候,判断鼠标是否点击到棋子
void Click(ClickPlayer); // 棋子被点击
public:
bool IsClick() { return m_bIsClick; }; // 棋子是否被点击
ClickPlayer GetClickPlayer() { return m_click_player; } // 获取点击该棋子的玩家
int GetIndex() { return m_index; } // 获取棋子的下标
private:
int m_index; // 格子的下标
int m_x; // 棋子横坐标
int m_y; // 棋子纵坐标
int m_w; // 棋子的宽度
int m_h; // 棋子的高度
bool m_bIsClick; // 棋子是否被点击
ClickPlayer m_click_player; // 点击棋子的玩家
};
class Util
{
public:
static void DrawLine(HDC, int[4]); // 绘制一条直线
static void CreateDoubleBuffer(HWND, HDC &, HBITMAP &); // 创建双缓冲(兼容DC和兼容位图)
static void CreateLogFont(HFONT &, int); // 创建逻辑字体
};
//++++++++++++++++++++++++++++++++++
// 宏定义
//----------------------------------
#define UNICODE // 使用UNICODE编码,如果在编译器设置了使用UNICODE字符集此处可免
#define _UNICODE // 使用UNICODE编码,如果在编译器设置了使用UNICODE字符集此处可免
//++++++++++++++++++++++++++++++++++
// 头文件
//----------------------------------
#include // Win32程序最重要的头文件
#include // 兼容字符集头文件
#include "game.h" // 游戏头文件
#include "util.h" // 常用工具头文件
//++++++++++++++++++++++++++++++++++
// 全局变量
//----------------------------------
WCHAR g_lpszClassName[] = _T("TicTacToe"); // 窗口类的名称
WCHAR g_lpszWindowName[] = _T("TicTacToe"); // 窗口的名称,(也就是窗口的标题)
Game g_game; // 游戏对象
HDC g_mdc; // 兼容DC
HBITMAP g_bitmap; // 兼容位图
//++++++++++++++++++++++++++++++++++
// 函数声明
//----------------------------------
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 窗口消息处理过程
VOID TicTacToe_Init(HWND); // 井字游戏初始化
VOID TicTacToe_Render(HWND); // 井字游戏绘制
VOID TicTacToe_MouseDown(int, int); // 井字游戏鼠标点击处理
//++++++++++++++++++++++++++++++++++
// 游戏主函数
//----------------------------------
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT nCmdShow)
{
/* 1.设计一个窗口类 */
/* 2.注册窗口类 */
/* 3.创建窗口 */
/* 4.更新显示窗口 */
/* 井字游戏的初始化 */
TicTacToe_Init(hWnd);
/* 5.消息循环 */
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* 井字游戏渲染 */
TicTacToe_Render(hWnd);
}
return msg.wParam;
}
//++++++++++++++++++++++++++++++++++
// 窗口消息处理过程
//----------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
/* 井字游戏渲染 */
TicTacToe_Render(hWnd);
break;
case WM_LBUTTONDOWN:
/* 井字游戏鼠标点击消息处理 */
TicTacToe_MouseDown(LOWORD(lParam), HIWORD(lParam));
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ((LRESULT)0);
}
//++++++++++++++++++++++++++++++++++
// 井字游戏初始化
//----------------------------------
VOID TicTacToe_Init(HWND hWnd)
{
/* 游戏初始化 */
g_game.Init(hWnd);
/* 创建兼容DC和兼容位图 */
Util::CreateDoubleBuffer(hWnd, g_mdc, g_bitmap);
::SelectObject(g_mdc, g_bitmap);
}
//++++++++++++++++++++++++++++++++++
// 井字游戏绘制
//----------------------------------
VOID TicTacToe_Render(HWND hWnd)
{
if (g_mdc == NULL)
return;
HDC hdc = ::GetDC(hWnd);
RECT clientRect;
::GetClientRect(hWnd, &clientRect);
int width = clientRect.right - clientRect.left;
int height = clientRect.bottom - clientRect.top;
/* 游戏绘制 */
g_game.Render(g_mdc);
/* 将兼容DC绘制到设备DC上 */
::BitBlt(hdc, 0, 0, width, height, g_mdc, 0, 0, SRCCOPY);
::ReleaseDC(hWnd, hdc);
}
//++++++++++++++++++++++++++++++++++
// 井字游戏鼠标点击
//----------------------------------
VOID TicTacToe_MouseDown(int x, int y)
{
/* 游戏鼠标事件处理 */
g_game.MouseDown(x, y);
}