用Java写个小游戏--黄金矿工代码实现

Posted 一只楠喃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Java写个小游戏--黄金矿工代码实现相关的知识,希望对你有一定的参考价值。

项目结构

  • GameWin类,游戏的主类
  • Gold类,金块类
  • Line类,线类
  • Parent类,提取出的父类
  • Sky类,背景类
  • Stone类,石块类

前期准备

需要获取相关的图片,我的图片是获取至爱给网,里面有挺多的素材而且…免费
搭建一个IDEA项目(会Java的都会吧…eclipse也行,反正我用的IDEA)

Stone类

关于石头的相关参数

public class Stone extends Parent
    Stone()
        this.x=(int)(Math.random()*700);
        this.y=(int)(Math.random()*550+300);
        this.w=53;
        this.h=53;
        this.flag=false;
        this.m=150;
        this.money=50;
        this.type=2;
        this.img= Toolkit.getDefaultToolkit().getImage("img/black3.png");
    



Gold类(包含Gold类,GoldMini类,GoldPlus类)

这个类继承我们书写的Parent方法,类中定义金块的相关属性

public class Gold extends Parent 

    Gold()
        this.x=(int)(Math.random()*500);//生成金块的纵坐标
        this.y=(int)(Math.random()*550+300);
        this.w=105;//金块的宽
        this.h=105;//金块的高
        this.flag=false;//是否背勾中了
        this.m=180;//金块的重量
        this.money=200;//金块的价钱
        this.type=1;
        this.img= Toolkit.getDefaultToolkit().getImage("img/gold1.gif");
    

class GoldMini extends Gold
    GoldMini()
        this.w=72;//金块的宽
        this.h=72;//金块的高
        this.m=70;//金块的重量
        this.money=100;//金块的价钱
        this.img= Toolkit.getDefaultToolkit().getImage("img/gold2.gif");
    

class Goldplus extends Gold
    Goldplus()
        this.w=175;//金块的宽
        this.x=(int)(Math.random()*550);
        this.h=175;//金块的高
        this.m=230;//金块的重量
        this.money=500;//金块的价钱
        this.img= Toolkit.getDefaultToolkit().getImage("img/gold11.gif");
    

GameWin类

  • 类中变量
    • state 整个游戏的状态 0未开始 1 运行 2商店 3失败 4胜利
    • image 展示的图片
    • gameTime 倒计时初始时间
    • start 是否开始的判断条件
  • 类中方法
    • launch 窗口事件
    • nextLevel 下一关卡
    • paint 绘制方法(重写方法)
    • main 主方法

代码实现:



public class GameWin extends JFrame 
    static  int state;//整个游戏的状态 0未开始 1 运行 2商店 3失败 4胜利
    Sky sky=new Sky();//背景类
    Line line=new Line(this);//钩子的线类
    Image image;//图片
    public static long gameTime = 30;//倒计时初始时间
    public Thread start;//是否开始
    List<Parent> parentList = new ArrayList<>();//存放父类
    
        boolean isPlace=true;//是否可以放置
        for (int i = 0; i < 7; i++) 

            //生成不同金块
            Double random=Math.random();
            //先存放金块
            Gold gold;
            if (random<0.3)//概率30%以下生成小金块
            
                gold=new GoldMini();
            
            else if (random<0.7)//概率70%以下30%以上生成普通金块
            
                gold=new Gold();
            
            else//其他以下生成大金块
            
                gold=new Goldplus();
            
            //判断是否重叠
            for (Parent parent:parentList)
                if (gold.getRec().intersects(parent.getRec()))
                    isPlace = false;
                
            
            //添加未重叠元素
            if (isPlace)
            
                parentList.add(gold);
            
            else
            
                isPlace=true;i--;
            

        
        //利用for循环来存放石块
        for (int i= 0; i < 3; i++) 
            Stone stone=new Stone();
            for (Parent parent:parentList)
                if (stone.getRec().intersects (parent.getRec()))
                
                    isPlace=false;
                
            
            if (isPlace)
            
                parentList.add(stone);//存储多个石块
            
            else
            
                isPlace=true;
                i--;
            
        

    

    void launch()               //定义窗口事件,无参构造方法
        this.setVisible(true);    //窗口可见
        this.setSize(768, 1000);  //窗口大小
        this.setResizable(false);
        this.setLocationRelativeTo(null);  //窗口位置
        this.setTitle("黄金矿工");   //窗口名称
        setDefaultCloseOperation(EXIT_ON_CLOSE);  //关闭窗口操作
        //在launch中添加鼠标事件
        addMouseListener(new MouseAdapter() 
            @Override
            public void mouseClicked(MouseEvent e) 
                super.mouseClicked(e);
                switch (state)
                    case 0:
                        if (e.getButton()==3)
                            if (start == null)
                                start = new Thread(()->
                                    try 
                                        while (true)
                                            gameTime -= 1;
                                            Thread.sleep(1000);
                                        
                                    catch (Exception ex)
                                        ex.printStackTrace();
                                    
                                );
                                start.start();
                            
                            state=1;
                        
                        break;
                    case 1:

                        if (e.getButton() == 1 && line.state == 0)       //1左键 2滑轮 3右键
                        
                            line.state = 1;
                        
                        //设置右键事件
                        if (e.getButton() == 3 && line.state == 3 ) 
                            if (Sky.yaoBasic > 0)
                                Sky.yaoBasic--;
                                Sky.yaoState = true;
                            
                        ;
                    case 2:
                        if (e.getButton()==1)//是否选择购买药水
                        
                            System.out.println("购买");
                            state=1;
                            sky.shop=true;//调整状态
                        
                        if (e.getButton()==3)//不购买,进入下一个关
                        
                            System.out.println("不购买");
                            state=1;
                            System.currentTimeMillis();
                        
                        break;
                    case 3:
                        //设置重开
                        if (e.getButton()==1)
                            state=0;
                            sky.reGame();
                            line.reGame();
                        
                        break;
                    case 4:
                        //当点击左键时可以重新开始
                        if (e.getButton()==1)
                            state=0;
                            sky.reGame();
                            line.reGame();
                        
                        break;
                    default:
                

            
        );
        //用死循环来实现窗口的重新绘制
        while (true) 
            repaint();
            //调用下一关
            nextLevel();
            //降低刷新率,在循环里面设置
            try 
                Thread.sleep(10);
             catch (InterruptedException e) 
                e.printStackTrace();
            
        
    

    public void nextLevel()  
        if (GameWin.gameTime <= 0)
            System.out.println(sky.total);
            System.out.println(sky.goal);
            if(sky.total>=sky.goal) 
                if (sky.level == 5) 
                    state = 4;
                    System.out.println("通关");
                 else 
                    sky.level++;
                    GameWin.state=2;
                    System.out.println("商店:"+state);
                

            else
                //失败,状态调为失败,展示失败页面
                GameWin.state = 3;
            
            dispose();
            System.out.println(state);
            //刷新窗体
            GameWin.gameTime = 60;
            GameWin gameWin1=new GameWin();
            gameWin1.launch();
        

    

    @Override
    public void paint(Graphics g) 
        image=this.createImage(768,1000);
        //为了放置金块和石块的闪动,先绘制一个窗口
        Graphics grap=image.getGraphics();
        sky.paint(grap);
        if (state==1)
            line.paint(grap);

            //绘制金块
            for (Parent gold : parentList) 
                gold.parin(grap);
            
        
        g.drawImage(image,0,0,null);
    

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

    



Line类

  • 类中变量
    • x 起点的横轴
    • y 起点的纵轴
    • endx 终点的横轴
    • endy 终点的纵轴
    • length 初始绳子长度
    • n 线的角度百分比
    • maxLength 绳子的最长值
    • minLength 绳子的最短值
    • fangxiang 绳子的方向
    • state 绳子的状态 0 最初摇摆状态 1 绳子向下延伸 2 绳子往回拉取 3 绳子抓取到物体
    • gouzi 钩子的图片
  • 类中方法
    • logic 检测钩子是否碰撞物体
    • lines 绘制钩子与绳子
    • paint 主要是绳子状态的完成
    • reGame 重置元素
public class Line 
    int x=380,y=180;//起点坐标
    int endx=500,endy=500;//终点坐标
    //线段长度
    double length=50;
    double n=0;
    double maxLength=750;
    double minLength=50;
    //方向
    int fangxiang=1;
    //状态
    int state=0;
    //爪
    Image gouzi=Toolkit.getDefaultToolkit().getImage("img/gouzi.png");

    GameWin gameWin;
    Line(GameWin gameWin)
        this.gameWin=gameWin;
    
    //
    void logic()
        for (Parent obj:this.gameWin.parentList) 
            if (endx > obj.x && endx < obj.x + obj.w
                    && endy > obj.y && endx < obj.x + obj.h
            ) 
                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.BLACK);
        g.drawLine(x-1, y-1, endx, endy);
        g.drawLine(x+1, y+1, endx, endy);
        g.drawLine(x, y, endx, endy);
        g.drawImage(gouzi,endx-36,endy-2,null);//让钩子在中间
    

    public void paint(Graphics g) 

       logic();
        if (state==0) 
            if (n < 0.1) 
                fangxiang = 1;
             else if (n 以上是关于用Java写个小游戏--黄金矿工代码实现的主要内容,如果未能解决你的问题,请参考以下文章

你知道黄金矿工游戏涉及到了数学知识吗?

C语言项目实战:《黄金矿工》零基础项目,180 行源代码示例

用Java开发童年小游戏

黄金矿工小游戏制作步骤

[Tyvj Aug11] 黄金矿工

重回童年4399| 黄金矿工游戏制作+解析