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

计量经济本科在读,断断续续学编程一段时间了,仍是个编程小白,一直没有什么连续的输出,不能彻底解决问题,颇有挫败感。立个flag,但愿写出来的东西通熟易懂,天天进步一点点。若有错误,请多多指正。java

开始以前,须要你们大体知道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里)。
在这里插入图片描述app

  • 若是client是joiner,他会接收Host传输来的GameModel,而后他会经过ShipSender把用户按键信息传送回Host。Host会经过ShipReceiver接收,而后计算期中的逻辑关系,更新做图(画新的飞船而后根据用户传输过来的按键信息让飞船移动)。client并不参与任何涉及游戏逻辑(运动)的计算,只有HostGame class会进行全部的计算。
  • 若是client是Spectator, 他就只会从Host的Modelsender接收到信息(ModelReceiever)。过程并无任何新的飞船被建立。
  • 须要指出ClientRegister 和 ClientAccpeter的过程只在加入游戏前创立链接。但其它过程如发送、接收游戏model, 即飞船相关建立、运动(按键更新运动)的信息会经过网络不断传输、接收和更新。

代码

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

游戏组件

画框架和飞船

网络实现

单机

主机

联机

观看

数据库链接

相关文章
相关标签/搜索