Java实现黄金矿工小游戏

目录

一.游戏视频

二.游戏代码

1.Bg

2.GameWin

3.Gold.java

Gold

GoldMini

GoldPlus

4.Line

5.Object

6.Rock

三.图片素材


一.游戏视频

黄金矿工小游戏

二.游戏代码

1.Bg

package com.sxt;

import java.awt.*;

public class Bg {

    //关卡数
    static int level = 1;
    //目标得分
    int goal = level*15;
    //总分
    static int count=0;
    //药水数量
    static int waterNum = 3;
    //药水状态,默认F,T 正在使用 F 无法使用
    static boolean waterFlag = false;
    //开始时间
    long startTime;
    //结束时间
    long endTime;
    //药水价格
    int price = (int) (Math.random()*10);
    //是否进入商店 f 不购买
    boolean shop = false;

    //载入图片
    Image bg = Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
    Image bg1 = Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");
    Image peo = Toolkit.getDefaultToolkit().getImage("imgs/peo.png");
    Image water = Toolkit.getDefaultToolkit().getImage("imgs/water.png");

    //绘制
    void paintSelf(Graphics g){
        g.drawImage(bg1,0,0,null);
        g.drawImage(bg,0,200,null);
        switch (GameWin.state){
            case 0:
                drawWord(g,80,Color.green,"准备开始",200,400);
                break;
            case 1:
                g.drawImage(peo,310,50,null);
                drawWord(g,30,Color.black,"积分:"+count,30,150);
                //药水组件
                g.drawImage(water,450,40,null);
                drawWord(g,30,Color.black,"*"+waterNum,510,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(water,300,400,null);
                drawWord(g,30,Color.black,"价格:"+price,300,500);
                drawWord(g,30,Color.black,"是否购买?",300,550);
                if(shop){
                    count = count-price;
                    waterNum++;
                    shop=false;
                    GameWin.state=1;
                    startTime=System.currentTimeMillis();
                }
                break;
            case 3:
                drawWord(g,80,Color.cyan,"失败",250,350);
                drawWord(g,80,Color.cyan,"积分:"+count,200,450);
                break;
            case 4:
                drawWord(g,80,Color.red,"成功",250,350);
                drawWord(g,80,Color.red,"积分:"+count,200,450);
                break;
            default:
        }


    }
    //t倒计时完成 f正在倒计时
    boolean gameTime(){
        long tim = (endTime-startTime)/1000;
        if(tim>20){return true;}
        return false;

    }

    //重置元素
    void reGame(){
        //关卡数
        level = 1;
        //目标得分
        goal = level*15;
        //总分
        count=0;
        //药水数量
        waterNum = 3;
        //药水状态,默认F,T 正在使用 F 无法使用
        waterFlag = false;
    }
    //绘制字符串
    public static void drawWord(Graphics g,int size,Color color,String str,int x,int y){
        g.setColor(color);
        g.setFont(new Font("仿宋",Font.BOLD,size));
        g.drawString(str,x,y);
    }
}

2.GameWin

package com.sxt;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

public class GameWin extends JFrame {

    //0未开始 1 运行中 2 商店 3 失败 4 胜利
    static int state;
    //存储金块,石块
    List<Object> objectList = new ArrayList<>();
    Bg bg = new Bg();
    Line line = new Line(this);
    {
        //是否可以放置
        boolean isPlace = true;
        for (int i = 0; i < 11; i++) {
            double random =Math.random();
            Gold gold;//存放当前生成的金块
            if(random<0.3){gold = new GoldMini();}
            else if(random<0.7){ gold = new Gold();}
            else { gold = new GoldPlus();}

            for(Object obj:objectList){
                if(gold.getRec().intersects(obj.getRec())){
                    //不可放置,需要重新生成
                    isPlace=false;
                }
            }
            if(isPlace){objectList.add(gold);}
            else {isPlace=true;i--;}
        }
        for (int i = 0; i < 5; i++) {
            Rock rock=new Rock();
            for(Object obj:objectList){
                if(rock.getRec().intersects (obj.getRec()))
                { isPlace=false; }
            }
            if(isPlace){ objectList.add(rock); }
            else{isPlace=true;i--;}
        }
    }
    //缓存画布
    Image offScreenImage;
    //窗口设置
    void launch(){
        this.setVisible(true);
        this.setSize(768,1000);
        this.setLocationRelativeTo(null);
        this.setTitle("尚学堂黄金矿工");
        this.setDefaultCloseOperation(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;
                            bg.startTime = System.currentTimeMillis();
                        }
                        break;
                    case 1:
                        //左右摇摆,点击左键
                        if(e.getButton()==1&&line.state==0)
                        {line.state=1;}
                        //抓取返回,点击右键
                        if(e.getButton()==3&&line.state==3&&Bg.waterNum>0){
                            Bg.waterFlag=true;
                            Bg.waterNum--;
                        }
                        break;
                    case 2:
                        if(e.getButton()==1){
                            bg.shop=true;
                        }
                        if (e.getButton()==3){
                            state=1;
                            bg.startTime = System.currentTimeMillis();
                        }
                        break;
                    case 3:
                    case 4:
                        if(e.getButton()==1){
                            state=0;
                            bg.reGame();
                            line.reGame();
                        }
                        break;
                    default:
                }

            }
        });

        while (true){
            repaint();
            nextLevel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //下一关
    public void nextLevel(){
        if(bg.gameTime() && state==1){
            if(Bg.count >= bg.goal)
            {
                if(Bg.level==5) {
                    state=4;
                }
                else {
                    state = 2;
                    Bg.level++;
                }
            }else {state=3;}
            dispose();
            GameWin gameWin1 = new GameWin();
            gameWin1.launch();
        }

    }

    @Override
    public void paint(Graphics g) {
        offScreenImage = this.createImage(768,1000);
        Graphics gImage = offScreenImage.getGraphics();

        bg.paintSelf(gImage);
        if(state==1){
            //绘制物体
            for(Object obj:objectList)
            {
                obj.paintSelf(gImage);
            }
            line.paintSelf(gImage);
        }
        g.drawImage(offScreenImage,0,0,null);
    }

    public static void main(String[] args) {
        GameWin gameWin=new GameWin();
        gameWin.launch();
    }
}

3.Gold.java

Gold

GoldMini

GoldPlus

package com.sxt;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

public class GameWin extends JFrame {

    //0未开始 1 运行中 2 商店 3 失败 4 胜利
    static int state;
    //存储金块,石块
    List<Object> objectList = new ArrayList<>();
    Bg bg = new Bg();
    Line line = new Line(this);
    {
        //是否可以放置
        boolean isPlace = true;
        for (int i = 0; i < 11; i++) {
            double random =Math.random();
            Gold gold;//存放当前生成的金块
            if(random<0.3){gold = new GoldMini();}
            else if(random<0.7){ gold = new Gold();}
            else { gold = new GoldPlus();}

            for(Object obj:objectList){
                if(gold.getRec().intersects(obj.getRec())){
                    //不可放置,需要重新生成
                    isPlace=false;
                }
            }
            if(isPlace){objectList.add(gold);}
            else {isPlace=true;i--;}
        }
        for (int i = 0; i < 5; i++) {
            Rock rock=new Rock();
            for(Object obj:objectList){
                if(rock.getRec().intersects (obj.getRec()))
                { isPlace=false; }
            }
            if(isPlace){ objectList.add(rock); }
            else{isPlace=true;i--;}
        }
    }
    //缓存画布
    Image offScreenImage;
    //窗口设置
    void launch(){
        this.setVisible(true);
        this.setSize(768,1000);
        this.setLocationRelativeTo(null);
        this.setTitle("尚学堂黄金矿工");
        this.setDefaultCloseOperation(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;
                            bg.startTime = System.currentTimeMillis();
                        }
                        break;
                    case 1:
                        //左右摇摆,点击左键
                        if(e.getButton()==1&&line.state==0)
                        {line.state=1;}
                        //抓取返回,点击右键
                        if(e.getButton()==3&&line.state==3&&Bg.waterNum>0){
                            Bg.waterFlag=true;
                            Bg.waterNum--;
                        }
                        break;
                    case 2:
                        if(e.getButton()==1){
                            bg.shop=true;
                        }
                        if (e.getButton()==3){
                            state=1;
                            bg.startTime = System.currentTimeMillis();
                        }
                        break;
                    case 3:
                    case 4:
                        if(e.getButton()==1){
                            state=0;
                            bg.reGame();
                            line.reGame();
                        }
                        break;
                    default:
                }

            }
        });

        while (true){
            repaint();
            nextLevel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //下一关
    public void nextLevel(){
        if(bg.gameTime() && state==1){
            if(Bg.count >= bg.goal)
            {
                if(Bg.level==5) {
                    state=4;
                }
                else {
                    state = 2;
                    Bg.level++;
                }
            }else {state=3;}
            dispose();
            GameWin gameWin1 = new GameWin();
            gameWin1.launch();
        }

    }

    @Override
    public void paint(Graphics g) {
        offScreenImage = this.createImage(768,1000);
        Graphics gImage = offScreenImage.getGraphics();

        bg.paintSelf(gImage);
        if(state==1){
            //绘制物体
            for(Object obj:objectList)
            {
                obj.paintSelf(gImage);
            }
            line.paintSelf(gImage);
        }
        g.drawImage(offScreenImage,0,0,null);
    }

    public static void main(String[] args) {
        GameWin gameWin=new GameWin();
        gameWin.launch();
    }
}

4.Line

package com.sxt;

import java.awt.*;

public class Line {
    //起点坐标
    int x=380;
    int y=180;
    //终点坐标
    int endx=500;
    int endy=500;
    //线长
    double length = 100;
    //线长最小值
    double MIN_length = 100;
    //线长最大值
    double MAX_length = 750;
    //角度百分比
    double n = 0;
    //方向
    int dir = 1;
    //状态 0 摇摆 1 抓取 2 收回 3 抓取返回
    int state;
    //钩爪图片
    Image hook = Toolkit.getDefaultToolkit().getImage("imgs/hook.png");

    GameWin frame;

    Line(GameWin frame){this.frame=frame;}

    //碰撞检测,检测物体是否被抓取
    void logic(){
        for(Object obj:this.frame.objectList){
            if(endx>obj.x && endx<obj.x+obj.width
                    && endy>obj.y && endy< obj.y+obj.height){
                state=3;
                obj.flag=true;
            }
        }

    }
    //绘制方法
    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,endx-1,endy);
        g.drawLine(x,y,endx,endy);
        g.drawLine(x+1,y,endx+1,endy);
        g.drawImage(hook,endx-36,endy-2,null);
    }


    void paintSelf(Graphics g){
        logic();
        switch (state){
            case 0:
                if(n<0.1){ dir = 1;}
                else if (n>0.9){dir = -1;}
                n=n+0.005*dir;
                lines(g);
                break;
            case 1:
                if(length<=MAX_length){
                    length=length+5;
                    lines(g);
                }else {state=2;}
                break;
            case 2:
                if(length>=MIN_length){
                    length=length-5;
                    lines(g);
                }else {
                    state=0;
                }
                break;
            case 3://抓取返回
                int m=1;
                if(length>=MIN_length){
                    length=length-5;
                    lines(g);
                    for(Object obj:this.frame.objectList){
                        if(obj.flag){
                            m=obj.m;
                            obj.x=endx-obj.getWidth()/2;
                            obj.y=endy;
                            if(length<=MIN_length){
                                obj.x=-150;
                                obj.y=-150;
                                obj.flag=false;
                                //加分
                                Bg.count+=obj.count;
                                Bg.waterFlag=false;
                                state=0;
                            }
                            if(Bg.waterFlag){
                                if(obj.type==1){
                                    //金块
                                    m=1;
                                }else if(obj.type==2){
                                    //石块
                                    obj.x=-150;
                                    obj.y=-150;
                                    obj.flag=false;
                                    Bg.waterFlag=false;
                                    state=2;
                                }
                            }
                        }
                    }
                }
                try {
                    Thread.sleep(m);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;

            default:
        }
    }
    //重置线
    void reGame(){
        n=0;
        length=100;
    }
}

5.Object

package com.sxt;

import java.awt.*;

public class Object {
    //坐标
    int x;
    int y;
    //宽高
    int width;
    int height;
    //图片
    Image img;
    //标记,是否能移动
    boolean flag;
    //质量
    int m;
    //积分
    int count;
    //标记 1为金块,2为石块
    int type;

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

    public int getWidth() {
        return width;
    }
    //获取矩形
    public Rectangle getRec(){
        return new Rectangle(x,y,width,height);
    }
}

6.Rock

package com.sxt;

import java.awt.*;

public class Rock extends Object {
    Rock(){
        this.x=(int)(Math.random()*700);
        this.y=(int)(Math.random()*550+300);
        this.width=71;
        this.height=71;
        this.flag=false;
        this.m=50;
        this.count=1;
        this.type=2;
        this.img = Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
    }
}

三.图片素材

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一吨土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值