游戏界面:
点击火箭开始游戏
点击Exit退出游戏
左上角显示当前成绩和历史最高分
退出自动保存最高成绩
代码获取
扫码关注微信公众号【程序猿声】
在后台回复【EBG】不包括【】即可获取。
玩法:
玩家通过鼠标控制小球所处位置
进度条缓慢减少,吃小球进度条增加
吃到黄球玩家变回初始大小
吃药进度条大幅增加,吃到炸弹游戏结束
难度等级每十份增加一级
项目包含文件:
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);//除去默认的背景填充