Java实现接月饼小游戏的示例代码
作者:小虚竹and掘金 发布时间:2022-08-16 03:26:06
标签:Java,接月饼,游戏
前言
《接月饼小游戏》是一个基于java的自制游戏,不要被月亮砸到,尽可能地多接月饼。
此小项目可用来巩固JAVA基础语法,swing的技巧用法。
主要设计
设计游戏界面,用swing实现
设计背景
设计得分物体-月饼,碰到加一分
设计障碍物-月亮,碰到会死亡
监听鼠标的左右键,用来控制篮子左右移动
设计积分系统
将resource文件夹设为resource(Project Manage中可以设置),因为要用里面的图片
功能截图
游戏开始界面:
代码实现
游戏启动类
public class Start {
public static void main(String[] args) throws URISyntaxException {
new EatGame();
}
}
核心类
public class EatGame extends JFrame implements ActionListener, MouseListener
{
private final int WIDTH = 400;
private final int HEIGHT = 800;
private int score;
private int ticks;
private boolean gameOver = false;
private GameControl control;
private List<Moon> moons;
private List<Cake> cakes;
private Timer timer;
private ChangeE changeE;
/**
* Constructor for objects of class FallingGame
*/
public EatGame() throws URISyntaxException {
changeE = new ChangeE(150, 650, "player.jpg", WIDTH);
moons = new ArrayList<>();
cakes = new ArrayList<>();
addMoonAndCake();
control = new GameControl(changeE, moons, cakes);
timer = new Timer(20, this);
//add keybinds
control.addAction("Left", -20, KeyEvent.VK_LEFT);
control.addAction("Right", 20, KeyEvent.VK_RIGHT);
//add components
add(control);
addMouseListener(this);
control.addMouseListener(this);
setTitle("吃月饼");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(WIDTH, HEIGHT);
setResizable(false);
setVisible(true);
timer.start();
}
/**
* 添加月亮和月饼
*/
public void addMoonAndCake() {
Random r = new Random();
int x, y;
x = 60 + (r.nextInt(35) * 2);
y = r.nextInt(20) + moons.size() * 30;
Moon moon1 = new Moon(x, y, "moon.png");
moons.add(moon1);
x = 190 + r.nextInt(35) * 2;
y = r.nextInt(20) + moons.size() * 30;
Moon moon2 = new Moon(x, y, "moon.png");
moons.add(moon2);
x = 80 + (r.nextInt(35) * 2);
y = r.nextInt(20) + moons.size() * 50;
Cake cake = new Cake(x, y, "cake.png");
cakes.add(cake);
}
/**
* 更新窗口
*/
private void updateFrame() {
ticks++;
for(int i = 0; i < moons.size(); i++)
{
Moon moon = moons.get(i);
if(ticks % 25 == 0 && moon.getSpeed() < 10)
{
moon.setSpeed(moon.getSpeed() + 2);
}
}
Iterator<Moon> moonIterator = moons.iterator();
while (moonIterator.hasNext()) {
Moon moon = moonIterator.next();
// 超出屏幕
if(moon.getY() > HEIGHT) {
moonIterator.remove();
} else
moon.move();
}
Iterator<Cake> cakeIterator = cakes.iterator();
while (cakeIterator.hasNext()) {
Cake cake = cakeIterator.next();
// 超出屏幕
if(cake.getY() > HEIGHT) {
cakeIterator.remove();
} else
cake.move();
}
if(moons.size() == 0) {
addMoonAndCake();
}
}
private boolean checkCollision() {
Rectangle rectangle = (Rectangle) changeE.getShape();
for(Moon moon : moons) {
Ellipse2D circle = (Ellipse2D) moon.getShape();
// 判断是否与圆形相撞
if (circle.intersects(rectangle)) {
gameOver = true;
}
}
Iterator<Cake> cakeIterator = cakes.iterator();
while (cakeIterator.hasNext()) {
Cake cake = cakeIterator.next();
Ellipse2D circle = (Ellipse2D) cake.getShape();
if (circle.intersects(rectangle)) {
score ++; // 得分
cakeIterator.remove();
}
}
return gameOver;
}
public void actionPerformed(ActionEvent e)
{
if(gameOver) {
timer.stop();
control.drawEnd(control.getGraphics(), score);
} else {
//continue with game
updateFrame();
checkCollision();
control.repaint();
}
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e)
{
if(gameOver)
{
//reset game
moons.clear();
control.removeAll();
control.updateUI();
score = 0;
changeE.setX(150);
changeE.setY(650);
addMoonAndCake();
timer.start();
repaint();
gameOver = false;
}
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
}
画面绘制
/**
* 画面绘制
*/
public class GameControl extends JPanel
{
private InputMap inputMap;
private ChangeE myChangeE;
private List<Moon> moons;
private List<Cake> cakes;
public GameControl(ChangeE changeE, List<Moon> moons, List<Cake> cakes)
{
this.myChangeE = changeE;
this.moons = moons;
this.cakes = cakes;
setBackground(Color.white);
inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
// 绘制背景
ImageIcon icon=new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("background.png"));
Image img=icon.getImage();
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
// 绘制玩家
g.drawImage(myChangeE.getImage(), myChangeE.getX(), myChangeE.getY(), this);
// 绘制月亮
for(Moon moon : moons) {
g.drawImage(moon.getImage(), moon.getX(), moon.getY(), this);
}
// 绘制月饼
for (Cake cake : cakes) {
g.drawImage(cake.getImage(), cake.getX(), cake.getY(), this);
}
}
public void drawEnd(Graphics g, int score)
{
g.setColor(Color.WHITE);
g.fillRect(50, 200, 300, 300);
g.setColor(Color.RED);
g.drawString("祝你中秋快乐,阖家欢乐!", 100, 300);
g.setColor(Color.BLUE);
g.drawString("您吃的到的月饼个数为:" + score, 100, 350);
g.setColor(Color.BLACK);
g.drawString("鼠标点击重玩", 100, 400);
}
public void addAction(String name, int deltaX, int keyCode) {
MoveAction moveAction = new MoveAction(name, deltaX);
inputMap.put(KeyStroke.getKeyStroke(keyCode, 0), name);
getActionMap().put(name, moveAction);
}
private class MoveAction extends AbstractAction implements ActionListener {
private int myDeltaX;
public MoveAction(String name, int deltaX) {
super(name);
myDeltaX = deltaX;
}
public void actionPerformed(ActionEvent e) {
myChangeE.move(myDeltaX);
}
}
}
来源:https://juejin.cn/post/7069561982747148318


猜你喜欢
- Android中处理图像是一件很常见的事情,这里记录备忘一些亲身使用过的处理图片数据的方法。转为BitmapRGB值转Bitmappriva
- 前言:在 Java 中,常用的锁有两种:synchronized(内置锁)和 ReentrantLock(可重入锁),二者的功效都是相同得,
- final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。 通常final定义的变量为常量。如:final double
- Java API不能远程访问HBase今天我在虚拟机里面安装了Hbase 1.2.4,说在windows上Java API调用访问下玩玩,结
- 1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttr
- Java反射机制一、什么是反射机制 简单的来
- 前言本文是精讲RestTemplate第8篇,前篇的blog访问地址如下:RestTemplate在Spring或非Spring环境下使用精
- 前几天在琢磨mybatis xml热加载的问题,原理还是通过定时扫描xml文件去跟新,但放到项目上就各种问题,由于用了mybatisplus
- 封装(Encapsulation)是面向对象编程的一个核心概念,它意味着将数据(属性)和方法(操作数据的函数)捆绑在一起,形成一个类(Cla
- 最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动。下面通过此图给大家展示下效果,可能比文字描述
- 之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Sp
- /* - - - - - - - - - 
- 前言大家应该都知道,在Android中,我们对于View进行模拟点击事件,很容易,比如调用View.performClick即可。但是有些时
- Java中的Runnable,Callable,Future,FutureTask的比较Java中存在Runnable、Callable、F
- 本文实例为大家分享了Java Web实现简易图书管理系统的具体代码,供大家参考,具体内容如下前言首先实现的是用户的登录注册,注册成功后自动跳
- android root权限破解分析许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权
- 这里直接给出C#类成员一般初始化顺序:子类静态字段子类静态构造子类实例字段父类静态字段父类静态构造父类实例字段父类实例构造子类实例构造为什么
- 一:item的根布局设置Android:clickable="true",之后导致item点击事件失效,对根
- 废话不多说了,直接给大家贴代码,具体代码如下所示://菜单树形结构 public JSONArray treeMenuList(JSONAr
- Mybatis-plus官网地址:https://baomidou.com/配置mysql在配置文件连接mysqlspring.dataso