2021 JAVA课程设计——集大矿工 个人博客 一、负责板块二、选题与前期调查
2.1选题2.2前期调查 三.系统简述
3.1 构想界面3.2主要类
Objects类BombMiniBookMiddleBookPlusBook BackGround 类
属性 :方法 :
打印图形界面倒计时函数设计重新开始游戏函数GUI界面对应程序文字样式 四.脱离IDE运行,方便传播游戏
java工程项目导出为jar包常见错误解决办法(仅供参考)jar 包转为exeexe 转化为安装包 五.功能框架图
一、负责板块
陈锐 GUI图形界面的编写,类的设计及代码编写,实现脱离IDE运行
二、选题与前期调查 2.1选题集大矿工 模仿经典游戏黄金矿工
2.2前期调查以黄金矿工游戏为例,正常进行游戏需要构建 “黄金” “石块” “抓钩抓取” “碰撞检测 ” 等 ,我主要负责这些图形界面的设计,因为黄金矿工网上做的人也很多,所以我们决定重新设计背景以及抓取物品类型
三.系统简述 3.1 构想界面 3.2主要类 Objects类炸弹,大书,小书,中等书籍 都继承自物品类 ,每个物品都有其对应的坐标,对应权重,对应长短,拥有自己的图片
定义坐标(x,y)表示该物品位于坐标轴的位置,均使用Random自定义随机生成。定义长和宽,根据长宽及坐标构造出矩形,就可以表示物品具体所在位置,中间加入物品图片
代码:
public class Objects {
public int x;
public int y;
public int width;
public int height;
Image image;
public boolean isMove;
public int mass;
public int score;
public int type;
public void paintSelf(Graphics g) {
g.drawImage(image, x, y, null);
}
public int getWidth() {
return width;
}
public Rectangle getRecangle() {
return new Rectangle(x, y, width, height);
}
}
Bomb
炸弹类
抓到炸弹 分数-2,所以其对应的权重为-2
选取图片
代码
public class Bomb extends Objects {
public Bomb() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 550);
this.width = 71;
this.height = 71;
this.isMove = false;
this.mass = 50;
this.score = -2;
this.type = 2;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/bomb.png");
}
}
MiniBook
小号书籍,分数最少,质量最小
选取图片
public class MiniBook extends Objects {
public MiniBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 700);
this.width = 36;
this.height = 36;
this.mass = 15;
this.score = 2;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/c.png");
}
}
MiddleBook
中等大小书籍 ,分数
选取图片
public class MiddleBook extends Objects {
public MiddleBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(300, 600);
this.width = 52;
this.height = 52;
this.isMove = false;
this.mass = 30;
this.score = 4;
this.type = 1;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/jz.png");
}
}
PlusBook
大号书籍,分数最大,质量最大,相应设计时候的体积也最大
选取图片
public class PlusBook extends MiddleBook {
public PlusBook() {
this.x = new Random().nextInt(701);
this.y = new Random().nextInt(500, 700);
this.width = 85;
this.height = 85;
this.mass = 60;
this.score = 8;
this.image = Toolkit.getDefaultToolkit().getImage("imgs/jw.png");
}
}
BackGround 类
游戏背景类
选取图片
人物选择可爱的皮卡丘
关卡,电池数量,当前分数,目标分数,倒计时
方法 : 打印图形界面
void paintSelf(Graphics g) {
switch (GameWin.gameState) {
case 0:
g.drawImage(startPicture, 0, 0, null);
drawWord(g, 80, Color.ORANGE, "集大矿工", 40, 150);
drawWord(g, 40, Color.lightGray, "轻触右键开始", 40, 210);
break;
case 1:
g.drawImage(backGroundPicture, 0, 200, null);
g.drawImage(backGroundPicture1, 0, 0, null);
g.drawImage(minerPicture, 310, 50, null);
drawWord(g, 30, Color.black, "积分:" + count, 30, 150);
g.drawImage(batteryPicture, 550, 40, null);
drawWord(g, 30, Color.black, "*" + batteryNum, 610, 70);
drawWord(g, 20, Color.black, "第" + level + "关", 30, 60);
drawWord(g, 30, Color.black, "目标" + goal, 30, 110);
endTime = System.currentTimeMillis();
long tim = 20 - (endTime - startTime) / 1000;
drawWord(g, 30, Color.black, "时间:" + (tim > 0 ? tim : 0), 520, 150);
break;
case 2:
g.drawImage(backGroundPicture, 0, 200, null);
g.drawImage(backGroundPicture1, 0, 0, null);
g.drawImage(batteryPicture, 300, 400, null);
drawWord(g, 30, Color.black, "价格:" + price, 300, 500);
drawWord(g, 30, Color.black, "左键购买 右键取消", 250, 600);
if (shop) {
count = count - price;
batteryNum++;
shop = false;
GameWin.gameState = 1;
startTime = System.currentTimeMillis();
}
break;
case 3:
g.drawImage(defeatPicture, 0, 0, null);
drawWord(g, 80, Color.red, "失败 " + "积分:" + count, 100, 100);
drawWord(g, 40, Color.gray, "左键重新开始游戏", 150, 150);
break;
case 4:
g.drawImage(winPicture, 0, 0, null);
drawWord(g, 80, Color.red, "成功 " + "积分:" + count, 100, 100);
drawWord(g, 40, Color.gray, "左键重新开始游戏", 200, 520);
break;
default:
}
}
倒计时函数设计
每一关设计游戏时间为20秒
boolean gameTime() {
int gameTime = 20;
long time = (endTime - startTime) / 1000;
if (time > gameTime) {
return true;
}
return false;
}
重新开始游戏函数
void reGame() {
level = 1;
goal = level * 10;
count = 0;
batteryNum = 3;
batteryState = false;
}
GUI界面对应程序文字样式
默认使用黑体
public static void drawWord(Graphics g, int size, Color color, String string, int x, int y) {
g.setColor(color);
g.setFont(new Font("黑体", Font.BOLD, size));
g.drawString(string, x, y);
}
}
四.脱离IDE运行,方便传播游戏
我们平时在下一个软件,使用一个软件的时候,都不能让看到源代码,一方面是对开发者的开发权益保护,另一方面是为了让用户使用的时候更加方便不容易让程序出错,所以将程序打包,脱离IDE运行是很有必要的
java工程项目导出为jar包网上关于vscode 导出jar包的教程较少,描述也都有不同的方法,大部分都是eclipse的使用方法. 所以这里主要介绍vscode 的导出jar方法
点开项目目录,找到 “->”,单击,选择好main函数,jar即可导入到项目文件夹下
最后在程序窗口看到这行命令,jar就成功导出了
看上去好像很简单,似乎是非常方便,接下来我们尝试运行jar包,就会出现各种各样的问题。不同的机型,vscode插件的配置方法, 使用JDK的版本,都会导致运行Jar包时出现各种各样的错
如
因为本人才疏学浅,所以解决问题的办法都比较暴力,欢迎老师同学批评指正
我在尝试运行jar包的时候大致遇到以下几种情况:
因为课设时间比较急迫,遇到的问题没有全部截屏,所以采用口头叙述
(1)显示 “你的jar包 生成依靠的JDK版本是 11.x, 但系统依靠的版本JDK是13.x…… ” ,出现这种情况,一般是vscode 安装配置好java环境过后,又安装过其他的java编程软件如“eclipse” ,然后又重复配置系统jdk环境,安装新版本后导致新旧版本冲突导致的错误。
解决办法:找到系统安装目录删除所有版本的jdk,统一安装最新版本的jdk,
输入 电脑控制台 和 vscode 控制台 输入 javac -version 查看jdk版本是否一致,一致后更改完成,jar即可正常运行
vscode 控制台
电脑端cmd控制台
(2) 显示“无法加载主类,找不到主类”,这种情况我估计是vscode 脑袋比较笨的原因了,或者是其他什么我不知道的原因,大致是因为变成jar包最后我找不到main ,不知道怎么运行,这种情况的话,就把主类单独提出来,作为一个类,不要把主函数写到别的类里面
(3)显示 “加载主类 windows.Main 时出现 linkageError
java.lang.UnsupportedClassVersionError: Preview features are not enabled for windows/Main (class file version 61.65535). Try running with ‘–enable-preview’” 安装中文翻译的意思,这种情况是文件格式所引起的,复制好报错问题文件的代码,删除文件,重新添加文件
想要转成.exe,需要有其他软件的支持,这里使用的是:exe4j :官网:www.exe4j.com
参考博客 https://blog.csdn.net/qq_45964209/article/details/105889616
最终根据教程成功转化为 exe ,存放在exe文件夹当中
使用软件 Inno Setup 编译器
这一步尝试了很久一直在找问题,但是最终还是没有完全成功 、
根据网上教程下载了对应软件,但最终生成安装包安装成功后并不能正常运行
问题猜测:因为我使用的JDK 17文件夹当中并没有找到对应的jre,所以在网上下载了对应的jre,但是因为我生成jar的时候使用的并不是jre版本,而是jdk17所以导致出错,目前没有想到对应的解决办法,希望假期可以解决这个问题
五.功能框架图


