软件设计开发
本栏目责任编辑:谢媛媛
基于多进程的抗击生物病毒游戏的设计与实现
曾雨阳,赵建喆
(东北大学软件学院,辽宁沈阳110169)
摘要:随着网络的迅速发展,多人在线游戏备受欢迎。选取抗击生物病毒的主题,通过多线程等技术开发了游戏,多个客户
端可以通过socket 连接服务器,实现通信与交互。旨在借助多人在线游戏的特点,传递抗击生物病毒的精神力量。关键词:多进程;多线程;多人在线游戏中图分类号:TP311
文献标识码:A
文章编号:1009-3044(2021)14-0047-02
开放科学(资源服务)标识码(OSID ):
Design and Implementation of a Multi-process Game against Biological Virus ZENG Yu-yang,ZHAO Jian-zhe
(Software College,Northeastern University,Shenyang 110169,China)
Abstract:With the rapid development of the Internet,multiplayer online games are very popular.Fighting biological virus is select⁃ed as the topic of the game.Through multi-threading technology,the game is developed.To achieve communication and interac⁃tion,multiple clients can be connected to the server via socket.The spirit of fighting biological virus is transferred using the charac⁃teristics of multiplayer online games.
Key words:multi-process;multi-threading;multiplayer online game
1背景
本文设计并实现了一个基于多进程、多人在线操作的抗击生物病毒游戏。
玩家可以自由控制自己的“医生”角,当与对面来的病毒相遇时,玩家医生血量减少;当与对面来的疫苗或口罩道具相遇时,玩家会获得积分。
游戏实现了以下功能:上下左右按键自由控制“医生”角的移动。随机生成病毒、疫苗和口罩道具,这些障碍物会以不同的速度匀速自上而下移动。玩家血量减少、玩家积分、失败和重新开始等。界面显示生命值和得分。
游戏具有多人联机协同的功能。客户端使用Java 与Swing 实现,服务端使用C/C++混合编程,实现了多进程、多线程、进
程间通信和多路复用等技术[1-2]
2系统设计
2.1架构设计
游戏客户端使用Java Swing 作为前端GUI ,使用Java 作为客户端逻辑,服务端使用C/C++混合编程实现,客户端与服务端使用Socket TCP 协议连接[3]。架构设计如图1所示。
图1游戏架构设计
客户端不负责进行关键逻辑判断,只负责接收消息并将处理后的消息展示到GUI 界面,服务端负责实现病毒、口罩和疫苗道具等障碍物对象的生成、相遇判断等,有效地避免了客户端可能发生的作弊现象,保证了游戏的公平性与安全性。
服务端使用多进程、多线程、进程间通信和多路复用技术,实现思路如图2所示。
收稿日期:2021-01-25作者简介:曾雨阳(1999—),男,湖南衡阳人,本科在读,主要研究方向为智能软件、人机交互;赵建喆(1982—),女,通信作者,吉林
白山人,讲师,博士,主要研究方向为隐私保护、机器学习。
47
本栏目责任编辑:谢媛媛
软件设计开发
Computer Knowledge and Technology 电脑知识与技术第17卷第14期(2021年5月
)
图2服务端多进程和多线程的实现思路
子进程用于运行游戏,异常退出等对于主进程的影响小。父子进程之间使用信号机制进行通信,子进程使用多线程同时处理数据,使用多路复用轮询所有客户端[4]。2.2server 服务器端的逻辑2.2.1main()主运行进程
初始化内存,给服务器网络地址结构体sockaddr_in 设置
TCP 协议,设置为可以连接任意的IP 地址,服务器端口号设置为8888。按照socket()、bind()、listen()和accept()的顺序监听端口。
socket()获取服务器端socket 的文件描述符,采用IPv4和TCP 协议。bind()将服务器端socket 绑定到服务器的地址和端口上(服务器网络地址结构体sockaddr_in )。listen()监听8888端口号上的连接请求,进入的连接请求在使用系统调用accept ()应答之前要在进入队列中等待。signal(SIGUSR1,father_lis⁃ten)设置信号的处理函数。2.2.2调用father_listen()函数
父进程监控为father_listen()。accept()处理连接8888端口
的请求,获取客户端的socket 文件描述符(用来调用send()和recv()),并放入玩家列表player_list 中。对该客户端连接,fork()创建子进程,子进程中启动主客户端进程main_client 。挂起父进程,直到收到SIGUSR1的信号。2.2.3main_client()主客户端进程
创建两个线程,分别用于调整障碍物移动obstacle_run 和
获取新客户端get_new_client 。初始化障碍物列表,包括其种类和初始位置。服务器主进程通过多路复用以监听客户端。多路分离函数select()实现多路复用,在同一个线程内同时处理多个请求,不断轮询所负责的socket 。监视fd 文件描述符是否可读取,是否有数据到来。当可读取时,用recv()函数从TCP 连接的另一端接收数据,存放在长度为1024的buff 缓冲区中。以逗号为分界,切割客户端发来的数据字符串,处理数据。根据这
些数据,在服务器中更新对应ID 的玩家数据。连接成功后为客户端创建玩家控制对象,初始坐标随机。并用sendData()将数据发回客户端,通知连接成功。
3关键部分程序实现
3.1Socket 通信
本游戏采用了Java Swing 作为客户端,利用Socket 在两种
语言间发送消息[5]
。在连接client 和server 的过程中,Java 与C 发送接收数据时应该将String 类型的字符串中包含的字符
转换成byte 类型,存入到一个byte[]数组中,且应该指定编码形式,否则会出现乱码的现象(Java 默认使用UTF-8,C++默认使用GBK ),例如,使用语句toServer.write((ID +",connected,").get⁃Bytes("GB2312"))。
在服务端,获取客户端的socket 文件描述符作为客户端新的连接,其中包含客户端ip 和port ,具体语句如下:
client_socket =accept(server_socket,(struct sockaddr *)&re⁃mote_addr,(socklen_t *)&client_len);
学习编程的单机游戏服务端将这个请求的新文件描述符放到player_list 中,视为一个新的玩家对象。如果客户端没有新的连接,则关闭客户端socket ,并在父进程中,把调用进程挂起pause(),直至捕获到一个SIGUSR1的信号。
在客户端,通过while(true)循环读取服务器传来的数据,通过String(readBuff).trim()去除数据中的空白符,处理并判断服务器返回的数据,如果判断游戏结束,则显示“再来一次”按钮,并结束游戏,否则继续显示游戏操作提示信息和玩家当前坐标。3.2多线程
通过pthread_create()创建服务器全局障碍物调整的线程,如果创建成功,该函数返回值为零。同样方法创建第二个用于监听是否有新的客户端传入的线程。多线程以实现病毒、疫苗和口罩道具的匀速自上而下移动,以及多人在线操作的功能。3.3多路复用
使用select()函数实现多路复用,以监视fd 文件描述符是否
可以读取。select()函数会不断轮询所负责的socket ,监测是否有数据到来。用recv()函数从TCP 连接的另一端接收数据,存放在长度为1024的buf 缓冲区中。具体实现方法如下:
ret_val =select(nfds:player_list[client_num -1]+1,&rfds,writefds:NULL,exceptfds:NULL,stv);
recv(player_list[i],buf,n:1024,flags:0)。3.4病毒、口罩和疫苗道具等障碍物的位置移动
使用obstacle_run()函数实现障碍物的移动。通过随机数
发生器的初始化函数srand(),使用系统时间作为种子,以随机产生障碍物的种类。不同种类障碍物设置不同的移动步长,产生不同的移动速度效果。
遍历所有的障碍物对象,将障碍物所有服务端处理后的数据(如ID 、位置、种类等)发送给玩家列表里所有的玩家客户端,以实现所有病毒、口罩和疫苗道具等障碍物的位置移动。3.5相遇检测
假设两个移动对象中心点的距离为变量a ,两个移动对象的边缘矩形中心点对角线的距离为变量b ,只要a 小于b ,那么就判定两者相遇。
(下转第51页)
48
软件设计开发
本栏目责任编辑:谢媛媛
Computer Knowledge and Technology 电脑知识与技术
第17卷第14期(2021年5月)
现当前操作时长,向右奔跑的卡通人,当这一步操作迅速而且正确,卡通人会吃掉一个水果,有3种水果,草莓计1分,苹果计2分,西瓜计3分,训练用户操作速度操作完成后系统弹出交卷窗口,点击“确定”按钮交卷,即弹出排行榜,显示当前考试成绩及排名及获得的水果数,如图7
所示。
图7考试环节操作过程
2.7.2减速器拆卸
减速器拆卸考试环节按10个考点进行考核:输入考试信息à单击扳手拧开螺丝à单击端盖拆卸端盖→单击前盖拆卸前盖→单击轴承拆卸轴承→单击机盖搬开机盖→单击输入轴拆卸输入轴→单击锥齿轮拆卸锥齿轮→单击小齿轮拆卸小齿轮→单击输出轴拆卸输出轴→单击大齿轮拆卸大齿轮→交卷→成绩排名。
3减速器虚拟仿真实验平台的实现
减速器虚拟仿真实验平台运用了Unity3D 技术进行开发,开发步骤为:
1)在Pro/E 软件中参照减速器实物进行三维建模,并将文件另存为dwg 格式;
2)3dsmax 可识别Pro/E 生成的dwg 文件,将减速器三维建模导入3dsmax 软件中,删除不需要的线条和图层,不需要设置
材质和贴图,也不需要制作动画,再将文件导出为FBX 格式;
3)将减速器三维建模的FBX 格式文件导入Unity3D 中,用英文标注减速器各零部件的名称,以便在编程和参数设置过程中便于Unity3D 识别;
4)使用C#编程语言编写Unity3D 的交互代码,如旋转、消失、高亮显示、弹窗等,在Unity3D 相应的参数面板进行参数设置即可完成各种仿真实验的交互。
4结束语
当今是“互联网+”的时代,云物大智移各项技术都在为各行各业服务,采用虚拟仿真技术开发教学资源已逐渐成为大中小学课程资源的必要条件,特别对于高校工科类课程,本文设计的减速器虚拟仿真实验平台,运用了Unity3D 技术进行开发,可以生成电脑单机版exe 可执行文件,也可导出apk 在手机客户端直接运行,既解决了实验室教学设备昂贵稀少,学生无法训练的难题,也丰富了教师课堂教学实验内容,操作简单仿真度高,增加了学生的学习兴趣,也强化了学生对知识点的掌握,该平台可为其他同类型虚拟仿真实验项目的开发提供借鉴。
参考文献:
[1]刘赣华,包世阳,黄云生.机械手减速器行星架组仿真与试验
研究[J].机械设计与研究,2020,36(3):72-76.
[2]张俊,孙树礼.基于虚拟技术的减速器仿真系统的研究与开发[J].西安文理学院学报(自然科学版),2019,22(6):36-40.
[3]张俊,孙树礼,吴央芳.基于Unity3D 的RV 减速器虚拟仿真系统研发[J].组合机床与自动化加工技术,2019(9):120-123.
【通联编辑:王力】
(上接第48页)
4总结
利用Java Swing 构建界面,利用Java 和C 两种语言分别搭
建客户端与服务端并进行交互,趣味性强。游戏为实时网络游戏,多个玩家连接服务器进行游戏,合理有效地使用了多进程、多线程、信号机制和多路复用等技术,数据交互具有较好的实时性和准确性。游戏的业务部分都在服务器端处理,而客户端主要用于接收用户的输入及显示,保证了游戏的公平性和安全性。
服务端具有一定的健壮性,具有较好的性能,游戏逻辑较为复杂(随机生成障碍物移动对象、键盘控制玩家对象、障碍物相遇检测等)。选择抗疫题材,玩家通过此游戏可以获得积极向上,共克时艰的昂扬精神力量,这样的游戏可以为抗击疫情贡献一份精神力量。
参考文献:
[1]吕佳欢,蒋富,金易.基于Java 的人游戏设计[J].电脑知识
与技术,2020,16(25):97-98.
[2]Fang W J,Wang C L,Lau F C M.On the design of global ob⁃ject space for efficient multi-threading Java computing on clusters[J].Parallel Computing,2003,29(11/12):1563-1587.
[3]傅玥,蔡兴富.Socket 网络编程-基于TCP 协议或UDP 协议[J].中国新通信,2020,22(8):57-58.
[4]Himang M M,Himang C M,Ceniza A M,et al.Using an extend⁃ed technology acceptance model for online strategic video games[J].International Journal of Technology and Human Inter⁃action,2021,17(1):32-58.
[5]刘贤梅,刘俊,贾迪.Unity 引擎下多人在线网络游戏的设计与开发[J].计算机系统应用,2020,29(5):103-109.
【通联编辑:谢媛媛】
51

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。