黄金矿工~java小游戏【内含源码】

前言

🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🎉推荐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);


    }

}

  • 21
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值