资讯专栏INFORMATION COLUMN

Java 实现联机Ateroids飞船陨石小游戏(多线程,网络)

YancyYe / 3145人阅读

摘要:游戏主要功能用用户数据报协议实现稳定的多人联机飞行器陨石小游戏。除了飞船和飞船相撞不会损毁,其余组合都会有一方被损毁。多人联网游戏,活到最后的飞船得一分。过程并没有任何新的飞船被创建。

计量经济本科在读,断断续续学编程一段时间了,还是个编程小白,一直没有什么连续的输出,不能完全解决问题,很有挫败感。立个flag,希望写出来的东西通熟易懂,每天进步一点点。如有错误,请多多指正。

开始之前,需要大家大致知道IP Address(IP 地址), ports(通信端口), sockets的概念。打一个比喻,你要去一栋大楼里面办护照,然后你通过IP地址找到了它,然后办护照的办公室在201(port 想象成一个电脑上实现某个功能的application),你去到那个办公室以后递交了申请护照所需的材料,然后领导了护照的过程(socket 沟通的过程)。IP地址被用来给Internet上的电脑一个编号。通常每台联网的PC上都需要有IP地址,才能正常通信。一个进程通过internet socket,将它的输入与输出,与一个特定的传输协议,一个通信端口,与IP地址,关系起来。这个关系动作,称为绑定(binding),在这之后,就可以通过网络提交与接收数据(这里我们用的是接收发送datagram packtes)。

游戏主要功能

用UDP(User Datagram Protocol)用户数据报协议实现稳定的多人联机飞行器陨石小游戏。

主要功能菜单:

-单机玩小游戏
-能够Host联机多人游戏,同步更新
-能够旁观(Spectator)多人游戏
-能够临时加入游戏,或者离开游戏
-Score board.

游戏规则:子弹,飞船,陨石三件套。除了飞船和飞船相撞不会损毁,其余组合都会有一方被损毁。多人联网游戏,活到最后的飞船得一分。单人游戏按摧毁陨石数目得分。

每一个用户有一个用户名,不同用户飞船颜色不同

High score persistence. 得分存到数据库,然后Score board会从高倒低排序。

主要涉及的知识点有networking between the server and the client 和multi-threads.

程序结构设计

main package asteroids有3个packages(net, gui, userTypes, model)和一个main class.

net package有五个class,主要用于networking。

-server 包含了三个class: ClientAccepter, ShipReceiver, ModelSender分别用来接收注册用户,Host接收飞船, Host传送整个Game Model给clients。
-client 包含了两个class:ShipSender, ModelReceiver

gui package 包含了三个class (AsteroidsPanel, Asteroids Frame, Player), 主要用来画游戏框架,飞船,陨石一类的游戏物件,这些物件会根据玩家按键来操作。

userTypes 有一个abstract super-class 叫做User,User有四个sub-class 分别是玩家种类(SinglePlayer, Joiner, Spectator, Host),也用到了gui package的player class。

设计模式

MVC: 用来分开GameModel, View(AsteroidsFrame, AsteroidsPanel)和Controller(Player)

Factory Pattern: 用在构造Asteroids, Spaceship和Bullets物件。都是super-class GameObject的subclass。这样做的好处在于我们的client在创建对象时,并不需要知道具体要创建对象的哪个class。

Observer pattern: 因为存在对象间的one-to-many relationships。所以一个对象状态改变,我们想要其它与之关联的对象也自动变化。在这里,Player是我们的Subject class,User是我们的Observer class (包含了Joiner, Host, Spectator和SinglePlayer).

其它Patterns: 有些pattern并没有完全用到。很多已经被封装在server的实现里。比如说Transfer Object pattern 和 Command pattern。

Database (Score.java)用了ObjectDB。也用到Factory Pattern的概念(EntityManagerFactory)。

网络设计

如果一个client想要参与游戏,他需要输入自己的用户名和Host的IP地址。接着,用户名,IP地址,client port number还有client的种类(也就是User 的种类)被Host Game的ClientAccepter接收,如果client是Joiner,紧接着一艘有着那个用户名的飞船就被创建了。Host的ModelSender就知道具体哪个IP地址需要被Broadcast整个Host的Game Model。

这里ModelSender, ModelReceiver共用一个port(想象成一个传输游戏组建的application);ShipSender, ShipReceiver共用一个port; ClientAccepter用一个port (ClientRegister被包含在了Joiner class里)。

如果client是joiner,他会接收Host传输来的GameModel,然后他会通过ShipSender把用户按键信息传送回Host。Host会通过ShipReceiver接收,然后计算期中的逻辑关系,更新作图(画新的飞船然后根据用户传输过来的按键信息让飞船移动)。client并不参与任何涉及游戏逻辑(运动)的计算,只有HostGame class会进行所有的计算。

如果client是Spectator, 他就只会从Host的Modelsender接收到信息(ModelReceiever)。过程并没有任何新的飞船被创建。

需要指出ClientRegister 和 ClientAccpeter的过程只在加入游戏前创立连接。但其它过程如发送、接收游戏model, 即飞船相关创建、运动(按键更新运动)的信息会通过网络不断传输、接收和更新。

代码

有人阅读的话,我就贴上代码,继续更。

游戏组件 画框架和飞船 网络实现 单机 主机 联机 观看 数据库连接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72248.html

相关文章

  • 实践出真知:零基础小白学编程做游戏的 14 周历程

    摘要:谢耳朵爱玩的游戏,石头剪子布的升级版。拥有最高点数的玩家获胜,其点数必须等于或低于点。在编写这个游戏的过程中第一次引入了类概念。宇宙空间中微小的摩擦力和陨石撞击后受到的力,都要考虑并且编入游戏中。 人人都应该学编程吗?随着每个人的工作与电脑连结愈发紧密,也许这是真的。 我是游戏设计师,在分工细致的国内网游业界,不需要研发或美术背景也能担当游戏设计重任的角色多了起来。有时候他们甚至只需...

    haitiancoder 评论0 收藏0
  • Java001-流行的编程语言Java

    摘要:流行的编程语言是一项用于开发应用程序的技术,可以让变得更有意思和更实用。年月,由于甲骨文对于社区的不友善,因此扬言将退出。在运行时,平台中的解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。 流行的编程语言Java Java 是一项用于开发应用程序的技术,可以让 Web 变得更有意思和更实用。 Java 与 javascript 并不相同,后者是一种用于创...

    duan199226 评论0 收藏0
  • 实时联网游戏后台服务技术选型与挑战(网络接入篇)

    摘要:概述本系列文章将从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。多路复用避免了读写阻塞,减少了上下文切换,提升了利用率和系统吞吐率。 概述:本系列文章将从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。 关...

    zhisheng 评论0 收藏0
  • Python学习之路11-武装飞船

    摘要:和标志,用于表示飞船是否正在移动,用于实现飞船在不松开按键下连续移动。重写了函数,用于绘制飞船模块该模块主要是集中处理游戏中发生的各种事件。函数用于监听游戏的事件,比如,它表示游戏推出事件和分别表示键盘按下与松开事件。 《Python编程:从入门到实践》笔记。本章主要学习如何使用pygame编写一个简单的小飞机打外星人的游戏,由于本人对用python写游戏并不是特别感兴趣,所以主要是看...

    李昌杰 评论0 收藏0
  • Python学习之路12-外星人

    摘要:现在开始创建多行外星人。小结本篇讲述了如何在游戏中添加大量相同的元素如何用嵌套循环来创建元素网格如何控制对象在屏幕上移动的方向以及响应事件如何检测和响应元素碰撞如何在游戏中跟踪统计信息如何使用标志来判断游戏是否结束。 《Python编程:从入门到实践》笔记。本章主要是对上一篇的继续,添加外星人,外星人与飞船的交互。 1. 回顾项目 开发较大的项目时,进入每个开发阶段前回顾一下开发计划,...

    chemzqm 评论0 收藏0

发表评论

0条评论

YancyYe

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<