前言
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🎉推荐up主专题文章【C语言编程一百题】
📌QQ:3052645092 有问题可以一起讨论哦
演示黄金矿工小游戏
黄金矿工小游戏
主要功能类
package com.Frame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* @author 你是大**吗?
* version 1.0
*/
@SuppressWarnings({"all"})
public class GameWin extends JFrame {
//状态 0 未开始 1运行中 2 商店 3 失败 4 胜利
static int state;
//创建背景对象
background background = new background();
//创建线类对象
Line line = new Line(this);
//创建画布 把该画的东西画到画布上 在往屏幕上画
Image offScreenImage;
//存储金块的集合
ArrayList<JObject> objectArrayList = new ArrayList<>();
{//普通代码块 添加金块-随机生成
double random;
//临时变量
Gold gold;
//标记变量
boolean flag;
for (int i = 0; i < 12; i++) {
random = Math.random();
System.out.println("rondom=" + random);
flag = true;//默认是可以添加的
if (random < 0.3) { //0-0.3 小金块
//属于向上转型了
gold = new GoldMini();
} else if (random >= 0.3 && random <= 0.7) {
//属于向上转型了
gold = new Gold();
} else {
//大金块
//属于向上转型了
gold = new GoldPlus();
}
//判断此时添加的金块位置是否重叠
for (JObject jObject : objectArrayList) {
//判断是否重合
if (gold.GetRect().intersects(jObject.GetRect())) {
flag = false;
}
}
if (flag) {//添加
objectArrayList.add(gold);
} else {//不添加
gold = null;
i--;
}
}
//添加石块
rock rock1;
for (int i = 0; i < 5; i++) {
flag = true;
//属于向上转型了
rock1 = new rock();
//判断此时添加的金块位置是否重叠
for (JObject jObject : objectArrayList) {
//判断是否重合
if (rock1.GetRect().intersects(jObject.GetRect())) {
flag = false;
}
}
if (flag) {//添加
objectArrayList.add(rock1);
} else {//不添加
rock1 = null;
i--;
}
}
}//普通代码块_end
public void launch() {
this.setVisible(true);//设置窗口可见性
this.setSize(768, 1000);//设置窗口大小
this.setLocationRelativeTo(null);//设置窗口位置
this.setTitle("黄金矿工游戏");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//设置鼠标点击关闭操作
//设置一个鼠标事件
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch (state) {
case 0:
if (e.getButton() == 3) {//打击右键游戏开始
state = 1;
//设置游戏开始时间
background.startTime = System.currentTimeMillis();
}
break;
case 1:
//按左键以及处于摇摆状态在延长线段
if (e.getButton() == 1 && line.state == 0) {//1:左键 2 滚轮 3 右键
line.state = 1;
}
//按右键以及处于抓取状态
if (e.getButton() == 3 && line.state == 3 && background.waterNum > 0) {
//药水减1 金块:实现快速回拉 石块: 直接消失
background.waterNum--;
//鼠标右键被点击改变药水状态
background.waterFlag = true;
line.state = 3;
}
break;
case 2:
if (e.getButton() == 1) {
//点击左键可以进入商店
background.shop = true;
} else if (e.getButton() == 3) {
state = 1;//否则继续运行
background.startTime = System.currentTimeMillis();
}
break;
case 3:
case 4://退出
if (e.getButton() == 1) {
state = 0;
//重置元素
line.reLine();
background.rebg();
}
break;
default:
break;
}
}
});
//重复刷新
while (true) {
repaint();
//判断是否进入下一关
Nextlevel();
//延时
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//下一关
public void Nextlevel() {
//倒计时完成并且在运行状态
if (background.gameTime() && state == 1) {//在游戏运行中在判断下一关
//判断积分大于目标分数 不大于就状态3失败
if (background.total_score > background.goal) {
//过一关目标积分就是在全部积分的基础上+5
//避免分数大于目标分数
background.goal = background.total_score + 5;
//过五关就可以成功了
if (background.level == 2) {
state = 4;//置为成功状态
} else {
//进入下一关之前可以进入商店买药水
state = 2;
//否则关卡++
background.level++;
//获得下一局的开始时间 结束时间是实时的-- 否则就会if判断失败循环进入
//background.startTime = System.currentTimeMillis();
}
}//否则失败
else {
state = 3;
}
dispose();//关闭上个窗体
//重新开一个页面
GameWin gameWin1 = new GameWin();
gameWin1.launch();
}
}
//创建打印方法
@Override
public void paint(Graphics g) {
offScreenImage = this.createImage(768, 1000);
//获得画笔--画背景
Graphics goffScreenImage = offScreenImage.getGraphics();
background.paintSelf(goffScreenImage);//调用bg画图方法
//在运行的时候才会画石头和金块
if (state == 1) {
//增强for来调用金块和石头块对象的画图方法
for (JObject obj : objectArrayList) {
obj.paintSelf(goffScreenImage);
}
line.paintSelf(goffScreenImage);//调用line画图方法
}
//先把东西画到画布上,再把画布画到屏幕上
g.drawImage(offScreenImage, 0, 0, null);
}
public static void main(String[] args) {
GameWin gameWin = new GameWin();
gameWin.launch();//启动窗口
}
}
所有物体的父类
package com.Frame;
import java.awt.*;
/**
* @author 你是大**吗?
* version 1.0
* 金块的父类
*/
@SuppressWarnings({"all"})
public class JObject {
//坐标
int x;
int y;
//宽高
int width;
int height;
//图片
Image image;
//标记物体的状态 false 不可移动 true 可以
boolean flag;
//物体的重量参数
int m;
//不同物体分数情况
int conScore;
//物体状态 1 金块 2 石块
int ObjectState;
public void paintSelf(Graphics g){
g.drawImage(image,x,y,null);
}
public int getWidth() {
return width;
}
//获得矩形方法
public Rectangle GetRect(){
return new Rectangle(x,y,width,height);
}
}
石块类
package com.Frame;
import java.awt.*;
/**
* @author 你是大**吗?
* version 1.0
* 石块类
*/
@SuppressWarnings({"all"})
public class rock extends JObject {
public rock() {
this.x= (int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
this.flag=false;//false就是不能移动
this.m=50;
this.width=71;
this.height=71;
this.conScore=1;//石头积分1分
this.ObjectState=2;
this.image= Toolkit.getDefaultToolkit().getImage("images/rock1.png");
}
}
金块类
package com.Frame;
import java.awt.*;
/**
* @author 你是大**吗?
* version 1.0
*/
public class Gold extends JObject{
public Gold() {
//随机位置 0.9*700 x坐标超不过700 就是合法的
this.x= (int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
this.flag=false;//false就是不能移动
this.m=30;
this.width=52;
this.height=52;
this.conScore=4;
this.ObjectState=1;
this.image= Toolkit.getDefaultToolkit().getImage("images/gold1.gif");
}
}
class GoldMini extends Gold{
public GoldMini() {
this.width=36;
this.height=36;
this.m=15;
this.conScore=2;
this.image= Toolkit.getDefaultToolkit().getImage("images/gold0.gif");
}
}
class GoldPlus extends Gold{
public GoldPlus() {
this.x= (int)(Math.random()*650);
this.width=105;
this.height=105;
this.m=70;
this.conScore=8;
this.image= Toolkit.getDefaultToolkit().getImage("images/gold2.gif");
}
}
线类
package com.Frame;
import java.awt.*;
/**
* @author 你是大**吗?
* version 1.0
*/
@SuppressWarnings({"all"})
public class Line {
//起点坐标
int x = 380;
int y = 180;
//终点坐标
int endx = 500;
int endy = 500;
//设置线长
double length = 100;
double n = 0;//控制角度旋转的系数
int dir = 1;//角度
//线长的最大值和最小值
int MAX_LENGTH = 750;
int MIN_LENGTH = 100;
//线的状态 0 摇摆 1 抓取 2 收回
int state;
//抓取判定
GameWin frame;
//钩爪图片
Image hook = Toolkit.getDefaultToolkit().getImage("images/hook.png");
Line(GameWin frame) {
this.frame = frame;
}
//抓取判断方法
public void logic() {
for (JObject obj : this.frame.objectArrayList) {
//判断这个红线末端在不在这个金块的范围内
if (endx > obj.x && endx < obj.x + obj.width &&
endy > obj.y && endy < obj.y + obj.height) {
//先设置这个物体可以移动
obj.flag = true;
//抓取返回
state = 3;
}
}
}
//根据线的坐标和长度改变endx/y坐标--画线
public void lines(Graphics g) {
endx = (int) (x + length * Math.cos(n * Math.PI));
endy = (int) (y + length * Math.sin(n * Math.PI));
g.setColor(Color.red);
g.drawLine(x - 1, y - 1, endx, endy);
g.drawLine(x, y, endx, endy);
g.drawLine(x + 1, y + 1, endx, endy);
//画钩爪
System.out.println("划线==========");
g.drawImage(hook, endx - 36, endy + 2, null);
}
public void paintSelf(Graphics g) {
//在绘制方法中不停的检测是不是抓取到了
logic();
switch (state) {
case 0://摇摆
if (n < 0.1) {//小于0.1就顺时针转
dir = 1;
} else if (n > 0.9) {//大于0.9就让他逆时针转
dir = -1;
}
n = n + 0.005 * dir;//调节n的值 确保cos()是在0~派之间
lines(g);//调用绘画方法
break;
case 1://延长线段
if (length < MAX_LENGTH) {//小于500可以延长抓取
length = length + 10;
lines(g);//调用绘画方法
} else {
state = 2;
}//大于500了就抓取然后收回
break;
case 2:
if (length > MIN_LENGTH) {//大于100这个基值可以收回
length = length - 10;
lines(g);//调用绘画方法
} else {
state = 0;
}//不大于100就摇摆
break;
case 3://抓取功能
//延时拉取参数
int m = 1;
if (length > MIN_LENGTH) { //大于100这个基值可以收回
length = length - 5;
lines(g);//调用绘画方法
//红线收回 然后某个金块对象跟着移动
for (JObject obj : this.frame.objectArrayList) {
if (obj.flag) {//判断是否拉取
//设置物体重量用来延时
m = obj.m;
//让红线在物体的中间
obj.x = endx - obj.getWidth() / 2;//金块随着红线移动
obj.y = endy;
if (length <= MIN_LENGTH) {
//抓取完成添加积分
this.frame.background.total_score += obj.conScore;
//抓取成功就移除屏幕
obj.x = -150;
obj.y = -150;
//这个物体移动完之后设置为不能移动
obj.flag = false;
//设置为药水不可用 快速拉去完成之后
background.waterFlag = false;
state = 0;//设置为摇摆
}
//判断药水是否被使用
if (background.waterFlag) {
if (obj.ObjectState == 1) {//金块
m = 1;//实现快速拉去、
} else if (obj.ObjectState == 2) {//石块
//抓取成功就移除屏幕
obj.x = -150;
obj.y = -150;
//这个物体移动完之后设置为不能移动
obj.flag = false;
//设置为药水不可用
background.waterFlag = false;
state = 2;//移除石块后变为收线
//抓取完成添加积分
this.frame.background.total_score += obj.conScore;
}
}
}
}
}
try {
//m越重延时时间越长
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
//重置元素
public void reLine(){
//设置线长
length = 100;
n = 0;//控制角度旋转的系数
}
}
背景类
package com.Frame;
import java.awt.*;
/**
* @author 你是大**吗?
* version 1.0
*/
@SuppressWarnings({"all"})
public class background {
public background() {
}
static int waterNum = 3;//药水数量
static int total_score;//总积分
//药水状态 默认F 使用中是TRUE
static boolean waterFlag = false;
//关卡
static int level = 1;
//目标分数]
static int goal = level * 5;
//时间参数
static long startTime;
static long endTime;
//药水价格
static int price=(int)(Math.random()*10);
//设置时候进入商店
static boolean shop=false;
//获得图片
Image bg = Toolkit.getDefaultToolkit().getImage("images/bg.jpg");//背景
Image bg1 = Toolkit.getDefaultToolkit().getImage("images/bg1.jpg");//天空
Image peo = Toolkit.getDefaultToolkit().getImage("images/peo.png");//人物
Image water = Toolkit.getDefaultToolkit().getImage("images/water.png");//药水
public void paintSelf(Graphics g) {//gameWin的paint传过来一个画笔
//背景图片在任何时候都绘制
g.drawImage(bg, 0, 200, null);
g.drawImage(bg1, 0, 0, null);
switch (GameWin.state) {
case 0:
drawWard(g, Color.green, 90, "准备开始", 200, 400);
break;
case 1:
g.drawImage(peo, 310, 50, null);
drawWard(g, Color.black, 30, "积分:" + total_score, 30, 150);
//画药水
g.drawImage(water, 450, 70, null);
//画药水个数
drawWard(g, Color.BLACK, 30, "*" + waterNum, 520, 120);
//关卡数
drawWard(g, Color.BLACK, 20, "第" + level + "关", 30, 60);
//目标积分
drawWard(g, Color.BLACK, 30, "目标积分" + goal, 30, 110);
//获得实时时间
endTime = System.currentTimeMillis();
long time = 20 - (endTime - startTime) / 1000;//获得倒计时 毫秒除以1000等于秒
drawWard(g, Color.BLACK, 30, "倒计时:" + (time > 1 ? time : 0), 520, 150);
break;
case 2:
//画药水
g.drawImage(water, 300, 400, null);
drawWard(g, Color.BLACK, 30, "价格:" +price, 300, 500);
drawWard(g, Color.BLACK, 20, "是否购买?,按左键购买,右键继续游戏" , 200, 550);
if(shop){
total_score=total_score-price;
waterNum++;
shop=false;
GameWin.state=1;//买完之后进入状态1
startTime=System.currentTimeMillis();//重新启动开始时间
}
break;
case 3://失败
drawWard(g, Color.cyan, 90, "失败", 250, 380);
drawWard(g, Color.cyan, 90, "积分:" + total_score, 250, 480);
break;
case 4://成功
drawWard(g, Color.red, 90, "成功", 250, 380);
drawWard(g, Color.red, 90, "积分:" + total_score, 250, 480);
break;
default:
break;
}
}
//t倒计时完成 f未完成
public boolean gameTime() {
long time = (endTime - startTime) / 1000;
if (time > 20) {
return true;
}
return false;
}
//重置元素--开始下一局游戏
public void rebg() {
waterNum = 15;//药水数量
//药水状态 默认F 使用中是TRUE
waterFlag = false;
//关卡
level = 1;
//目标分数
goal = level * 5;
}
//绘制字符串方法
public static void drawWard(Graphics g, Color color, int size, String str, int x, int y) {
g.setColor(color);
g.setFont(new Font("仿宋", Font.BOLD, size));
g.drawString(str, x, y);
}
}