2021 JAVA课程设计——集大矿工 个人博客

2021 JAVA课程设计——集大矿工 个人博客

文章目录

    • 2021 JAVA课程设计——集大矿工 个人博客
  • 一、负责板块
  • 二、选题与前期调查
    • 2.1选题
    • 2.2前期调查
  • 三.系统简述
      • 3.1 构想界面
      • 3.2主要类
        • Objects类
        • Bomb
        • MiniBook
        • MiddleBook
        • PlusBook
      • BackGround 类
        • 属性 :
        • 方法 :
          • 打印图形界面
          • 倒计时函数设计
          • 重新开始游戏函数
          • GUI界面对应程序文字样式
  • 四.脱离IDE运行,方便传播游戏
    • java工程项目导出为jar包
    • 常见错误解决办法(仅供参考)
    • jar 包转为exe
    • exe 转化为安装包
  • 五.功能框架图


一、负责板块

陈锐 GUI图形界面的编写,类的设计及代码编写,实现脱离IDE运行

二、选题与前期调查

2.1选题

集大矿工 模仿经典游戏黄金矿工

2.2前期调查

2021 JAVA课程设计——集大矿工 个人博客_第1张图片

以黄金矿工游戏为例,正常进行游戏需要构建 “黄金” “石块” “抓钩抓取” “碰撞检测 ” 等 ,我主要负责这些图形界面的设计,因为黄金矿工网上做的人也很多,所以我们决定重新设计背景以及抓取物品类型

三.系统简述

3.1 构想界面

3.2主要类

2021 JAVA课程设计——集大矿工 个人博客_第2张图片

Objects类

炸弹,大书,小书,中等书籍 都继承自物品类 ,每个物品都有其对应的坐标,对应权重,对应长短,拥有自己的图片
2021 JAVA课程设计——集大矿工 个人博客_第3张图片

定义坐标(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;
	/**
	 * (标记 1为课本 2为炸弹)
	 */
	public int type;

	public void paintSelf(Graphics g) {
		g.drawImage(image, x, y, null);
	}

	public int getWidth() {
		return width;
	}

	/**
	 * 
	 * @Title: getRecangle
	 * @Description: 获取矩形,判断这个物体具体到达的位置
	 * @return Rectangle
	 */
	public Rectangle getRecangle() {
		return new Rectangle(x, y, width, height);
	}
}

Bomb

炸弹类
抓到炸弹 分数-2,所以其对应的权重为-2
选取图片
在这里插入图片描述
代码


/**
 * 
 * @ClassName Bomb
 * @Description 炸弹
 * @Author 陈锐
 * @Time 2021年1月9日 下午3:30
 */

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

小号书籍,分数最少,质量最小
选取图片
在这里插入图片描述


/**
 * 
 * @ClassName MinBook
 * @Description
 * @Author 陈锐
 * @Time 2021年1月9日 下午3:30
 */

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

中等大小书籍 ,分数
选取图片
在这里插入图片描述


/**
 * 
 * @ClassName MiddleBook
 * @Description
 * @Author 陈锐
 * @Time 2021年1月9日 下午3:30
 */

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

大号书籍,分数最大,质量最大,相应设计时候的体积也最大
选取图片
在这里插入图片描述

/**
 * 
 * @ClassName PlusBook
 * @Description 最大号书籍
 * @Author 陈锐
 * @Time 2021年1月9日 下午3:30
 */
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 类

游戏背景类
选取图片
2021 JAVA课程设计——集大矿工 个人博客_第4张图片

2021 JAVA课程设计——集大矿工 个人博客_第5张图片

人物选择可爱的皮卡丘
2021 JAVA课程设计——集大矿工 个人博客_第6张图片

属性 :

关卡,电池数量,当前分数,目标分数,倒计时

方法 :

打印图形界面
	 /**
	 * (绘制)
	 */
	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秒
	/**
	 * (t倒计时完成 f正在倒计时)
	 */
	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;
		/**
		 * (药水状态,默认F,T 正在使用 F 无法使用)
		 */
		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即可导入到项目文件夹下
2021 JAVA课程设计——集大矿工 个人博客_第7张图片
2021 JAVA课程设计——集大矿工 个人博客_第8张图片
最后在程序窗口看到这行命令,jar就成功导出了
在这里插入图片描述

看上去好像很简单,似乎是非常方便,接下来我们尝试运行jar包,就会出现各种各样的问题。不同的机型,vscode插件的配置方法, 使用JDK的版本,都会导致运行Jar包时出现各种各样的错

2021 JAVA课程设计——集大矿工 个人博客_第9张图片

常见错误解决办法(仅供参考)

因为本人才疏学浅,所以解决问题的办法都比较暴力,欢迎老师同学批评指正
我在尝试运行jar包的时候大致遇到以下几种情况:
因为课设时间比较急迫,遇到的问题没有全部截屏,所以采用口头叙述

(1)显示 “你的jar包 生成依靠的JDK版本是 11.x, 但系统依靠的版本JDK是13.x…… ” ,出现这种情况,一般是vscode 安装配置好java环境过后,又安装过其他的java编程软件如“eclipse” ,然后又重复配置系统jdk环境,安装新版本后导致新旧版本冲突导致的错误。
解决办法:找到系统安装目录删除所有版本的jdk,统一安装最新版本的jdk,
输入 电脑控制台 和 vscode 控制台 输入 javac -version 查看jdk版本是否一致,一致后更改完成,jar即可正常运行

vscode 控制台
2021 JAVA课程设计——集大矿工 个人博客_第10张图片
电脑端cmd控制台
2021 JAVA课程设计——集大矿工 个人博客_第11张图片

(2) 显示“无法加载主类,找不到主类”,这种情况我估计是vscode 脑袋比较笨的原因了,或者是其他什么我不知道的原因,大致是因为变成jar包最后我找不到main ,不知道怎么运行,这种情况的话,就把主类单独提出来,作为一个类,不要把主函数写到别的类里面
2021 JAVA课程设计——集大矿工 个人博客_第12张图片

(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’” 安装中文翻译的意思,这种情况是文件格式所引起的,复制好报错问题文件的代码,删除文件,重新添加文件

jar 包转为exe

想要转成.exe,需要有其他软件的支持,这里使用的是:exe4j :官网:www.exe4j.com
参考博客 https://blog.csdn.net/qq_45964209/article/details/105889616

最终根据教程成功转化为 exe ,存放在exe文件夹当中
2021 JAVA课程设计——集大矿工 个人博客_第13张图片
2021 JAVA课程设计——集大矿工 个人博客_第14张图片

exe 转化为安装包

使用软件 Inno Setup 编译器
2021 JAVA课程设计——集大矿工 个人博客_第15张图片
这一步尝试了很久一直在找问题,但是最终还是没有完全成功 、2021 JAVA课程设计——集大矿工 个人博客_第16张图片

根据网上教程下载了对应软件,但最终生成安装包安装成功后并不能正常运行
2021 JAVA课程设计——集大矿工 个人博客_第17张图片

问题猜测:因为我使用的JDK 17文件夹当中并没有找到对应的jre,所以在网上下载了对应的jre,但是因为我生成jar的时候使用的并不是jre版本,而是jdk17所以导致出错,目前没有想到对应的解决办法,希望假期可以解决这个问题

五.功能框架图

2021 JAVA课程设计——集大矿工 个人博客_第18张图片

你可能感兴趣的:(java,java)