(连载)一步一步教你做黑白棋游戏(二)

来源:互联网 发布:公司地址网络怎么收录 编辑:程序博客网 时间:2024/09/21 08:51

好吧,懒了大半年终于碰到需要这份教程的人了,我也要慢慢连载完这个东西了= =


好了,既然是C++,那么请允许我用类的基础方法实现这个小程序。

我们将要创建3个类,

COthelloMain  主类

COthelloView  视图类,负责图像显示的

COthelloLogic 逻辑类,负责逻辑处理的

本人不才,还没弄清楚设计模式什么的,所以类的使用难免很低级,望各位大神手下留情。


VS2010里面添加类有个方便的东西,具体操作如下:

1.在菜单->视图->类视图  调出类视图的窗口,然后在Othello上点击右键添加类,如图:


2.然后会出现一个对话框,选择C++类点击添加,然后输入类名,其余不用管,如此添加完三个类。添加完后VS会自动生成各个类的.h和.cpp文件,我们需要在程序中用到这些类,那么就需要将这些类包含在Othello.cpp中,由于主类调控视图类和逻辑类,所以直接添加一个

#include "OthelloMain.h"

在Othello.cpp的头文件添加位置即可。


然后在稍微下面的地方找到全局变量声明的地方写上这样一行代码:

COthelloMain g_OthelloMain;                     //创建主类
这是为了实例化类,进而使用类的功能。

在主类中添加成员变量,m_View和m_Logic;添加方法如下:

1.

2.然后同样在弹出的窗口中填写数据,填写完后生成的代码应该是如下的。

private:COthelloView m_View;COthelloLogic m_Logic;

此时不必担心头文件,VS已经自动添加了。

 

为每一个类添加一个初始化的成员函数Init(HWND hWnd),为什么参数要是窗口句柄呢?因为画图需要获取窗口句柄。添加完毕之后不要忙着写函数里面的代码,先在Othello.cpp中添加入主类的初始化函数:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){   HWND hWnd;   hInst = hInstance; // 将实例句柄存储在全局变量中   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX,      CW_USEDEFAULT, 0, 486,588, NULL, NULL, hInstance, NULL);//偏移是6,28   if (!hWnd)   {      return FALSE;   }   ShowWindow(hWnd, nCmdShow);   UpdateWindow(hWnd);   g_OthelloMain.InitMain(hWnd);//这里是主类的初始化函数     return TRUE;}
如上面所示添加一行代码。


下面我们来写绘图部分的初始代码:

在视图类中添加成员变量:

private:HWND m_hWnd;            //存储窗口句柄HBITMAP m_hBmpBack;     //存储背景图片HBITMAP m_hBmpBlack;    //存储黑棋图片HBITMAP m_hBmpWhite;    //存储白棋图片

HBITMAP是用来存储图片的数据类型,这里存储我们要用到的棋子和背景图片。

添加完后我们需要添加一个成员函数Onpaint();

这个函数承担所有画图的操作并且负责重绘时的调用工作。

然后我们在视图类中的初始化函数里面写上加载图片的代码:

        m_hWnd = hWnd;m_hBmpBack = (HBITMAP) LoadImage(NULL,_T("res\\Back.bmp"),IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE );if(m_hBmpBack == NULL){MessageBox(NULL,_T("读取背景文件失败"), _T("Error") , MB_OK);return false;}m_hBmpBlack = (HBITMAP) LoadImage (NULL, _T("res\\Black.bmp"),IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);if(m_hBmpBlack == NULL){MessageBox(NULL,_T("读取黑子文件失败"), _T("Error") , MB_OK);return false;}m_hBmpWhite = (HBITMAP) LoadImage (NULL, _T("res\\White.bmp"),IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);if(m_hBmpWhite == NULL){MessageBox(NULL,_T("读取白子文件失败"), _T("Error") , MB_OK);return false;}        Onpaint();
LoadImage和MessageBox函数大家自己百度,一个是载入图片的函数一个是消息框的函数,这里判断语句是为了后面运行时程序不正常出在图片这一块的时候可以很清楚的知道。解释一下LoadImage函数里面的那个类似文件地址的参数,这里res是在解决方案文件夹里面创建的一个文件夹,用来集中存放图片资源,后面就是文件名,和资源管理器中的地址写法一致,创建的确切位置如下图:

装载完图片后我们需要画出来,所以后面会跟上一个OnPaint();

下面写OnPaint()函数里面的代码:

void COthelloView::OnPaint(void)//重绘函数{    HDC hdcMem;                   //创建内存    DCHDC hdcScr = GetDC(m_hWnd);             //获取当前窗口的DC给屏幕DC    hdcMem = CreateCompatibleDC(hdcScr);   //使得内存DC兼容屏幕DC    SelectObject(hdcMem,m_hBmpBack);       //将背景图片装载在内存DC中    BitBlt(hdcScr,0,0,480,480,hdcMem,0,0,SRCCOPY);//将装在内存DC中的背景图片画在屏幕DC上bitblt韩式自己百度参数的含义              DeleteDC(hdcMem);    DeleteDC(hdcScr);}


代码到这里还是不能显示图片,这是由于程序并没有调用视图类的代码进行绘图,于是我们需要在初始化的时候进行第一次绘图,这里就需要将视图类的初始化函数加在主类的初始化函数中:

bool COthelloMain::InitMain(HWND hWnd)//初始化游戏{        m_View.Init(hWnd);        return false;}

同时让主类提供一个绘图函数的接口,添加一个函数并且代码如下:

void COthelloMain::OnPaint(void)//重绘函数{m_View.OnPaint();}

这样运行程序之后会看到背景图片显示了,但是有个问题,你最小化窗口以及将窗口拖到屏幕外再拉回来的时候图像会消失。这是由于窗口改动了图像需要重新绘制,但是在重新绘制的代码那里你什么都没写所以就一片空白了,这样我们的主类的绘图韩式就有作用了,在Othello.cpp文件里面找到如下代码:

case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...EndPaint(hWnd, &ps);break;

这里很明显是我们要找的重绘的地方,所以加上我们的代码:

case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...g_OthelloMain.OnPaint();     //主类调用视图类的重绘函数EndPaint(hWnd, &ps);break;

如此每次需要重绘的时候会自动调用这个函数来进行重新绘制,图像不再会丢失了。

至此绘图的基础已经建立,下一步我们需要在逻辑上面完整的建立一个黑白棋的算法,敬请期待!

原创粉丝点击