毕业设计论文.docx
《毕业设计论文.docx》由会员分享,可在线阅读,更多相关《毕业设计论文.docx(66页珍藏版)》请在冰点文库上搜索。
毕业设计论文
摘要
网络棋牌游戏,作为一个新生事物,从诞生到现在不过几年时间。
随着互联网在我国的飞速发展,网络棋牌以其足不出户便能决胜于千里之外的独有魅力,早已将那些以往只能面对面博弈的棋友们,从棋桌上拉到了电脑屏幕前。
这是世界棋牌运动的未来发展趋势[1]。
棋牌类游戏是网络游戏中非常流行的游戏种类,它简单易学、趣味性强,与其它大型网游相比,游戏设计和实现的难度相对较低[2]。
本文首先将阐述网络棋牌游戏的背景和研究的意义,接着简单介绍基于VC++和开源的2D游戏引擎HGE设计的局域网对战“跑得快”游戏的一种实现方法。
并介绍了套接字(SOCKET)的使用,多线程通信的实现,HGE引擎的简单使用以及HGE引擎中GUI(图形用户界面)的简单应用。
该系统界面友好,功能实现起来容易,对编写棋牌游戏的入门有着很好的帮助。
关键词:
套接字;VC++;HGE;多线程
Abstract
Networkcardgames,asanewthing,fromthebirthofafewyearsnow,however.WiththerapidInternetdevelopmentinChina,thenetworkwillbeabletorun-offCardintheirhomesthousandsofmilesawayontheuniquecharmofthepast,onlythosewhoalreadyface-to-facefriendschessgame,chesstable,pulledfromacomputerscreen.ThisCardisoneoftheworlddevelopmenttrendofthefutureofthatmovement.
Cardgamesareverypopularonlinegametypesofgames,iteasytolearn,fun,andcomparedwithotherlarge-scaleonlinegames,gamedesignandrealizationofarelativelylowdegreeofdifficulty.Thisarticlewillfirstsetoutthebackgroundofthenetworkboardgamesandstudythemeaning,andthenabriefintroductionbasedonVC++andopensource2DgameenginedesignHGELANagainst"runfast,"Methodforthegame.AndintroducedtheSocket(SOCKET)theuseoftherealizationofmulti-threadedcommunication,HGEengineandsimpletouseHGEengineGUI(graphicaluserinterface)asimpleapplication.Thesystemisuser-friendly,functionaleasytoachieve,tothepreparationofboardgameshaveaverygoodentryhelp.
Keywords:
Socket;VC++;HGE;multi-threaded
1.绪论
1.1引言
中华民族是一个有着几千年悠久历史和璀璨文化的国家,而棋牌娱乐却早已突破了纯游戏的范畴而成为中国传统文化的一个分支。
棋牌娱乐在中国拥有良好的群众基础好,得到了广泛的普及,在经过几千年的衍化之后,其精髓已经达到了登峰造极的地步。
他旺盛的生命力非一般性娱乐项目所能比拟。
而象棋、围棋这种国粹级娱乐方式在经过千百年来的不断发展后,已经成为民族文化不可分割的一个重要组成部分。
1.2网络棋牌游戏研究的发展及研究现状
1992-1996年,中国网络游戏的“史前文明”时期,以《侠客行》为代表的文字网络游戏(Mud,中文译称“泥巴”)[3]游戏开始盛行,它们类似于一个大的交互聊天室,是以文字叙述的形式来体现游戏性。
比如一个玩家进入游戏,所有玩家就会受到一条信息:
XXX骑着马飞驰而来。
就是现在看似如此简单的游戏,写下了中国的网络游戏的第一页。
1998年6月,鲍岳桥、简晶、王建华始创的联众游戏世界,开始在东方网景架设游戏服务器[3],免费提供给国内上网用户围棋、中国象棋、跳棋、拖拉机、拱猪等共计5种网络棋牌游戏的服务,一代世界网络游戏巨人开始迈出了它的第一步。
1999年7月,网络创世纪(Ultima Online)民间模拟服务器出现[3],深圳、北京、上海等地先后出现了大量的模拟服务器,从那时起,国内的玩家们才开始实质性地接触到了真正的优秀的图形网络游戏。
2000年3月,联众创造网络竞技吉尼斯世界记录。
联众在拓展海外市场时选择韩国,在联众游戏世界韩文版开始运行的同时,中韩合作双方联袂举办首届“中韩网络围棋对抗赛”,创下了当时规模最大的网络围棋比赛人数记录——12140人,该赛事创下吉尼斯世界纪录并得到吉尼斯的正式认证[3]。
2001年5月,“联众世界”成长为世界最大在线游戏网站。
经过3年多的迅速成长,联众已经发展到同时在线17万人、注册用户约1800万的规模,一举成为全球最大的在线游戏站点[3]。
2003年7月23日,由国家新闻出版总署批准的、唯一全国性的游戏出版行业组织--中国出版工作者协会游戏工作委员会在京成立。
2003年9月,网络游戏正式被列入国家863计划,政府将投入500万支持原创网游开发,金山和世模成为863计划的第一批收益者。
近年来,我国经济发展,科技进步,网络文化市场也发展很快,为网络游戏市场的发展创造了条件。
我国网络游戏市场发展迅速并进入了一个高速增长期,而在线棋牌也出现了许多生产和运营企业。
而棋牌类游戏中最有影响力的还属联众,腾讯和中国游戏中心。
联众是国内最有影响的棋牌类游戏网站,它致力于把拥有悠久文化传统和深厚群众基础的传统棋牌类游戏搬上网,在探索具有网络特色的比赛规则、比赛形式、比赛制度等方面,取得了大量有益的经验。
“中国游戏中心”是由深圳电信运营维护的,作为全国最知名的综合游戏网站之一,其拥有9000多万的注册用户,娱乐平台繁忙时的同时在线人数30余万,高峰期达40几万。
深圳腾讯公司于2003年4月推出的QQ游戏中心,在其主流通信软件腾讯QQ的强大影响力下吸引了巨大的用户群,目前已经拥有了9款成熟的棋牌游戏,目前最高在线人数已经达接近30万人次。
除了这3家知名的棋牌游戏公司外,各地方性的棋牌公司也层出不穷,比如赖子山庄、红心棋牌、黄金岛、踢狗、凤凰山庄、边锋以及一向低调行事却快速发展的金游世界等,他们都有着本地棋牌游戏的特色。
各自占据了本地的市场。
网络棋牌,作为一个新生事物,从诞生到现在不过几年时间。
但随着互联网在我国的飞速发展,网络棋牌以其足不出户便能决胜于千里之外的独有魅力,早已将那些以往只能面对面博弈的棋友们,从棋桌上拉到了电脑屏幕前。
这是世界棋牌运动的未来发展趋势。
1.3研究的背景
近年来,我国经济发展,科技进步,网络文化市场也发展很快,为网络游戏市场的发展创造了条件。
我国网络游戏市场发展迅速并进入了一个高速增长期,而网络棋牌,作为其一个重要的部分,也在飞速发展。
不仅出现了如联众,中国游戏中心,腾讯等知名的游戏平台,赖子山庄、红心棋牌、黄金岛、踢狗、凤凰山庄、边锋以及金游世界等有着浓重地方特色的游戏平台也纷纷出现占据了不同的省份和地市[4],在短短的10几年的发展中棋牌娱乐平台制作更加得精美,系统功能更加完善、互动性更加强,还出现了像是视频棋牌游戏等吸引人的新形式,吸引了越来越多的用户,且都收到了十分不错的效益。
1.4研究的意义
随着休闲网络游戏市场竞争的升级,尤其是网络棋牌游戏的巨大市场前景的吸引,许多公司都加入到棋牌游戏的竞争之列,竞争十分激烈。
目前全国流行的棋牌游戏市场(斗地主、象棋、军旗、梭哈)已经基本被几个大的游戏厂商(联众、腾讯、边锋、远航、中游)所占据。
由于中国不同的省份都有自己独特的文化特性,各个省份也都有自己区域内流行的有别其他省份的扑克或者麻将的规则,地方棋牌游戏,这块市场现在正处于高速成长阶段。
因此,研究与实现区域性棋牌游戏的设计与实现具有现实意义。
本系统是基于VC++和开源的2D引擎HGE的局域网对战游戏,系统结构是C/S结构[5],主要功能是三个人在局域网内能够实现牌类型游戏"跑得快"的对战。
既锻炼了软件系统开发能力,也提高了对理论知识的理解。
1.5研究内容和拟解决的关键问题
本设计以研究棋牌类游戏中的“跑得快”为主。
跑得快:
跑得快打一副牌时,也称为“关牌”,主要流行于江浙一带,大学校园当中亦很盛行。
游戏规则类似北方流行的“斗地主”。
此游戏的目的是想方设法地将自己手中的牌尽快打出去,谁先把手中的牌出完,即为胜。
技术内容:
(1)使用C\S模式,异步通信的方式。
(2)使用HGE引擎中的GUI(图形用户界面)对图形进行操作实现出牌。
(3)能对出牌进行判断,使“跑得快”游戏能正确实现。
(4)简单的人工智能,使之能在需要的时候自行出牌。
关键问题:
(1)了解HGE引擎的工作原理并能正确地使用。
(2)能根据所接收的数据对图片进行正确的读取。
(3)对套接字和异步通信知识的学习和使用。
(4)标准模板库(STL)[6][7]的学习和正确使用。
(5)合理的图片和颜色搭配。
1.6需求分析
网络棋牌游戏是一个广阔的市场,很多公司看见了其中的商机,随之而来的各种游戏平台如雨后春笋般得出现。
至2008年,国内的棋牌平台已经呈现割据状态,陆续出现了许多中小平台,打着本地游戏的旗帜,分别占据了不同的省份和地市。
这些棋牌游戏极大的丰富了人们网络娱乐生活的作用,也给各公司带来了客观的利润。
虽然网络棋牌的平台众多,但是他们都有着一些相似的特点和功能:
(1)账号系统:
记录玩家信息:
姓名,分数等。
(2)都能正常得按照规则进行游戏。
(3)画面简洁。
(4)座位模式:
可以方便几个熟悉的人一起游戏。
(5)游戏操作介绍:
在进行游戏前都有本棋牌游戏规则的介绍,方便玩家能更好得了解而本棋牌游戏,从而能更好得进行游戏
(6)记分系统:
每个玩家的进行游戏后系统会根据输赢状况按照规则对玩家进行记分,并计算出玩家在本游戏中的总分,胜率等等,并且根据不同的分数有着不同的头衔。
(7)聊天系统:
在玩家进行游戏的界面上都有聊天框,方便各各玩家间的交流。
(8)分级模式:
有着如新手场,普通场,高手场等等按照分数把各个水平的玩家分开,能让玩家们更好得寻找合适自己的对手,这样能更好地使玩家们找到游戏带来的乐趣。
(9)自动出牌:
当玩家需要离开时,可以使用自动出牌让电脑自行出牌。
2.开发工具
2.1VisualC++集成开发环境
VisualC++开发环境是一个基于Windows操作系统的可视化、面向对象的集成开发环境(IntegratedDevelopmentEnvironment,IDE)。
在该环境下用户可以开发有关C和C++的各种应用程序,应用程序包括建立、编辑、浏览、保存、编译、链接和调试等操作,这些操作都可以通过单击菜单选项或工具栏按钮来完成,使用方便、快捷。
它提供了项目区(Workspace)、应用程序向导(AppWizard)、类操作向导(ClassWizard)和WizardBar等实用编程工具。
2.1.1正文窗口
正文窗口一般在开发平台的右上部分。
程序文件、资源文件、文档文件以及帮助信息等,都可以通过主窗口显示出来。
用户可以同时打开多个正文窗口,对每个窗口都可以进行一般Windows窗口的操作,并且可以通过Window菜单中选定特定的窗口或者用鼠标来激活自己想要切换的窗口。
2.1.2Workspace窗口
Workspace窗口一般在集成开发环境的左侧。
打开一个工程后,该窗口的下端会出现3个标签,它们是:
ClassView(类视图),ResourceView(资源视图),FileView(文件视图)。
单击某个图标标签会出现相应的页面。
如图2-1所示。
图2-1Workspace窗口
2.2Haaf'sGameEngine引擎
HGE-Haaf'sGameEngine[8]:
是一套十分易用的硬件加速2D游戏引擎。
它基于DX8,运行于各种Win32平台,同时支持VC,BC,MinGW多种编译环境。
它使用“Thezlib/libpnglicense”协议发布,可以自由地使用在包括商业性质的项目上。
具有1.专为2D游戏项目提供2.接口简单且易于扩展3.完善的文档4.使用自由等特性。
2.2.1HGE引擎在vc++6.0上的使用
(1)设置头文件和lib库的路径
打开对话框选项卡Tools->Options->Directories,添加HGE引擎“include”文件夹路径,并把它移动至顶端。
如图2-2所示。
图2-2添加“include”文件夹
在同一个对话框选项卡中,在“Showdirectoriesfor”中选择“Libraryfiles”the添加HGE引擎"lib\vc"文件夹路径,并把它移动至顶端。
如图2-3所示
图2-3添加lib文件夹
(2)游戏引擎的创建
打开vc++6.0,创建一个Win32Application程序,如图2-4所示。
图2-4创建Win32Application程序
然后选择Anemptyproject。
如图2-5所示。
图2-5创建向导
(3)添加lib库到工程
打开对话框选项卡Project->Settings...->Link然后添加hge.lib和hgehelp.lib到Object/librarymodules中。
如图2-6所示
图2-6添加lib链接
2.2.2HGE引擎的初始化[9]
#include"hge.h"//包含hge头文件
HGE*hge=0;//创建一个指向hge类的指针。
boolRenderFunc()//绘制函数,程序开始后HGE将不停调用它
{
returnfalse;//总返回false
}
boolFrameFunc()//逻辑函数,程序开始后HGE将不停调用它,一些逻辑判断或者处理可以写在这里。
{
returnfalse;//程序正常时总是返回false,返回true将从System_Start往下执行
}
intWINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int)//WinMain函数,程序的入口。
{
hge=hgeCreate(HGE_VERSION);//使用hgeCreate函数创建HGE接口,参数必须传递正确的HGE_VERSION,它是在hge.h中定义的
hge->System_SetState(HGE_SCREENWIDTH,800);//将屏幕宽度设置为800
hge->System_SetState(HGE_SCREENHEIGHT,600);//将屏幕高度设置为600
hge->System_SetState(HGE_FRAMEFUNC,FrameFunc);//设置逻辑函数为FrameFunc函数
hge->System_SetState(HGE_RENDERFUNC,RenderFunc);//设置绘制函数为RenderFunc函数
hge->System_SetState(HGE_TITLE,"我的第一个HGE程序");//设置窗口标题为“我的第一个HGE程序”
hge->System_SetState(HGE_WINDOWED,true);//设置使用窗口模式
hge->System_SetState(HGE_USESOUND,false);//设置不使用声音
if(hge->System_Initiate())//用hge类的System_Initiate()方法,检测初始化是否有错误出现。
{
hge->System_Start();//如果没有问题,则使用System_Start方法,开始程序。
}
hge->System_ShutDown();//程序停止
hge->Release();//释放HGE所占用的内存。
}
如此一个简单的HGE引擎框架就完成我们可以在RenderFunc()和FrameFunc()添加逻辑代码,实现游戏的功能。
3.总体设计
3.1系统概述
本系统是基于VC++和开源的2D游戏引擎HGE的局域网对战游戏,系统结构是C/S结构,通过套接字(SOCKET)[10]进行通信,当有3个用户连接服务器通过服务器进行随机的发牌,主实现三个人在局域网内"跑得快"的对战。
HGE-Haaf'sGameEngine:
是一套十分易用的硬件加速2D游戏引擎。
它基于DX8,运行于各种Win32平台,同时支持VC,BC,MinGW多种编译环境。
它使用“Thezlib/libpnglicense”协议发布。
具有1.专为2D游戏项目提供2.接口简单且易于扩展3.完善的文档4.使用自由等特性。
VisualC++开发环境是一个基于Windows操作系统的可视化、面向对象的集成开发环境(IntegratedDevelopmentEnvironment,IDE)。
在该环境下用户可以开发有关C和C++的各种应用程序,应用程序包括建立、编辑、浏览、保存、编译、链接和调试等操作,这些操作都可以通过单击菜单选项或工具栏按钮来完成,使用方便、快捷。
3.2主要实现的功能
(1)每盘游戏都进行随机发牌。
(2)能正确得记录3个玩家的名字,并正确判断当前出牌之人。
(3)能按照跑得快的规则判断出牌,并能正常运行游戏。
(4)对有玩家离开游戏进行判断,并通知没有离开游戏的玩家。
(5)自动出牌:
有简单的AI(人工智能),玩家需要暂时离开的时候辅助出牌。
(6)记分功能:
一盘游戏结束,正确地根据输赢状况进行记分。
3.3系统功能设计图
功能设计图如图3-1,图3-2所示:
图3-1服务器功能图
图3-2客户端功能图
3.4系统流程图
3.4.1服务器端流程图
服务器端使用C++的MFC类库进行设计,主要功能是为用户进行发牌和数据的互相传递。
服务器流程图如图3-3所示:
图3-3服务器流程图
3.4.2客户端流程图
客户端使用开源的2D游戏引擎HGE(HAAF’SGAMEENGINE)设计,实现游戏界面,实现发送出牌的数据,接收他人的出牌数据,以及对出牌进行判断是否符合规则。
并且在结束本局游戏后对玩家的分数进行统计。
客户端流程图如图3-4所示:
图3-4客户端流程图
4.详细设计与实现
4.1服务器端设计
4.1.1服务器的创建
服务器端为使用C++的MFC类库进行设计的一个对话框程序。
如图4-1,图4-2所示:
图4-1创建对话框向导
(1)
图4-2创建对话框向导
(2)
4.1.2套接字及地址的初始化
创建完成以后在stdafx.h头文件中添加套接字头文件afxsock.h,且在工程初始化函数InitInstance()中初始化套接字:
if(!
AfxSocketInit())
{
AfxMessageBox("套接字初始化失败失败!
");
returnFALSE;
}
然后定义一个套接字SOCKETSoliten用于侦听,定义一个SOCKADDR_INaddr用于设定地址族,IP地址和端口号。
并且在对话框初始化函数OnInitDialog()进行初始化。
hostent*pHost;
gethostname(name,128);//获得主机名
pHost=gethostbyname(name);//获得主机结构
ipaddr=(CString)inet_ntoa(*(IN_ADDR*)pHost->h_addr_list[0]);//获得IP
SetDlgItemText(IDC_ipad,"IP地址:
"+ipaddr);//在对话框上显示IP地址
Soliten=socket(AF_INET,SOCK_STREAM,0);//创建套接字
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//接收任何消息
addr.sin_family=AF_INET;
addr.sin_port=6000;//端口6000
intrebind;
rebind=bind(Soliten,(SOCKADDR*)&addr,len);//地址绑定
if(rebind==SOCKET_ERROR)
{
MessageBox("绑定失败!
");
returnfalse;
}
listen(Soliten,20);//开始侦听
运行以后开始侦听并得到本机IP地址,如图4-3所示:
图4-3服务器界面
4.1.3多线程通信的实现
使用AfxBeginThread(&thread,LPVOID);函数创建一个新的线程[11][12],在线程中进行数据的接受和传递,避免进程的阻塞。
thread为新开辟线程的名字,UINTthread(LPVOID)定义一个新的线程,LPVOID为所需传递的数据,为LPVOID类型。
创建一个套接字组SOCKETclisocket[3];用来存放客户端连接成功后的数据:
CServDlg*dlg=(CServDlg*)AfxGetApp()->GetMainWnd();//得到窗口句柄
dlg->clisocket[dlg->count]=accept(dlg->Soliten,(SOCKADDR*)&(dlg->addr),&(dlg->len));//连接一个客户端
然后使用recv();函数和send();函数进行数据的接收和转发。
在接收数据时候使用select来判断该套接字上是否有响应。
fd_setfsRead;//定义一个select
timevaltm={0,10000};//定义反应时间
FD_ZERO(&fsRead);//清空
for(intm=0;m<3;m++)//将所有的client加入到select的检测中
{
FD_SET(dlg->clisocket[m],&fsRead);
}
select(4,&fsRead,NULL,NULL,&tm);
for(intindex=0;index<3;index++)
{
If(FD_ISSET(dlg->clisocket[index],&fsRead))//判断该套接字是否有响应
{
recv(dlg->clisocket[index],recvbuf,sizeof(recvbuf)+1,0);//接收数据
}
}
4.1.4随机发