C++五子棋的毕业设计|C++游戏设计
3 棋盘类——CTable
3.1 主要成员变量说明
3.1.1 网络连接标志——m_bConnected
用来表示当前网络连接的情况,在网络对弈游戏模式下客户端连接服务器的时候用来判断是否连接成功;事实上,它也是区分当前游戏模式的唯一标志。
3.1.2 棋盘等待标志——m_bWait与m_bOldWait
由于在玩家落子后需要等待对方落子,m_bWait标志就用来标识棋盘的等待状态。当m_bWait为TRUE时,是不允许玩家落子的。
在网络对弈模式下,玩家之间需要互相发送诸如悔棋、和棋这一类的请求消息,在发送请求后等待对方回应时,也是不允许落子的,所以需要将m_bWait标志置为TRUE。在收到对方回应后,需要恢复原有的棋盘等待状态,所以需要另外一个变量在发送请求之前保存棋盘的等待状态做恢复之用,也就是m_bOldWait。
等待标志的设置,由成员函数SetWait和RestoreWait完成。
3.1.3 网络套接字——m_sock和m_conn
在网络对弈游戏模式下,需要用到这两个套接字对象。其中m_sock对象用于做服务器时的监听之用,m_conn用于网络连接的传输。
3.1.4 棋盘数据——m_data
这是一个15*15的二位数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。
3.1.5 游戏模式指针——m_pGame
这个CGame类的对象指针是CTable类的核心内容。它所指向的对象实体决定了CTable在执行一件事情时候的不同行为,具体的内容请参见“游戏模式”一节。
3.2 主要成员函数说明
3.2.1 套接字的回调处理——Accept、Connect、Receive
本程序的套接字派生自MFC的CAsyncSocket类[6],CTable的这三个成员函数就分别提供了对套接字[7]回调事件OnAccept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息(参见“消息机制”一节)的分发处理。
3.2.2 清空棋盘——Clear
在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情:
l 将m_data中每一个落子位都置为无子状态(-1)。
l 按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。
l 使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。
3.2.3 绘制棋子——Draw
这无疑是很重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下:
l 将给定的棋盘坐标换算为绘图的像素坐标。
l 根据坐标绘制棋子位图。
l 如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。
l 在刚绘制完成的棋子四周绘制最后落子指示矩形。
3.2.4 左键消息——OnLButtonUp
作为棋盘唯一响应的左键消息,也需要做不少的工作:
l 如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。
l 如果点击时的鼠标坐标在合法坐标(0, 0)~(14, 14)之外,亦禁止落子。
l 如果走的步数大于1步,方才允许悔棋。
l 进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。
l 如未胜利,则向对方发送已经落子的消息。
l 落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。
3.2.5 绘制棋盘——OnPaint
每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。这个函数主要完成了以下工作:
l 装载棋盘位图并进行绘制。
l 根据棋盘数据绘制棋子。
l 绘制最后落子指示矩形。
3.2.6 对方落子完毕——Over
在对方落子之后,仍然需要做一些判断工作,这些工作与OnLButtonUp中的类似,在此不再赘述。
3.2.7 设置游戏模式——SetGameMode
这个函数通过传入的游戏模式参数对m_pGame指针进行了初始化,代码如下:
void CTable::SetGameMode( int nGameMode )
{
参考文献
[1] MSDN for Visual Studio 6.0
[2] 设计模式——可复用面向对象软件的基础,Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英军/马晓星/蔡敏/刘建中 等译,机械工业出版社
[3] 深入浅出MFC(第2版),侯俊杰著,华中科技大学出版社
[4] A Beginner 's Guide to Pointers,Andrew Peace
http://www.codeproject.com/cpp/pointers.asp
[5] 水煮多态,titilima
http://home.nuc.edu.cn/~titilima/readarticle.php?id=53
[6] Microsoft® Visual C++.NET 技术内幕(第6版),George Shepherd/David Kruglinski著,潘爱民译,清华大学出版社
[7] Visual C++网络通信协议分析与应用实现,汪晓平/钟军 等编著,人民邮电出版社
[8] C++编程思想,Bruce Eckel著,刘宗田/邢大红/孙慧杰 等译,机械工业出版社
[9] 21天学通C++,Jesse Liberty著,康博创作室译,人民邮电出版社
[10] C++标准程序库,Nicolai M.Josuttis著,侯捷/孟岩 译,华中科技大学出版社
[11] Windows程序设计,Charles Petzold著,北京博彦科技发展有限公司译,北京大学出版社
[12] Visual C++.NET网络编程,易君 编著,中国铁道出版社
[13] 博弈树搜索
http://202.113.96.26/wlkc/rengongzhineng/rengongzhineng/kejian/AI/Ai/chapter3/33.htm
[14] 五子棋的核心算法,蝈蝈俊.net
http://blog.joycode.com/ghj/articles/12727.aspx
[15] 道法自然,王咏武/王咏刚 著,电子工业出版社
致谢
感谢我的父母,没有您们的包容和支持,就不会有我的今天。
感谢我的导师XX,您开明地为我进京实习提供了那么多便利条件。
感谢北京灵图软件技术有限公司,为我无偿提供了开发环境。
感谢kedy,谢谢你为我提供的代理服务器,让我在学校的时候能够及时上网获取资料。在此祝福你能在金山开创美好的未来。
感谢中北大学信息中心的xxx学长,为我解释了很多网络连接的知识。
感谢武汉大学的xx同学,谢谢你在工作之余和我一起进行CAsyncSocket部分的测试。
感谢502的所有兄弟,谢谢你们在我离校期间为我所作的一切。
感谢不一样的鱼、hottey、赵晋辉、杜琳和赵序庚同学,谢谢你们在测试期提供的帮助和修改意见。
感谢XX组,谢谢你们提供的《名侦探柯南》。尤其是情报员源源,谢谢你一直以来为我提供的一切便利条件。
感谢xx公司,你们的Grand Theft Auto: Vice City伴我度过了下班后的无聊时光。
以上内容只是毕业设计作品的部分资料介绍,如果了解更多详情请联系客服QQ:57510459
购买帮助>>