JAVA编程实战之编写小游戏-大球吃小球(eat ball game)

游戏界面:

点击火箭开始游戏

点击Exit退出游戏

左上角显示当前成绩和历史最高分

退出自动保存最高成绩

1240
1240

代码获取

扫码关注微信公众号【程序猿声】
webp
在后台回复【EBG】不包括【】即可获取。

玩法:

玩家通过鼠标控制小球所处位置

进度条缓慢减少,吃小球进度条增加

吃到黄球玩家变回初始大小

吃药进度条大幅增加,吃到炸弹游戏结束

难度等级每十份增加一级

1240

1240

项目包含文件:

Circle.java

GUI.java

Game.java

MyUtils.java

PaintPanel.java

PlayerCircle.java

ProgressUI.java

代码解析:

Circle.java

该文件定义了一个Circle类,用以生成每个球的对象。

属性有圆的半径、x坐标、y坐标、x方向的偏移量、y方向的偏移量、id。

方法有移动和获取每个属性的接口


package com.hust.game;
import java.awt.*;
import java.util.Random;
public class Circle {
    protected int radius,x,y,dx,dy;
    private int id;
    protected GUI gui;
    String color;
    public Circle(int X,int Y,int R,int id,String color,GUI gui,int dx,int dy){
        x = X;
        y = Y;
        radius = R;
        Random random = new Random();
        this.dx = random.nextBoolean() ? dx : -dx;
        this.dy = random.nextBoolean() ? dy : -dy;
        this.gui = gui;
        this.id = id;
        this.color = color;
        draw();
    }
    public Circle(int X,int Y,int R,int id,String color,GUI gui){
        x = X;
        y = Y;
        radius = R;
        this.gui = gui;
        this.id = id;
        this.color = color;
    }
    public void draw(){
        gui.updateCircle(this);
    }
    public void move(){
//        clearcircle()
        x += dx;
        y += dy;
        if(x + radius > gui.graphWidth || x - radius < 0){
            dx = -dx;
        }
        if(y + radius > gui.graphHeight || y - radius < GUI.PROGRESSWIDTH){
            dy = -dy;
        }
        draw();
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public int getR(){
        return radius;
    }
    public int getD(){
        return radius << 1;
    }
    public int getID(){
        return id;
    }
}

PlayerCircle.java

该文件是用户控制的小球类。继承于Circle类,重构了移动的方法,由自动移动改为获取鼠标坐标,使用户可以通过鼠标控制小球。另外新增了Max属性用以限制用户小球的大小,避免发生小球过大以至于没有威胁的情况,增强可玩性。


package com.hust.game;
public class PlayerCircle extends Circle{
    private int Max;
    public PlayerCircle(int X,int Y,int R,int id,String color,GUI gui,int Maxsize){
        super(X,Y,R,id,color,gui);
        Max = Maxsize;
        draw();
    }
    public void resize(int plusSize){
        if(radius < Max){
            radius += plusSize;
            draw();
        }
    }
    public void move(){
//        clearcircle
        x = gui.mouseX;
        y = gui.mouseY;
        draw();
    }
    public int getMax(){
        return Max;
    }    
}

GUI.java

该文件是整个游戏的界面,主要功能有:游戏界面的设置、球的绘制、成绩显示等等一且UI控件的显示和设计。


package com.hust.game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

public class GUI {

    public final int graphWidth;
    public final int graphHeight;
    public final int STARTX = 180;
    public final int STARTY = 500;
    public final int buttonwidth = 100;
    public final int buttonheight = 60;
    public final int EXITX  = 330;
    public final int EXITY  = 500;
    public static final int PROGRESSWIDTH = 40;
    public static final int BOTTOM = 70;

    public int mouseX;
    public int mouseY;
    public Circle[] willPaint = new Circle[Game.CIRCLECOUNT+3];
    public PaintPanel conn = new PaintPanel(willPaint,"paintPanel");
    public JFrame jf;
    public JButton start;
    public JButton exit;
    public JLabel currentScoreLabel;
    public JLabel maxScoreLabel;
    public JLabel gameLevelLabel;
    public JLabel eatYourBalls;
    public ProgressUI jProBar;
    public GUI(){
        jf = new JFrame("Big ball eat Small ball");
        Toolkit kit = Toolkit.getDefaultToolkit();
        graphWidth = kit.getScreenSize().width;
        graphHeight = kit.getScreenSize().height-BOTTOM;
        
        jf.setBounds(graphWidth/2-300, graphHeight/2-400, 600, 800);

        jf.setLayout(null);
        jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        conn.setLayout(null);
        start = new JButton();
        start.setBounds(STARTX,STARTY,64,64);
        exit = new JButton();
        exit.setBounds(EXITX,EXITY,64,64);
        
        start.setIcon(new ImageIcon("./res/start.png"));
        start.setMargin(new Insets(0,0,0,0));//将边框外的上下左右空间设置为0  
        start.setIconTextGap(0);//将标签中显示的文本和图标之间的间隔量设置为0  
        start.setBorderPainted(false);//不打印边框  
        start.setBorder(null);//除去边框  
        start.setFocusPainted(false);//除去焦点的框  
        start.setContentAreaFilled(false);//除去默认的背景填充 
        
  
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值