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

2023-10-25 05:10

本文主要是介绍Java实现联机Ateroids飞船陨石小游戏(多线程,网络),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 游戏主要功能
  • 程序结构设计
  • 设计模式
  • 网络设计
  • 代码
    • 游戏组件
    • 画框架和飞船
    • 网络实现
    • 单机
    • 主机
    • 联机
    • 观看
    • 数据库连接

计量经济本科在读,断断续续学编程一段时间了,还是个编程小白,一直没有什么连续的输出,不能完全解决问题,很有挫败感。立个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, 即飞船相关创建、运动(按键更新运动)的信息会通过网络不断传输、接收和更新。

代码

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

游戏组件

package aoop.asteroids.gui;import aoop.asteroids.model.Asteroid;
import aoop.asteroids.model.Bullet;
import aoop.asteroids.model.Game;
import aoop.asteroids.model.Spaceship;import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.Observable;
import java.util.Observer;/***	AsteroidsPanel extends JPanel and thus provides the actual graphical *	representation of the game model.**	@author Yannick Stoffers*/
public class AsteroidsPanel extends JPanel
{/** serialVersionUID */public static final long serialVersionUID = 4L;/** Game model. */private Game game;/** *	Constructs a new game panel, based on the given model.*  @param game game model.**/public AsteroidsPanel(Game game){this.game = game;this.game.addObserver (new Observer (){@Overridepublic void update (Observable o, Object arg){AsteroidsPanel.this.repaint ();}});}/***	Method for refreshing the GUI.**	@param g graphics instance to use.*/@Overridepublic void paintComponent (Graphics g){super.paintComponent (g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);this.setBackground (Color.black);this.paintSpaceship(g2);this.paintAsteroids(g2);this.paintBullets(g2);g2.setColor (Color.WHITE

这篇关于Java实现联机Ateroids飞船陨石小游戏(多线程,网络)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/280218

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧