Java黄金矿工 25.商店购物

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类本身包含鼠标事件,可以实现点击鼠标按键来不同操作。
{
    //定义游戏状态 0未开始 1运行中 2商店 3失败 4胜利
    static int state;
    //创建数组来存储金块
   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.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();
        }


    }

    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);
                switch (state)
                {
                    case 0:
                        if (e.getButton()==3)
                        {
                            state=1;
                            //设置开始时间
                            bg.stareTime=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&&Bg.waterNum>0)
                        {
                            Bg.waterNum--;
                            bg.waterFlag=true;
                        }
                        break;
                    case 2:
                        if (e.getButton()==1)
                        {
                            bg.shop=true;
                        }
                        if (e.getButton()==3)
                        {
                            state=1;
                            System.currentTimeMillis();
                        }
                        break;
                    case 3:break;
                    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();
            }
        }

    }

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

        bg.panintSelf(gImage);
        if (state==1)
        {
//用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,象限移动

    }
    //重置元素
    void reGame()
    {
        n=0;
        length=100;
    }
}
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.type=2;
        //设置质量
        this.m=50;
        this.count=1;
        //图片
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
    }
}
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;
    //定义开始时间和结束时间
    long stareTime;
    long endTime;
    //定义药水价格和是否购买
    int price= (int) (Math.random()*10);
    boolean shop=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
        switch (GameWin.state)
        {
            case 0:
                drawWord(g,100,Color.black,"准备开始,请按右键",200,400);
                break;
            case 1:
                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);
                //设置结束时间
                endTime=System.currentTimeMillis();
                //计算时间
                long tim=20-(endTime-stareTime)/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,550);
                //是否购买
                drawWord(g,30,Color.black,"是否购买",300,400);
                if (shop)
                {
                    count=count-price;
                    waterNum++;
                    shop=false;
                    GameWin.state=1;
                    System.currentTimeMillis();

                }
                break;
            case 3:
                drawWord(g,80,Color.black,"游戏积分",300,500);
                drawWord(g,80,Color.black,"得分"+count,300,550);
                break;
            case 4:
                drawWord(g,80,Color.black,"游戏成功",250,350);
                drawWord(g,80,Color.black,"得分"+count,200,450);
                break;
            default:
        }

    }


    //游戏时间判断
    boolean gameTime()
    {
        long tim=(endTime-stareTime)/1000;
        if (tim>20){return true;}
        else {return false;}
    }
    //创建打印字符串的方法
    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);
    }
    //重置元素
    void reGame()
    {
        //设置积分
        count=0;
        //定义关卡数
        level=1;
        //定义目标得分
        goal=level*5;
        //定义药水状态
         waterFlag=false;
        //定义开始时间和结束时间
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值