Java黄金矿工 19.关卡设置

package com.sxt;

import java.awt.*;

public class Bg {        //构造背景类
    //设置积分
    static int count=0;
    //定义关卡数
    static int level=1;
    //定义目标得分
    int goal=level*5;
    //定义药水状态
    static boolean waterFlag=false;
    //定义药水数量
    static int waterNum=3;
    Image bg=Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");  //存入图片进bg
    Image bg1=Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");  //存入图片进bg1
    Image peo=Toolkit.getDefaultToolkit().getImage("imgs/peo.png");   //存入图片进peo
    //添加药水
    Image water=Toolkit.getDefaultToolkit().getImage("imgs/water.png");
    void panintSelf(Graphics g)       //构造paintSelf方法来实现图片的显示,Graphics是画笔,
    {
       g.drawImage(bg,0,200,null);    //绘画出bg
       g.drawImage(bg1,0,0,null);     //绘画出bg1
       g.drawImage(peo,310,50,null);    //绘画出peo
        //绘制药水图片
        g.drawImage(water,450,40,null);
        //打印积分
        drawWord(g,30,Color.black,"积分"+count,30,150);
        drawWord(g,30,Color.black,"*"+waterNum,510,70);
        //绘制关卡数和目标得分
        drawWord(g,30,Color.black,"第"+level+"关",30,60);
        drawWord(g,30,Color.black,"目标得分"+goal,30,110);
    }
    //创建打印字符串的方法
    public static void drawWord(Graphics g,int size,Color color,String str,int x,int y)
    {
        g.setColor(Color.BLACK);
        g.setFont(new Font("仿宋",Font.BOLD,30));
        g.drawString(str,x,y);
    }
}
package com.sxt;

import javax.swing.*;     //导出Jframe类的方法,在继承Jframe类时会自己生成。
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.*;

public class GameWin extends JFrame    //创建GameWin类继承JFrame类,Jframe类本身包含鼠标事件,可以实现点击鼠标按键来不同操作。
{
    //创建数组来存储金块
   List<Object> objectList=new ArrayList<>();
    Bg bg=new Bg();//创建Bg类的bg实例对象
    Line line=new Line(this);    //创建line的实例对象        //接受line中碰撞判断
    Image offScreenImage;      //创建画布


    {
        //判断重叠变量
        boolean isPlace=true;
        //利用for循环来存放金块
        for (int i = 0; i < 10; 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;
                    i--;
                }
            }
            //添加未重叠元素
            if (isPlace=true)
            {
                objectList.add(gold);
            }
            else
            {
                isPlace=true;i--;
            }

        }
        for (int i= 0; i < 3; i++) {
            Rock 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--;
            }
        }

    }
    //新建下一关类
    public void nextLevel()
    {
        if(Bg.count>=bg.goal)
        {
            //关卡数加一
            Bg.level++;
            //释放窗体状态
            dispose();
            //刷新窗体
            GameWin gameWin1=new GameWin();
            gameWin1.launch();
        }

    }

    void launch(){              //定义窗口事件,无参构造方法
        this.setVisible(true);    //窗口可见
        this.setSize(768,1000);  //窗口大小
        this.setLocationRelativeTo(null);  //窗口位置
        this.setTitle("李星沐牌黄金矿工");   //窗口名称
        setDefaultCloseOperation(EXIT_ON_CLOSE);  //关闭窗口操作
        //在launch中添加鼠标事件
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (e.getButton()==1&&line.state==0)       //1左键 2滑轮 3右键
                {
                    line.state=1;
                }
                //设置右键事件
                if (e.getButton()==3&&line.state==3&&Bg.waterNum>0)
                {
                    Bg.waterNum--;
                    bg.waterFlag=true;
                }
            }
        });
        //用死循环来实现窗口的重新绘制
        while (true)
        {
           repaint();
           //调用下一关
            nextLevel();
            //降低刷新率,在循环里面设置
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void paint(Graphics g)            //构造paint方法实现BG中的paintSelf方法
    {
        //创建画布窗口
        offScreenImage=this.createImage(768,1000);
        //传入画笔来让他可以绘制东西
        Graphics gImage=offScreenImage.getGraphics();

        bg.panintSelf(gImage);

        //用for来遍历元素
        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();     //在主函数里引用launch方法来实现窗口出现。
        gameWin.launch();
    }
}

package com.sxt;

import java.awt.*;

//创建Object类来存放金块和石块的相同属性
public class Gold extends Object{
    Gold()
    {
        //坐标
        this.x=(int)(Math.random()*700);
        this.y=(int)(Math.random()*550+300);
        //宽高
        this.width=52;
        this.height=52;
        //设置标记
        this.flag=false;
        //设置质量
        this.m=30;
        this.count=4;
        this.type=1;
        //图片
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold1.gif");
    }
}
//生成小金块,重置参数
class GoldMini extends Gold
{
    GoldMini()
    {
        this.width=36;
        this.height=36;
        this.m=15;
        this.count=2;
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold0.gif");
    }
}
//生成小金块,重置参数
class GoldPlus extends Gold
{
    GoldPlus()
    {
        //重置x
        this.x=(int)(Math.random()*650);
        this.width=105;
        this.height=105;
        this.m=15;
        this.count=8;
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold2.gif");
    }
}



package com.sxt;

import java.awt.*;

//创建Object类来存放金块和石块的相同属性
public class Object
{
    //坐标
    int x;
    int y;
    //宽高
    int width;
    int height;
    //图片
    Image img;
    //创建标记flag用于修改BUG金块同时消失
    boolean flag;
    //质量
    int m;
    //定义绘制方法
    //定义积分
    int count;
    //定义类型
    int type;
    void paintSelf(Graphics g)
    {
        g.drawImage(img,x,y,null);
    }
    //用Getter方法来获取宽度


    public int getWidth() {
        return width;
    }

    //获取矩形
    public Rectangle getRec(){
        return new Rectangle(x,y,width,height);
    }
}
package com.sxt;

import java.awt.*;

public class Line {
    //起点坐标,保证线左右摇摆时起点不变,仅是终点坐标改变
    int x=380;
    int y=180;
    //终点坐标
    int endx=500;
    int endy=500;
    //定义线长length,角度n,方向dir
    double length=100;
    //定义线最大值
    double MAX_length=750;
    //定义线最小值
    double MIX_length=100;
    double n=0;
    int dir=1;
    //定义状态 0摇摆 1延长 2收回 3抓取放回
    int state;
    //添加钩爪
    Image hook=Toolkit.getDefaultToolkit().getImage("imgs/hook.png");
    //用有参构造方法来接收窗口GameWin中元素
    GameWin frame;
    Line(GameWin frame)
    {
        this.frame=frame;
    }

    //设置碰撞判断
    void logic()
    {
        //用for来遍历元素
        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;
                //碰撞后flag标记改变
                obj.flag=true;
        }

        }
    }
    //定义lines来放置重复代码
    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语句来判断状态
        switch (state)
        {
            case 0:
                if (n<0.1){dir=1;}
            else if (n>0.9){dir=-1;}
                //让n变化来实现线的移动,同时线的终点坐标也要发生变化
                n=n+0.005*dir;
                lines(g);
                break;
            case 1:
                //实现线的延长
                if (length<MAX_length)
                {
                    length=length+5;
                    lines(g);
                }
                else
                {
                   state=2;         //线实现延长,返回状态2来减短
                }
                break;
            case 2:
                if (length>MIX_length)
                {
                    length=length-5;
                    lines(g);
                }
                else
                {
                    state=0;      //线变短后要变回摇摆状态;
                }
                break;
                //实现抓取放回,线返回,金块也要接着放回
            case 3:
                //创建临时变量m
                int m=1;
                if (length>MIX_length)
                {
                    length=length-5;
                    lines(g);
                    for (Object obj:this.frame.objectList)
                    {
                        //加入flag为true,则返回,flase不返回
                        if (obj.flag)
                        {

                            //传入质量
                            m=obj.m;
                            obj.x=endx-obj.getWidth()/2;      //金块要随着线返回  //获取宽度
                            obj.y=endy;
                            if (length<=MIX_length)
                            {

                                //金块返回后要消失
                                obj.x=-150;      //金块要随着线返回
                                obj.y=-150;
                                state=0;      //线变短后要变回摇摆状态;
                                //再改变flag标记
                                obj.flag=false;
                                Bg.waterFlag=false;
                                Bg.count+=obj.count;
                                state=0;
                            }
                            //使用药水
                            if (Bg.waterFlag)
                            {
                                if (obj.type==1)
                                {
                                    m=1;
                                }
                                if (obj.type==2)
                                {
                                    //金块返回后要消失
                                    obj.x=-150;      //金块要随着线返回
                                    obj.y=-150;
                                    obj.flag=false;
                                    Bg.waterFlag=false;
                                    state=2;      //线变短后要变回摇摆状态;
                                    //再改变flag标记
                                }
                            }
                        }

                    }


                }
                //用质量来判断刷新率
                try {
                    Thread.sleep(m);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;

            default:

        }
        //判断方向,让它一只在1,2,象限移动

    }
}
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.img= Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值