基于C#的网络军棋设计毕业设计.docx
《基于C#的网络军棋设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于C#的网络军棋设计毕业设计.docx(99页珍藏版)》请在冰豆网上搜索。
基于C#的网络军棋设计毕业设计
基于C#的网络军棋设计毕业设计
绪论
网络棋牌游戏的现状
随着休闲网络游戏市场竞争的升级,尤其是网络棋牌游戏的巨大市场前景的吸引,许多公司都加入到棋牌游戏的竞争之列,一时之间竞争可谓惨烈。
由于全国通用的全国流行的棋牌游戏市场(斗地主、象棋、军旗、梭哈)已经基本被几个大的游戏厂商(联众、腾讯、边锋、远航、中游)所占据,加之棋牌游戏玩家忠诚度非常高的特性,继续介入这快市场已经没有任何意义。
由于中国不同的省份都有自己独特的文化特性,各个省份也都有自己区域内流行的有别其他省份的扑克或者麻将的规则,我们把这种棋牌游戏定义为地方棋牌游戏,这块市场现在正处于高速成长阶段,在全国没有特别有影响力的品牌,其中较为突出的是:
黄金岛、同城游、游戏茶苑等相对较大的占据几个省份市场的游戏厂商,以及其他一些非常小的游戏厂商,这快市场的竞争还没有到寡头竞争的阶段,也是由于地方游戏的特性决定的。
一般来讲每一个地方游戏都是独立的,每个独立的游戏所面对的目标消费者都是不同的,所以对于企业的营销推广工作要求也比较高。
目前地方棋牌游戏还没有明确成功的模式,但是有一点可肯定的,以后地方棋牌游戏市场的划分是以城市为单位的。
从市场竞争层面来看,以前那种以省份为单位的划分方法已经不能满足现在的竞争要求,不同城市的不同用户要求不能完全满足。
从宏观环境来看,中国的城市化进程的加快,也需要区域性的娱乐。
地方棋牌市场的划分主要是以城市为单位,这和中国城市化进程加快,中小城市经济发展加速是同步的,另外地方经济的发展带动地方区域性媒体以及区域性娱乐成为可能。
一、产品对地方棋牌游戏的影响:
产品是营销活动中最重要的组成部分,在确定营销战略之后,如何根据目标消费者的需求开发有竞争力的产品就是重中之重。
对于地方棋牌游戏而言,产品主要分为两个组成部分,其一就是游戏平台,其二就是与游戏平台对应的游戏网站。
关于游戏网站的设计,分以下几个步骤。
第一:
前期信息收集,在对目标消费者的调研以及行业特点分析明确建站目的和网站定位以后,开始收集相关的意见,跟公司其他部门结合,跟公司的实际情况结合,这样可以发挥网站的最大作用。
第二:
具体分栏目策划,分栏一般包括:
银行、客户服务、冲值、社团、游戏帮助。
整个游戏网站设计的过程中要注意以下几点:
1、整个网站要符合休闲游戏的特性,风格简洁时尚,操作性强。
2、可以借鉴web2.0的特点,设立各种排行榜,最大提高用户粘度[1]。
关于游戏平台的设立,一般游戏平台的功能都是固定的,在项目之初就完成。
所以这里简要说下关于地方棋牌游戏的开发。
因为是地方棋牌游戏,所以就要满足这个区域市场的市场需求,比如:
严格遵循地方棋牌游戏的主流规则、地方方言配音、游戏界面的亲和力以及游戏操作的人性化。
一般产品完成之后要经过项目组的审查,一致通过后投放市场,保证产品的质量。
游戏产业某种意义来讲也是属于服务业,如何打造人性化的产品,不断追求细节的完美,才能在激烈的时常中利于不败之地[2]。
二、地方棋牌游戏的宣传与推广:
在竞争激烈的网络游戏市场,信息有效的传达和宣传显的尤为重要,和传统的MMORPG游戏相比,棋牌游戏规则简单、操作容易、游戏时间短。
就算游戏新手,可以很快短时间内掌握游戏规则,感受游戏的魅力和乐趣,此种游戏既不耽误时间又能轻松娱乐,非常符合现代人的生活方式。
地方棋牌游戏目标消费者以18至40岁网民为主,游戏场所一般位于家庭、网吧以及办公场所。
根据棋牌游戏的特点决定,休闲游戏并不像大型网游那样对网吧渠道过于依赖,一般来说对于休闲网游比较有效的宣传方式有以下几钟:
第一种主要的方式:
为网络广告。
由于地方棋牌游戏主要以某个城市为单位,所以这个城市的门户网站是非常好的选择,一般二三级城市的门户网站就是电信运营商的信息港,可以和运营商合作,有效进行推广。
第二种主要方式为短信群发,棋牌游戏一般都是和运营商进行合作,可以运用运营商的资源,短信群发就是这种形式。
第三种重要的方式为:
联合有关的媒体关系资源,利用平面媒体进行软文炒作。
软文的威力是毋庸置疑的,从保健品的炒作中可见一斑。
只是我们要找对炒作的方式,从目标受众的深层心理需求出发,写其所想、所需,引导消费。
但是这点对于企业的要求比较高,需要企业有一定的媒体资源[3]。
网络棋牌游戏的未来发展
经过5年来的发展,中国的在线棋牌游戏早已摆脱掉了初期单一乏味的雏形,现在的棋牌娱乐平台制作精美,系统功能完善、游戏精彩鲜活。
这些都预示着这种为社会大众广为接受的娱乐方式,必然将在今后的在线娱乐市场里经久不衰,并继续保持其旺盛的生命力和平稳的发展势头。
如何在未来开拓出更多精彩的产品项目,为用户提供更为优质的服务,并结合自身的实际情况制定出最为合理的收费模式,便成了各厂商要想得到长足的发展,就必须先解决的一览子问题。
在线棋牌游戏有着深厚的文化底蕴、坚实大众基础和广阔的发展空间,对于其前景应该是没有任何值得争议的[4]!
军棋游戏功能分析
军棋,又称陆战棋。
估计华人没有不知道什么叫做军旗的,军棋是一种家喻户晓的棋类游戏,它的多变吸引了无数玩家。
军旗的子数:
军棋每方共有25个子,司令、军长、军旗各一;师长、旅长、团长、营长、炸弹各二;连长、排长、工兵、地雷各三。
军旗的子力:
司令>军长>师长>旅长>团长>营长>连长>排长>工兵,大子遇小子,小子拿掉,大子放在原位,炸弹碰到任何子力同时拿下,这是任何规则都遵循的。
军旗的摆法:
原则上25个棋子可以摆放在棋盘除行营外的任何位置,但是对于一些特殊子力还有特别的限制。
例如,军旗只能摆在两个大本营其中的一个;地雷只能摆在后两排除军旗占据的一个大本营外的任何9个位置;炸弹不能摆在第一排的5个位置。
军旗和地雷位置一旦固定,出征后就不能够再移动[5]。
军旗规则:
针对大本营,能进不能出的;
针对地雷,工兵飞雷雷下,工兵在;炸弹遇雷同时拿下;其他子力遇到地雷自动碰死拿下,地雷不动。
针对炸弹,有炸弹等同与其他子力按规矩行动的,也有炸弹满天飞(行子方式如同工兵)。
针对行棋方式:
铁路线上棋子只可直行,工兵可以飞行。
军棋的胜负判定:
夺取敌方的军旗,一般夺旗就算胜。
本网络军棋游戏如图2.1所示。
图2.1网络军棋游戏界面
开发环境及关键技术
3.1Visualstudio2010开发平台
VisualStudio是微软公司推出的开发环境。
是目前最流行的Windows平台应用程序开发环境。
VisualStudio2010版本于2010年4月12日上市,其集成开发环境(IDE)的界面被重新设计和组织,变得更加简单明了。
VisualStudio2010同时带来了NETFramework4.0、MicrosoftVisualStudio2010CTP(CommunityTechnologyPreview--CTP),并且支持开发面向Windows7的应用程序。
除了MicrosoftSQLServer,它还支持IBMDB2和Oracle数据库[6]。
VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件。
9个新功能
它将是经典的一个版本,相当于当年的6.0版。
而且它可以自定义开始页;新功能还包括:
(1)C#4.0中的动态类型和动态编程;
(2)多显示器支持;
(3)使用VisualStudio2010的特性支持TDD;
(4)支持Office;
(5)QuickSearch特性;
(6)C++0x新特性;
(7)IDE增强;
(8)使用VisualC++2010创建Ribbon界面;
(9)新增基于.NET平台的语言F#;
6大创新
根据微软发布的一份官方文档宣称,VisualStudio2010和.NETFramework4.0将在下面六个方面有所创新:
(1)民主化的应用程序生命周期管理
在一个组织中,应用程序生命周期管理(ALM)将牵涉到多个角色。
但是在传统意义上,这一过程中的每个角色并不是完全平等的。
VisualStudioTeamSystem2010将坚持打造一个功能平等、共同分担的平台以用于组织内的应用程序生命周期管理过程。
(2)顺应新的技术潮流
每年,业界内的新技术和新趋势层出不穷。
通过VisualStudio2010,微软将为开发者提供合适的工具和框架,以支持软件开发中最新的架构,开发和部署。
(3)让开发商惊喜
从VisualStudio的第一个版本开始,微软就将提高开发人员的工作效率和灵活性作为自己的目标。
VisualStudio2010将继续关注并且显著地改进开发者最核心的开发体验。
(4)下一代平台浪潮的弄潮儿
微软将继续投资于市场领先的操作系统,工具软件和服务器平台,为客户创造更高的价值。
使用VisualStudio2010,将可以在新一代的应用平台上,为你的客户创造令人惊奇的解决方案。
(5)跨部门的应用
客户将在不同规模的组织内创建应用,跨度从单个部门到整个企业。
VisualStudio2010将确保在这么宽泛的范围内的应用开发都得到支持。
(6)高效的开发环境
MicrosoftVisualStudio2010采用拖曳式便能完成软件的开发。
简简单单的操作便可以实现一个界面的生成。
但拖曳的界面,也应当有相应的代码来实现功能。
MicrosoftVisualStudio2010支持C#、C++、VB。
可以快速实现相应的功能[7]。
3.2C#编程技术
C#读作CSharp。
最初它有个更酷的名字,叫做COOL。
微软从1998年12月开始了COOL项目,直到2000年2月,COOL被正式更名为C#。
在1998年,Delphi语言的设计者Hejlsberg带领着Microsoft公司的开发团队,开始了第一个版本C#语言的设计。
在2000年9月,国际信息和通信系统标准化组织为C#语言定义了一个Microsoft公司建议的标准。
最终C#语言在2001年得以正式发布。
C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。
它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。
C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言[8]。
C#是面向对象的编程语言。
它使得程序员可以快速地编写各种基于MICROSOFT.NET平台的应用程序,MICROSOFT.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选——无论是高级的商业对象还是系统级的应用程序。
使用简单的C#语言结构,这些组件可以方便的转化为XML网络服务,从而使它们可以由任何语言在任何操作系统上通过INTERNET进行调用。
C#使得C++程序员可以高效的开发程序,且因可调用由C/C++编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。
因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#[9]。
C#1.0-纯粹的面向对象
在2003年5月,微软推出了VisualStudio.NET2003,同时也发布了C#的改进版本——C#1.1。
这一时期的C#(以下称为C#1.x)提出了纯粹的面向对象概念。
C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。
C#还通过类类型、值类型和接口类型的概念形成了统一的类型系统。
尽管C#1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。
因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。
需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承System.MulticastDelegate类型定义[10]。
C#2.0-泛型编程新概念
微软在2004年的6月份发布了VisualStudio2005的第一个Beta版,同时向开发者展示了C#语言的2.0版本。
2005年4月,微软发布了VisualStudio2005Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQLServer2005、TeamFoundationServer和TeamSuite。
这时的C#编译器已经能够处理C#2.0中所有的新特性。
C#2.0为开发者带来的最主要的特性就是泛型编程能力。
和面向对象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。
这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。
C#2.0别出心裁,对泛型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。
有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。
C#2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。
匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构——Lambda表达式。
尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了[11]。
C#3.0-(研发代号“Orcas”)
2005年9月份的PDC大会——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。
说到C#3.0,就不得不提一下微软的LINQ项目,LINQ(语言集成查询,LanguageIntegrat
edQuery)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。
而C#3.0则是率先实现了LINQ的语言。
在C#3.0中,可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。
例如要查找一个字符串数组names中所有长度大于5的字符串,就可以写:
varlongname=fromninnameswheren.Length>5selectn;
这样就得到一个新的字符数组longname,其中包含了所需要的结果。
这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。
初次看到这样一个语句,可能会有很大疑问:
这还是C#语言吗?
这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。
然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用。
C#4.0动态编程
C#4.0新增dynamic关键字,提供动态编程(dynamicprogramming),把既有的静态物件标记为动态物件,类似javascript,Python或Ruby[12]。
3.3UDPClient协议
在System.Net.Sockets命名空间下,有专门UDP编程的UdpClient类。
这个类提供更直观的易于使用的属性和方法,从而降低UDP编程的难度。
UdpClient类的构造函数有以下几种格式:
UdpClient()
UdpClient(intport)
UdpClient(IPEndPointiep)
UdpClient(stringremoteHost,intport)
UdpClient的常用方法如下。
1.Send()方法
调用Send()方法来实现发送数据,但是在将数据发送到远程主机后,不接受任何形式的确认。
该方法返回数据的长度,可用于检查数据是否已被正确发送。
常用格式:
[格式1]:
Send(byte[]data,intlength,IPEndPointiep)
参数:
data为发送的数据(以字节数组表示),length为发送的数据长度,iep是一个IPEndPoint对象,它表示要将数据发送到的主机和端口。
返回值是已发送的字节数。
知道远程计算机IP地址使用此格式。
下面是用UdpClient发送UDP数据包的具体调用例子:
IPAddressHostIP=newIPAddress.Parse(“远程计算机IP地址”);
IPEndPointhost=newIPEndPoint(HostIP,8080);
UDPClient.Send(“发送的字节”,“发送的字节长度”,host);
[格式2]:
Send(byte[]data,intlength,stringHostName,intport)
参数:
data为发送的数据(以字节数组表示),length为发送的数据长度,hostname为要连接到的远程主机的名称,port为要与其通信的远程端口号,返回值是已发送的字节数。
2.Receive()
Publicbyte[]Receive(refIPEndPointremoteEP);
参数remoteEP是一个IPEndPoint类的实例,它表示网络中发送此数据包的节点。
如果指定了远程计算机要发送到本地机的端口号,也可以通过侦听本地端口号来实现对数据的获取,下面就是通过侦听本地端口号“8080”来获取信息代码:
Server=newUdpClient();
receivePoint=newIPEndPoint(newIPAddress(“127.0.0.1”),8080);
Byte[]recData=server.Receive(refreceivePoint);
用于在指定的本机端口上接收数据,并将接收到的数据作为byte数组返回。
3.JoinMulticastGroup()方法
添加对地址发送,用于连接一个多播组。
4.Close()方法
关闭连接。
UDP是无连接协议,客户端只需要将服务器的地址以及端口填写正确,对方一定收得到。
就像你到邮局去寄信,你只要把收信人的地址写正确,不管写不写你的地址,别人一定都收得到[13]。
3.4C#的UdpClient类
UdpClient类开发UDP程序要实现接收数据和发送数据。
具体过程如下。
(1)在发送方,调用Send方法
UdpClientpublisher=newUdpClient(“230.0.0.1”,8899);
Byte[]buffer=null;
Encodingenc=Encoding.Unicode;
Stringstr=info;//info为要传送的字符串信息
Buffer=enc.GetBytes(str.ToCharArray());
publisher.Send(sddata,sddata.Length);//传送信息到指定的计算机
或者
UdpClientSendUp=newUdpClient();
remoteIP=IPAddress.parse(“230.0.0.1”);
IPEndPointremoteep=newIPEndPoint(remoteIP,8899);
Byte[]buffer=null;
Encodingenc=Encoding.Unicode;
Stringstr=info;
Buffer=enc.GetBytes(str.ToCharArray());
SendUdp.Send(buffer,buffer.Length,remoteep);//传送信息
(2)在接收方,调用Receive方法来接收数据;
Udpclient=newUdpClient(8899);//侦听本地的端口号8899
Remote=null;
Encodingenc=Encoding.Unicode;//设定编码类型
Byte[]data=udpclient.Receive(refremote);//得到对方发送来的信息
StringstrData=enc.GetString(data);//字节数据变换为字符串strData
3.5P2P技术
Peer-To-Peer即点对点,通常简写为P2P。
所谓网络中的点对点,其实可以看成是一种对等的网络模型。
P2P其实是实现网络上不同计算机之间,不经过中继设备直接交换数据或服务的一种技术。
P2P由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间环节,也使得网络上的沟通变得更容易、更直接。
P2P作为一种网络的模型,它有别于传统的客户/服务器模型。
客户/服务器一般都有预定义的客户机和服务器。
而在P2P模型中并没有明确的客户端和服务器,但其实在P2P模型中,每一台计算机即可以看成是服务器,也可以看成是客户机。
在网络中,传统上的客户/服务器模型中,发送服务请求或者发送数据的计算机,一般称为客户机;而接受、处理服务或接收数据的计算机称为服务器。
而在P2P网络模型中,计算机不仅接收数据,而且发送数据,不仅提出服务请求,还接受对方的服务请求。
P2P是一种用于不同PC用户之间,不经过中继设备直接交换数据或服务的技术,它允许Internet用户直接使用对方的文件。
每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。
因为消除了中间环节,P2P技术使得网络上的沟通变得更容易、更直接。
P2P改变了Internet现在的以大网站为中心的状态,重返“非中心化”,并把权限交还给用户[14]。
软件整体设计
4.1界面设计
下棋需要有棋盘,程序中通过在窗体激活时在图片框控件qi_pan上显示军棋棋盘图片文件。
有了盘还需要棋子,这里使用图3.1中的图片表示棋子。
另外还有R.bmp和G.bmp两个图片表示红方和绿方暗子。
使用控件数组Qizi_Pic[]的Add方法加载了我们所需要的棋子图片控件并使用相应图片。
Qizi_Pic[]中下标i的含义是:
如果i小于24,那么说明它属于红方的棋子,否则是绿方的棋子。
同时Qizi_Pic[i]的tag属性保存了棋子在控件数组的索引号。
在界面中要求用户输入对方IP、端口(本地及对方远端),同时按图3.2添加“联机”、“重新开始”、“退出”、“保存布阵”、“读取布阵”、“开始对战”6个按钮以及一些提示用的标签。
(a)红方军棋棋子图片
(b)绿方军棋棋子图片
图4.1
图4.2网络两人对战军棋设计界面
4.2棋盘数据结构
棋盘的数据结构采用17×17二维数组Map存储。
X,Y坐标原点是棋盘左上角。
虽然使用四人玩的棋盘,本游戏主要是上下两个区域,其他区域可以走棋。
例如,上方玩家棋子布阵所在区域是(7,1)到(11,6)范围,下方玩家棋子布阵所在区域是(7,12)到(11,17)范围[15]。
4.3通信协议设计
网络程序设计的难点在于与对方需要通信,这里使用了UDP(UserDataProtocol)。
UDP是用户数据文报协议的简称,两台计算机之间的传输类似于传递邮件;两台之间没有明确的连接,使用UDP协议建立对等通信。
这里虽然两台计算机不分主次,但我们设计时假设一台做主机(红方),等待其他人加入。
其他人想加入的时候输入主机的IP。
为了区分通信中传送的是“输赢信息”、“下的棋子位置信息”、“重新开始”等,在发送信息的首部加上代号。
定义了如下协议:
命