跨平台网络游戏的设计与实现

上传人:xins****2008 文档编号:115274959 上传时间:2022-07-01 格式:DOC 页数:23 大小:1.09MB
收藏 版权申诉 举报 下载
跨平台网络游戏的设计与实现_第1页
第1页 / 共23页
跨平台网络游戏的设计与实现_第2页
第2页 / 共23页
跨平台网络游戏的设计与实现_第3页
第3页 / 共23页
资源描述:

《跨平台网络游戏的设计与实现》由会员分享,可在线阅读,更多相关《跨平台网络游戏的设计与实现(23页珍藏版)》请在装配图网上搜索。

1、安徽工业大学软 件 开 发 技 术 报 告课题名称跨平台网络游戏的设计与实现学 院专业班级组 长成 员指导老师摘 要在Linux环境下以Linux网络编程技术,采用C+语言与系统的Socket开发出游戏服务器,以SQLite数据库引擎建立游戏数据库。在linux环境下以Qt架构开发出游戏客户端,以QML描述性语言与JavaScript语言写出动态绚丽的游戏界面,以C+语言写客户端的后台与逻辑。最后游戏客户端成功部署到Android环境,Windows环境与Linux环境。并且通过服务器实现了多机互联。关键词: Linux套接字(Socket) 跨平台 SQLite数据库 C+, QML,Jav

2、aScript, C/S架构 目录1绪 论11.1 概述11.2.1 Linux简介11.2.2 QT简介11.2.3 SQLite数据库简介11.2.4 QML语言简介12可行性研究22.1 技术可行性22.2 经济可行性22.3 操作可行性22.4 结论23系统需求分析33.1 用户需求分析33.1.1 用户需求33.1.2 系统功能需求33.1.3 系统性能需求34系统设计44.1 系统逻辑结构设计44.2 功能模块图及分模块功能描述44.2.1 系统的功能模块图44.2.2 系统功能模块简介45系统实施55.1 服务器的开发55.2 客户端的开发85.2.1 前台界面的开发(部分代码)

3、85.2.2 界面后台的开发(部分代码)125.4 系统测试135.4.1 软件测试的对象135.4.2 软件测试的结果136系统说明146.1 开发环境146.2 系统安装与配置14总 结15参考文献16附录17软件运行截图:17安卓环境下:17Linux环境下:18Windows环境下:181绪 论1.1 概述现阶段网络游戏非常风靡,但是跨平台的网络游戏是非常少的,本项目就是做一个跨平台的网络小游戏。在Linux环境下以Linux网络编程技术,采用C+语言发出游戏服务器,以SQLite数据库引擎建立游戏数据库。采用Select方法实现服务器可以同时服务多个客户请求。在linux环境下以Qt

4、架构开发出游戏客户端,以QML描述性语言与JavaScript语言写游戏界面,以C+语言写客户端的后台与逻辑。最后游戏客户端成功部署到Android环境,Windows环境,与Linux环境。并且通过服务器实现了多机互联。1.2 开发环境与工具介绍 1.2.1 Linux简介Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 Linux桌面 10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统。1.2.2 QT简介 Qt开发环境:跨平台C+图

5、形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc)以及一些宏,易于扩展,允许组件编程。全面支持iOS、Android、WP。1.2.3 SQLite数据库简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合。1.2.4 QML语言简介 QML是一种描述性的脚本语言,文件格式以.qml

6、结尾。语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制。我个人认为它结合了QtDesigner UI和QtScript的优点。QtScript可以和Qt原生代码进行交互,但是有一个缺点,如果要在脚本中创建一个继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript中进行访问。而QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C+代码进行方便的交互,使用起来非常方便。192可行性研究2.1 技术可行性由于Linux本身就比较适合作为服务器的运行环境,在加上本身就有系统Socket,因此

7、用Linux系统开发和用作服务器的运行环再合适不过。Qt是一个跨平台的框架,采用C+语言。框架本身有自身的Socket类。又有自己的QML语言作为JavaScript语言的补充。因此用Qt的QML语言与JavaScript语言结合写出流畅的界面,再以C+语言开发后台再合适不过。又因为框架是跨平台的,因此比较容易实现编译适用于不同操作系统的游戏客户端。 2.2 经济可行性由于Qt的本身跨平台性,可以实现一套源码在不同平台编译不同版本,对于开发夸平台的网络游戏非常经济。2.3 操作可行性 Qt框架实现客户端跨平台开发与部署。客户端通过套接字与服务器建立连接,客户端发送请求,服务器在数据库调用数据发

8、送给客户端,实现了网络连接。2.4 结论基于Linux系统,使用系统套接字开发与运行服务器。采用Qt框架开发客户端,比较容易实现夸平台部署。因此以这种方法开发出夸平台网络游戏在经济上、技术上、操作上都是可行的。 3系统需求分析3.1 用户需求分析3.1.1 用户需求 随着社会的发展,人们追求娱乐的方式多样化,网络游戏已经成为日常生活中重要的娱乐方式之一。但是现阶段多种网络游戏都不能实现跨平台,仅仅适用于单一的平台,这大大降低了用户的可选择性。3.1.2 系统功能需求需要的是夸平台的网络小游戏,能实现多机互联,而又不局限于单一的平台。特别是流量紧缺的用户,想在PC电脑上体验移动设备上的游戏应用。

9、3.1.3 系统性能需求用户需求的游戏是,运行流畅,界面绚丽,在各个平台上都能体验,机器资源消耗较为少,不需要耗费太多流量的小游戏。4系统设计4.1 系统逻辑结构设计 客户端:UML语言和JavaScript语言写界面,C+开发后台,游戏通过后台调用方法发送服务器请求。服务器发送的数据通过后台接收、处理。最后传送至游戏前台界面与玩家互动。服务器:接收客户端发送的请求,然后去本地数据库查找数据,得到返回的数据发送至客户端。4.2 功能模块图及分模块功能描述4.2.1 系统的功能模块图客户端服务器查找插入删除玩家游戏界面队列等候 服务器操作处理数据库TCP/IP 协议游戏后台 接收发送处理请求 (

10、附图)4.2.2 系统功能模块简介玩家游戏界面:负责向用户展示游戏效果,与用户交互,游戏后台进行数据传送游戏后台:负责与游戏界面进行交互,与服务器连接,处理与服务器交互的数据服务器接收处理模块:接收处理玩家的连接请求,发送并接收与玩家的交互数据服务器操作处理模块:与数据库进行交互,查找,插入,删除数据等。数据库模块:保存玩家信息,与服务器进行数据交互5系统实施5.1 服务器的开发 5.1.1 套接字模块的建立与连接(部分代码)/为服务器创建并且命名一个套接字: server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin

11、_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(9666); server_len = sizeof(server_address); bind(server_sockfd , (struct sockaddr*)&server_address, server_len); /创建一个链接队列,初始化readfds以处理来自server_sockf的输入; listen(server_sockfd , 5); FD_ZERO(&readfd

12、s);FD_SET(server_sockfd , &readfds);while(1) int fd; int nread; testfds = readfds; printf(服务器正在等待!n); result = select(FD_SETSIZE , &testfds , (fd_set *)0, (fd_set *)0, (struct timeval *) 0 ); if(result1) perror(server5); exit(1); /一旦得知有活动发生,可以用 FD_ISSET来依次检查每个描述符,以发现活动发生在哪个描述符上面 for(fd = 0; fdFD_SET

13、SIZE; fd+) /如果活动发生在套接字server_sockfd上面,一定是一个新的请求,就把相关的client_sockfd /添加到描述符集合中 if(FD_ISSET(fd , &testfds ) if(fd= server_sockfd ) client_len = sizeof(client_address); client_sockfd = accept( server_sockfd , (struct sockaddr *)&client_address ,&client_len);/为客户生成一个专属的套接字 FD_SET(client_sockfd , &readfd

14、s );/添加新的描述符read(client_sockfd , &messagesinggleclient_sockfd.client_name, sizeof(struct message);/写入名字else ioctl(fd , FIONREAD , &nread); if(nread =0) close(fd); /关闭套接字 FD_CLR(fd , &readfds);/删除 CLients_fdfd =-1; /删除之后那个位置为-1 printf(移除玩家文件描述符 %dn,fd); num-; else /创建服务 5.1.2 数据库模块的建立与连接(部分代码) /数据库建立

15、,和表的建立 QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase:addDatabase(QSQLITE); db.setDatabaseName(game1.db); if (!db.open() qDebug()open database failed -db.lastError().text()/n; return -1; QSqlQuery query; bool ok = query.exec(CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY A

16、UTOINCREMENT, name VARCHAR(20) NOT NULL, score INTEGER NULL); if (ok) printf(创建数据库表成功ceate table partition successn); else printf(创建数据库表失败ceate table partition failedn); /插入数据库代码,插入名字和分数的初始数值 QString ss; ss=messagesinggleclient_sockfd.client_name; ss.replace(QString(n), QString(); Update_name=ss; Up

17、date_name=Update_name.replace(QString(&), QString(); Update_name=Update_name.replace(QString(), QString();5.1.3 处理数据模块(部分代码)memset(messagesinggle,0,sizeof(struct message)*100);read(fd , &messagesingglefd.getmesbuffer, sizeof(struct message);printf(服务于玩家文件描述符 %d n, fd);printf(get from client %sn,mess

18、agesingglefd.getmesbuffer);/得到字符串形式用户分数 QString is_score_or_name =messagesingglefd.getmesbuffer; QString is_name =messagesingglefd.getmesbuffer; is_score_or_name = is_score_or_name.left(1); /判断第一个字符是否为&QString sscore=messagesingglefd.getmesbuffer;if (is_score_or_name!=&is_score_or_name!=) /如果发送的是分数,

19、不是名字,则更新数据,刷新 /向玩家发送相关消息else if (is_score_or_name=&) /注册,否则查询用户名是否存在,建立新用户用户等/如果是注册请求,则进行相应处理else if(is_score_or_name=)/如果是登录请求,则进行相应处理5.2 客户端的开发5.2.1 前台界面的开发(部分代码)signal dengluclick(string str)/登录信号 signal zhuceclick(string str)/注册信号 property variant nameList: property variant scoreList: Image id:r

20、ect3 anchors.top: root.top anchors.topMargin: 480 anchors.left: root.left source:content/gfx/denglu.png /* color: #ff6347; border.color: lightsteelblue border.width: 4 radius: 32*/ width: 480 height: 300 /按键按下发射 Label id: iplabel anchors.left: rect3.left anchors.leftMargin: 60 anchors.top: rect3.top

21、 anchors.topMargin: 40 width: 178 height: 12 text: Ip地址 Label id: duankoulabel anchors.left: rect3.left anchors.leftMargin: 60 anchors.top: rect3.top anchors.topMargin: 80 width: 178 height: 12 text: 端口号 TextField id: ipdizhi anchors.left: rect3.left anchors.leftMargin: 130 anchors.top: rect3.top an

22、chors.topMargin: 30 width: 254 height: 28 placeholderText: qsTr(192.168.126.128) TextField id: duankouhao anchors.left: rect3.left anchors.leftMargin: 130 anchors.top: rect3.top anchors.topMargin: 70 width: 254 height: 28 placeholderText: qsTr(9666) /注册按键 Button id: denglu anchors.left: rect3.left a

23、nchors.leftMargin: 50 anchors.top: rect3.top anchors.topMargin: 180 width: 160 height: 60 text: 注册 onClicked: root.zhuceclick(name.text)/发送信号,并且把用户名发送过去 Column id: view y: -(height - 480) width: 320 GameOverScreen gameCanvas: canvas Item id: canvasArea width: 320 height: 480 Row height: childrenRect

24、.height Image id: wave y: 30 source:content/gfx/wave.png Image y: 30 source:content/gfx/wave.png NumberAnimation on x from: 0; to: -(wave.width); duration: 16000; loops: Animation.Infinite Image y: 25 source: content/gfx/wave.png NumberAnimation on x from: -(wave2.width); to: 0; duration: 32000; loo

25、ps: Animation.Infinite SequentialAnimation on y Image source: content/gfx/sunlight.png opacity: 0.02 y: 0 anchors.horizontalCenter: parent.horizontalCenter transformOrigin: Item.Top SequentialAnimation on rotation loops: Animation.Infinite NumberAnimation from: -10; to: 10; duration: 8000; easing.ty

26、pe: Easing.InOutSine NumberAnimation from: 10; to: -10; duration: 8000; easing.type: Easing.InOutSine Image source: content/gfx/sunlight.png opacity: 0.04 y: 20 anchors.horizontalCenter: parent.horizontalCenter transformOrigin: Item.Top SequentialAnimation on rotation loops: Animation.Infinite Numbe

27、rAnimation from: 10; to: -10; duration: 8000; easing.type: Easing.InOutSine NumberAnimation from: -10; to: 10; duration: 8000; easing.type: Easing.InOutSine GameCanvas id: canvas anchors.bottom: parent.bottom anchors.bottomMargin: 20 x: 32 focus: true InfoBar anchors.bottom: canvas.top; anchors.bott

28、omMargin: 6; width: parent.width /3.2.1.go Timer id: countdownTimer interval: 1000 running: root.countdown 5 repeat: true onTriggered: root.countdown+ NewGameScreen onStartButtonClicked: root.passedSplash = true 5.2.2 界面后台的开发(部分代码)const int max_nummber=300;class TcpClass: public QObject Q_OBJECT Q_P

29、ROPERTY( int rating READ rating )public: explicit TcpClass( QObject* parent = 0 ); TcpClass(); Q_INVOKABLE QString method( int a ) return get_namea; Q_INVOKABLE QString Get_Name(int i) return get_namei; Q_INVOKABLE int get( int a ) return get_scorea; Q_INVOKABLE int rating( void ); Q_INVOKABLE int G

30、et_Score(int i) return get_scorei; Q_INVOKABLE int Get_number(void); QString zhuce_denglu_mes(void);public slots: void recvMsg(); void errMsg(QAbstractSocket:SocketError); void on_zhuCeButton_clicked(QString str); void on_dengLuButton_clicked(QString str); void on_shuaxinButton_clicked(int a); void

31、lookedUp(const QHostInfo &host);public: QString IP_Address; static int get_number;/用于截取服务器发来的第一个数字,人数 static QString get_name_and_scoremax_nummber;/最大三百个数据 static QString get_namemax_nummber; static int get_scoremax_nummber; static int m_Rating;/静态成员变量,用于向QML传输信息 static int flag;/静态成员变量,用于判断,多次连接等 s

32、tatic int is_zhuce_denglu;/静态成员变量,用于判断是否注册或者登录,发送给QML等 static QString is_zhuce_denglu_mes;/静态成员变量,QML调用显示是否在线 private: QTcpSocket *tcpSocket; 5.4 系统测试5.4.1 软件测试的对象白盒测试,黑盒测试。客户端前台逻辑处理源程序,客户端后台套接字处理源程序 。客户端前台显示模块源程序,客户端后台逻辑处理源程序。服务器套接字处理源程序 ,服务器数据库处理模块源程序。客户端目标程序。服务器目标程序。数据库数据的正确与否测试。5.4.2 软件测试的结果经过白盒

33、测试:输入正确的数据,会反应正常。经过黑盒测试:输入错误的数据,会提示重新输入。客户端源程序逻辑正常,各个变量输出值正常。客户端套接字处理正常。服务器套接字文件描述符生成与处理正常。数据库建立正常。数据库存入数据正常。服务器运行平稳,在正常状态客户端游戏画面流畅,与服务器的交互值正常。6系统说明6.1 开发环境本游戏分为两部分第一部分是服务器:在Linux环境下开发的,系统的后台数据库为SQLite;在使用本服务器时候,只需要将运行文件拷贝到Linux环境下,双击或者命令调用即可运行,无需安装任何外加的库。第二部分是客户端:在Linux下Qt框架环境下开发的,由于Qt是跨平台的,所以游戏也是跨

34、平台的。6.2 系统安装与配置服务器直接在Linux环境下,双击或者命令调用即可运行,无需安装任何外加的库。客户端:(1)安卓环境下,支持安卓2.0以上版本,直接安装APK安装包即可;(2)Windows环境下,支持Windows系列操作系统,将安装包安装好之后,打开可运行文件即可;(3)Linux环境下,双击或者命令调用可执行文件即可。(4)苹果、WP系统下,直接安装安装包;总 结 首先,本次软件实训增强了我的动手能力,把以前的理论转换为实践。例如网络编程,套接字运用的更加熟练。对网络的理解也加深了。而使用脚本语言如QML、JavaScript等,增加了我快速开发的能力。也增强了我的图形界面

35、的编程能力。由于逻辑使用C+语言写的,锻炼了我C+语言的实践能力。在Qt框架下开发,使我对Qt的认识加深,如Qt的信号和槽的机制等。而且使我学到了脚本语言与C+等语言交互的技术。QML语言的使用使得我能编写出现代感的、动态流畅的图形界面。使用SQLite轻型数据库引擎,强化了我的数据库编程的动手能力。在Linux环境下进行开发,使我更好的使用Linux操作系统,对操作系统的认知也从理论层面拓展到实践层面,如操作系统的文件抽象,在进行套接字编程的时候,采用的就是把一个设备、一个套接字等都抽象成为一个文件描述符号,只需对文件描述符进行操作即可。而在以前,我对文件抽象总是不太理解。当然也遇到不少的问

36、题,例如在进行QML与C+相互调用的时候,有时候QML一点代码错误就使得调用不成功,但是QML是描述性语言,不会报错,因此有时候解决一个问题就耗费半天时间。也有许多的不足之处,例如整个游戏设计得层面太多,从脚本语言界面技术到Qt的信号和槽机制,再到底层的套接字编程技术。再到Linux编程技术,和数据库技术等。因此不能顾全。做到了全,但是没做到精。而且整个系统由本人一人完成,耗费的精力是很大的,且不可能面面俱到。例如对字符串的处理方面,现在还不能输入汉子,只能处理英文和数字,还需要进一步完善。总之收获是很大的,而且收获大于不足。在此感谢那些教授我知识的老师们,他们所教的知识在这次实践中大多都用到了。参考文献1 Linux程序设计第四版 .英Neil Matthew Richard Stones著 陈健 宋健健译 人民邮电出版社 2C+语言程序设计第四版.郑莉著 清华大学出版社附录软件运行截图:安卓环境下: Linux环境下: Windows环境下:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!