毕业设计论文()

毕业设计论文()
毕业设计论文()

摘要

网络棋牌游戏,作为一个新生事物,从诞生到现在不过几年时间。随着互联网在我国的飞速发展,网络棋牌以其足不出户便能决胜于千里之外的独有魅力,早已将那些以往只能面对面博弈的棋友们,从棋桌上拉到了电脑屏幕前。这是世界棋牌运动的未来发展趋势[1]。

棋牌类游戏是网络游戏中非常流行的游戏种类,它简单易学、趣味性强,与其它大型网游相比,游戏设计和实现的难度相对较低[2]。本文首先将阐述网络棋牌游戏的背景和研究的意义,接着简单介绍基于VC++和开源的2D游戏引擎HGE设计的局域网对战“跑得快”游戏的一种实现方法。并介绍了套接字(SOCKET)的使用,多线程通信的实现,HGE引擎的简单使用以及HGE引擎中GUI(图形用户界面)的简单应用。该系统界面友好,功能实现起来容易,对编写棋牌游戏的入门有着很好的帮助。

关键词:套接字;VC++;HGE;多线程

Abstract

Network card games, as a new thing, from the birth of a few years now, however. With the rapid Internet development in China, the network will be able to run-off Card in their homes thousands of miles away on the unique charm of the past, only those who already face-to-face friends chess game, chess table, pulled from a computer screen. This Card is one of the world development trend of the future of that movement.

Card games are very popular online game types of games, it easy to learn, fun, and compared with other large-scale online games, game design and realization of a relatively low degree of difficulty. This article will first set out the background of the network board games and study the meaning, and then a brief introduction based on VC + + and open source 2D game engine design HGE LAN against "run fast," Method for the game. And introduced the Socket (SOCKET) the use of the realization of multi-threaded communication, HGE engine and simple to use HGE engine GUI (graphical user interface) a simple application. The system is user-friendly, functional easy to achieve, to the preparation of board games have a very good entry help.

Keywords: Socket; VC++; HGE; multi-threaded

目录

摘要 ------------------------------------------------------------------------------------------------------- I Abstract---------------------------------------------------------------------------------------------------- II

1.绪论----------------------------------------------------------------------------------------------------- 1

1.1 引言--------------------------------------------------------------------------------------------- 1

1.2 网络棋牌游戏研究的发展及研究现状 -------------------------------------------------- 1

1.3 研究的背景------------------------------------------------------------------------------------ 2

1.4 研究的意义------------------------------------------------------------------------------------ 2

1.5 研究内容和拟解决的关键问题 ----------------------------------------------------------- 3

1.6 需求分析--------------------------------------------------------------------------------------- 3

2.开发工具----------------------------------------------------------------------------------------------- 5

2.1 Visual C++集成开发环境------------------------------------------------------------------- 5

2.1.1正文窗口 ---------------------------------------------------------------------------------- 5

2.1.2 Workspace 窗口-------------------------------------------------------------------------- 5

2.2 Haaf's Game Engine引擎 ------------------------------------------------------------------- 6

2.2.1 HGE引擎在vc++6.0上的使用------------------------------------------------------- 6

2.2.2 HGE引擎的初始化 --------------------------------------------------------------------- 8

3.总体设计--------------------------------------------------------------------------------------------- 10

3.1 系统概述------------------------------------------------------------------------------------- 10

3.2 主要实现的功能---------------------------------------------------------------------------- 10

3.3 系统功能设计图---------------------------------------------------------------------------- 10

3.4 系统流程图---------------------------------------------------------------------------------- 11

3.4.1 服务器端流程图----------------------------------------------------------------------- 11

3.4.2 客户端流程图-------------------------------------------------------------------------- 12

4.详细设计与实现------------------------------------------------------------------------------------ 13

4.1 服务器端设计------------------------------------------------------------------------------- 13

4.1.1 服务器的创建-------------------------------------------------------------------------- 13

4.1.2套接字及地址的初始化 -------------------------------------------------------------- 14

4.1.3 多线程通信的实现-------------------------------------------------------------------- 15

4.1.4 随机发牌的设计和实现-------------------------------------------------------------- 16

4.1.5 16张牌排序的实现-------------------------------------------------------------------- 17

4.1.6 初始数据的发送----------------------------------------------------------------------- 17

4.2客户端的设计------------------------------------------------------------------------------- 18

4.2.1 准备-------------------------------------------------------------------------------------- 18

4.2.2 GUI类的设计 -------------------------------------------------------------------------- 19

4.2.3 登陆界面设计-------------------------------------------------------------------------- 19

4.2.4 连接服务器和数据接收-------------------------------------------------------------- 21

4.2.4 发牌数据的解读和牌的实现 ------------------------------------------------------- 23

4.2.5 选牌的实现----------------------------------------------------------------------------- 25

4.2.6 出牌规则设计-------------------------------------------------------------------------- 26

4.2.7 电脑AI的设计 ------------------------------------------------------------------------ 31

4.3系统测试------------------------------------------------------------------------------------- 35 结论 -------------------------------------------------------------------------------------------------------- 36 致谢 -------------------------------------------------------------------------------------------------------- 37 参考文献 -------------------------------------------------------------------------------------------------- 38 附录 -------------------------------------------------------------------------------------------------------- 39

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.1Visual C++集成开发环境

Visual C++开发环境是一个基于Windows操作系统的可视化、面向对象的集成开发环境(Integrated Development Environment, IDE)。在该环境下用户可以开发有关C和C++的各种应用程序,应用程序包括建立、编辑、浏览、保存、编译、链接和调试等操作,这些操作都可以通过单击菜单选项或工具栏按钮来完成,使用方便、快捷。它提供了项目区(Workspace )、应用程序向导(AppWizard)、类操作向导(Class Wizard)和Wizard Bar等实用编程工具。

2.1.1正文窗口

正文窗口一般在开发平台的右上部分。程序文件、资源文件、文档文件以及帮助信息等,都可以通过主窗口显示出来。用户可以同时打开多个正文窗口,对每个窗口都可以进行一般Windows窗口的操作,并且可以通过Window菜单中选定特定的窗口或者用鼠标来激活自己想要切换的窗口。

2.1.2 Workspace 窗口

Workspace窗口一般在集成开发环境的左侧。打开一个工程后,该窗口的下端会出现3个标签,它们是:Class View(类视图),Resource View(资源视图), File View(文件视图)。单击某个图标标签会出现相应的页面。如图2-1所示。

图2-1 Workspace 窗口

2.2Haaf's Game Engine引擎

HGE-Haaf's Game Engine[8]:是一套十分易用的硬件加速2D游戏引擎。它基于DX8,运行于各种Win32平台,同时支持VC,BC,MinGW多种编译环境。它使用“The zlib/libpng license”协议发布,可以自由地使用在包括商业性质的项目上。具有1.专为2D游戏项目提供2. 接口简单且易于扩展3. 完善的文档4. 使用自由等特性。

2.2.1 HGE引擎在vc++6.0上的使用

(1)设置头文件和lib库的路径

打开对话框选项卡Tools->Options->Directories,添加HGE引擎“include”文件夹路径,并把它移动至顶端。如图2-2所示。

图2-2 添加“include”文件夹

在同一个对话框选项卡中,在“Show directories for”中选择“Library files” the 添加HGE引擎"lib\vc"文件夹路径,并把它移动至顶端。如图2-3所示

图2-3 添加lib文件夹

(2)游戏引擎的创建

打开vc++6.0,创建一个Win32 Application程序,如图2-4所示。

图2-4 创建Win32 Application程序

然后选择An empty project。如图2-5所示。

图2-5 创建向导

(3)添加lib库到工程

打开对话框选项卡Project->Settings...->Link 然后添加hge.lib和hgehelp.lib 到Object/library modules 中。如图2-6所示

图2-6 添加lib链接

2.2.2 HGE引擎的初始化[9]

#include "hge.h"//包含hge头文件

HGE *hge=0;//创建一个指向hge类的指针。

bool RenderFunc()//绘制函数,程序开始后HGE将不停调用它

{

return false;//总返回false

}

bool FrameFunc()//逻辑函数,程序开始后HGE将不停调用它,一些逻辑判断或者处理可以写在这里。

{

return false;// 程序正常时总是返回false,返回true将从System_Start往下执行}

int WINAPI WinMain(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's Game Engine:是一套十分易用的硬件加速2D游戏引擎。它基于DX8,运行于各种Win32平台,同时支持VC,BC,MinGW多种编译环境。它使用“The zlib/libpng license”协议发布。具有1.专为2D游戏项目提供2. 接口简单且易于扩展3. 完善的文档4. 使用自由等特性。

Visual C++开发环境是一个基于Windows操作系统的可视化、面向对象的集成开发环境(Integrated Development Environment,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’S GAME ENGINE)设计,实现游戏界面,实现发送出牌的数据,接收他人的出牌数据,以及对出牌进行判断是否符合规则。并且在结束本局游戏后对玩家的分数进行统计。客户端流程图如图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("套接字初始化失败失败!");

return FALSE;

}

然后定义一个套接字SOCKET Soliten用于侦听,定义一个SOCKADDR_IN addr 用于设定地址族,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

int rebind;

rebind=bind(Soliten,(SOCKADDR*)&addr,len); //地址绑定

if (rebind==SOCKET_ERROR)

{

MessageBox("绑定失败!");

return false;

}

listen(Soliten,20);//开始侦听

运行以后开始侦听并得到本机IP地址,如图4-3所示:

图4-3 服务器界面

4.1.3 多线程通信的实现

使用AfxBeginThread(&thread,LPVOID);函数创建一个新的线程[11][12],在线程中进行数据的接受和传递,避免进程的阻塞。thread为新开辟线程的名字,UINT thread(LPVOID)定义一个新的线程,LPVOID为所需传递的数据,为LPVOID类型。

创建一个套接字组SOCKET clisocket[3];用来存放客户端连接成功后的数据:

CServDlg *dlg=(CServDlg*)AfxGetApp()->GetMainWnd();//得到窗口句柄

dlg->clisocket[dlg->count]=accept(dlg->Soliten,(SOCKADDR*)&(dlg->addr),&(dlg->l en));//连接一个客户端

然后使用recv();函数和send();函数进行数据的接收和转发。在接收数据时候使用select来判断该套接字上是否有响应。

fd_set fsRead; //定义一个select

timeval tm = { 0, 10000 }; //定义反应时间

FD_ZERO( &fsRead ); //清空

for(int m=0;m<3;m++) //将所有的client加入到select的检测中

{

FD_SET( dlg->clisocket[m], &fsRead );

}

select(4, &fsRead, NULL, NULL, &tm );

for(int index=0;index<3;index++)

{

If(FD_ISSET(dlg->clisocket[index], &fsRead))//判断该套接字是否有响应

{

recv(dlg->clisocket[index], recvbuf, sizeof(recvbuf)+1, 0);//接收数据

}

}

4.1.4 随机发牌的设计和实现

设计思路:以一个3位整数代表一张牌百位1,2,3,4,代表牌的4种花色,十位和个位0—13代表牌的面,如103(方片K),104(方片Q),105(方片J)等等。并且以一个二维数组card[4][13]来记录是否已经发出这张牌,如果已经发出则让对应的数字为1,如发出牌103(方片K)则记录card[1][3]=1,并且使用srand((unsigned)time(NULL))和rand()函数进行随机数取值,用rand()%4+1取得百位,rand()%13取得十位和个位。然后100*(rand()%4+1)+ rand()%13就可以取得一个符合我们要求的3位整数了,结合二维数组card[][],就可以实现随机的不重复发牌了。关键代码如下:

for(hua=0;hua<4;hua++)//二维数组清零

{

for(dian=0;dian<13;dian++)

{

dlg->card[hua][dian]=0;

}

}

int pai[16]; //数组记录16张牌

while(k!=16) //判断是否有16张牌

{

type=rand()%4; //百位

cou=rand()%13; //十位和个位

if(dlg->card[type][cou]==0) //判断该牌是否没有被占用

{

dlg->card[type][cou]=1; //记录该牌被占用

senddata=(type+1)*100+cou; //取得3位整数

//牌不能为红2(100),花2(200),方2(300),方1(301)

if(senddata!=100 && senddata!=200 && senddata!=300 && senddata!=301)

{

pai[k]=senddata;//储存该牌

k++;

}

}

}

相关主题
相关文档
最新文档