文章目录
-
- 一、系统需求,主要功能描述
- 1.系统需求
- 2.主要功能
- 二、系统结构、设计方案(类图)
- 1.系统结构
- 2. 设计方案(类图)
- 三、系统实现技术,编码说明
- 1.系统实现技术
- 四、 性能参数的设计
- 1. 要求数据管理能力
- 2. 准确性
- 3. 灵活性
- 4. 流畅性
- 5. 鲁棒性(robust)
- 6. 时间特性
- 五、 操作结果及分析
- 1.项目打包
- 2.服务器数据截图
- 3.游戏主界面
- 4.游戏状态界面
- 5. 飞机大战排行榜界面
- 6.登录失败界面
- 7.注册失败界面
- 8.注册失败界面
- 六、总结和项目自评
- 1.项目质量完成
- 2.项目完成进度
- 3.项目存在问题
- 4.项目改进方向
- 六、 其他(项目细节)
- 八. 代码说明
- 九、开发环境
一、系统需求,主要功能描述
1.系统需求
用户可以在主界面注册、登录和查看列表;登录成功后,可以选择ShootGame(飞机大战游戏)或CarGame(道路狂飙游戏)。
2.主要功能
- 竞技排行榜:用户查看排行榜,实现与他人竞争。
- 用户注册和登录:用户可根据既定规则注册和登录专属账号,体验专属游戏记录。
- ShootGame:随着敌机和小蜜蜂数量的增加,给定时器的设置进度,飞行物的生成/入口/步行/射击/碰撞,游戏结束,绘制游戏状态(开始/进行/暂停/结束),绘制飞行物(小蜜蜂/小敌机/Boss机/英雄机),画分数(Score/MaxScore/Life/Energy)、绘制背景
- 用户注册与登录:用户可以根据既定规则注册与登录专属账号,体验专属的游戏记录。
- 项目包装:将项目包装成可执行文件,实现项目移植,摆脱jdk,IJ等待环境约束。
- 云存储:用户信息存储在云服务器端,不占用额外的用户内存,杜绝直接信息修改,实现所有用户信息同步。
二、系统结构、设计方案(类图)
1.系统结构
2. 设计方案(类图)
该包以Flying飞行类行,分Shoot,Collision接口,Flying定义飞行物的固有特征和飞行物的共同方法,Hero,Boss,Bee,Enemy,Bullet为Flying子类,继承Flying变量和方法提高了代码的重用性和鲁棒性。 User包中包含User类别和存储配置文件的位置Info接口,User类别主要包括用户与后端数据库的连接、登录、注册和保存。 图形界面包括项目主界面、用户登录注册和游戏入口。 该包包含ShootGame与CarGame游戏主界面和游戏操作逻辑方法。 该包包含CarGame游戏的所有组件,以Car为父类,UserCar,PcCar为子类。
三、系统实现技术,编码说明
1.系统实现技术
:实现账户密码验证、注册、用户信息检索、插入、更新、删除等操作,统一管理数据,确保数据的安全性和完整性。 :将代码实现为软件,摆脱增强jdk开发环境降低了项目沟通和用户使用的可能性,降低了用户的使用成本。提高了项目的安全性,防止了错误导致的代码丢失或错误,防止了用户在游戏中的不正当竞争。 :利用GUI构建鼠标键盘监控(AWT)、登录界面、主界面、游戏界面、提示界面等,实现可视化界面。 1.代码中可以反映继承、包装、多肽和接口。
四、 性能参数的设计
1. 要求数据管理能力
用户账号:不使用空格,无字数限制,支持汉英文; 用户密码:6-11位字符,无特殊符号限制;
2. 准确性
为每个用户设置索引值,通过索引值准确修改用户信息,实现端到端数据连接。
3. 灵活性
多个用户可以同时在线,用户和用户不会互相干扰。
4. 流畅性
采用写回策略,设置了写回缓冲器,减少了访问主存的次数,即更新缓存时,只有在需要交换缓存中的脏数据时,才能将数据同步到主内存中。
5. 鲁棒性(robust)
系统生存在异常和危险情况下的关键。该项目具有异常处理功能,可以捕获和响应事故,以确保程序安全结束,计算机不会崩溃。
. 时间特性
本项目通过定时器设置进度,可以指定想要delay(开始执行的等待时间)时间,在实现时Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。Timer实例可以调度多任务,它是线程安全的。当Timer的构造器被调用时,它创建一个线程,这个线程可以用来调度任务。
五、 运行结果与分析
1.项目打包
2.服务器数据截图
3.游戏主界面
4.游戏状态界面
5. 飞机大战排行榜界面
6.登录失败界面
7.注册失败界面
8.注册失败界面
六、总结与项目自评
1.项目完成质量
按计划完成原定飞机大战项目功能目标,实现英雄机射击,加血,减血清屏等功能,并且拥有BOSS,小蜜蜂奖励机制。利用数据库存放用户数据,可以联机实现不同用户端共享数据,并且达到较好的用户体验。同时利用飞机大战定时器,碰撞,随机等机制,实现小汽车碰撞小游戏。
2.项目完成进度
按照原定计划按时完成项目,并在完成原定的飞机大战计 划上制作了一个汽车游戏。
3.项目存在问题
3.1其他用户只有与主机连接同一局域网时才可正常登入账号。 3.2游戏方式单一,用户粘性不强。 3.3缺乏多感官的游戏体验。
4.项目改进方向
4.1实现“全网通”,在用户连接不同网络时也可以正常登入账号。 4.2开发多种玩法,比如关卡模式、联机模式等。 4.3实现声音特效的嵌入。 4.4实现用户间的交流平台(聊天室)。 4.5添加更多的游戏项目。
六、 其他(项目细节)
1.游戏难度随时间增加,5%的概率生成小蜜蜂 2.定时器定时任务,每1秒保存1次用户信息,既能保持适度流畅的游戏体验,也能及时保存用户信息。 3.碰撞逻辑
八. 代码说明
:
public void setPassword(String password) {
this.password = password;
}
public int getMax_score() {
return max_score;
}
/** * 判断是否登录成功 */
public boolean sign_in(String name, String password) {
String sql = "select user_id,user_name,user_password,user_score from user";//查询user表中的所有信息
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()) {
this.id = resultSet.getInt(1);
this.name = resultSet.getString(2);
this.password = resultSet.getString(3);
this.score = 0;
this.max_score = resultSet.getInt(4);
if (this.name.equals(name) && this.password.equals(password))
return true;
}
connection.close();
statement.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/** * 判断是否注册成功 */
public boolean register(String name, String password) {
if (password.length() > 11 || password.length() < 6) {
//System.out.println(password);
return false;
}
if (name.contains(" "))
return false;
if (in(name))
return false;
getCount();
String sql = "insert into user(user_id,user_name,user_password,user_score) values(" +
(COUNT + 1) + " , '" + name + "' , '" + password + "' , " + 0 + ")";
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);
Statement statement = connection.createStatement();
statement.executeUpdate(sql);//插入信息
connection.close();
statement.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/** * 判断用户是否已存在于配置文件中 */
public boolean in(String name) {
String sql = "select user_id,user_name,user_password,user_score from user";//查询user表中的所有信息
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()) {
int id = resultSet.getInt(1);
this.name = resultSet.getString(2);
this.password = resultSet.getString(3);
this.score = resultSet.getInt(4);
if (this.name.equals(name))
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/** * 给用户临时增加分数 */
public void add_score(int score) {
this.score += score;
}
/** * 保存用户信息 */
public void save() {
set_score();
}
public void copyFrom(User user) {
this.setScore(user.getScore());
this.setId(user.getId());
this.setName(user.getName());
this.setAttribute(user.getAttribute());
this.setPassword(user.getPassword());
}
public void set_score() {
String sql = "update user set user_score=" + score + " where user_id=" + this.id;
if (score <= max_score)
return;
try {
//System.out.println(score);
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
statement.executeUpdate(sql);//执行sql语句
connection.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<User> getRank() {
String sql = "select user_id,user_name,user_password,user_score from user";//查询user表中的所有信息
ArrayList<Integer> score_rank = new ArrayList<>();
ArrayList<User> user_rank = new ArrayList<>();
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()) {
int temp_id = resultSet.getInt(1);
String temp_name = resultSet.getString(2);
String temp_password = resultSet.getString(3);
int temp_score = resultSet.getInt(4);
score_rank.add(temp_score);
}
connection.close();
statement.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
for (int j = 0; j < score_rank.size(); j++) {
int maxIndex = 0;
for (int k = 0; k < score_rank.size(); k++) {
if (score_rank.get(maxIndex) < score_rank.get(k))
maxIndex = k;
}
String temp_name = id_to_account(maxIndex);
int temp_score = score_rank.get(maxIndex);
User user = new User(temp_name, temp_score, maxIndex);
user_rank.add(user);
score_rank.add(maxIndex, -1);
score_rank.remove(maxIndex + 1);
}
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Integer score1 = ((User) o1).getScore();
Integer score2 = ((User) o2).getScore();
return score1.compareTo(score2);
}
}
//Arrays.sort(rank,new MyComparator());
return user_rank;
}
//按指定行读取用户名称
public String id_to_account(int id) {
String sql = "select user_id,user_name,user_password,user_score from user";//查询user表中的所有信息
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()) {
int temp_id = resultSet.getInt(1);
String temp_name = resultSet.getString(2);
if (id == temp_id)
return temp_name;
}
connection.close();
statement.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public int id_to_score(int id) {
String sql = "select user_id,user_name,user_password,user_score from user";//查询user表中的所有信息
try {
initParam(Sql_filename);
Connection connection = DriverManager.getConnection(url, user, pass);//连接数据库
Statement statement = connection.createStatement();//创建statement对象
ResultSet resultSet = statement.executeQuery(sql);//执行sql语句
while (resultSet.next()) {
int temp_id = resultSet.getInt(1);
String temp_name = resultSet.getString(2);
String temp_password = resultSet.getString(3);
int temp_score = resultSet.getInt(4);
if (id == temp_id) {
this.max_score = temp_score;
return temp_score;
}
}
connection.close();
statement.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
}
:
Test类
public class Test {
public static void main(String[] args) {
Run run = new Run();
run.main();
}
}
import Games.CarGame; import Games.ShootGame; import Users.User; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; public class Run extends 标签:
快插矩形连接器