JAVA弹球小游戏

Java入门小游戏之一:弹球游戏

运行结果

请添加图片描述
请添加图片描述
源代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main {
    // 创建窗口对象
    private Frame frame = new Frame("弹球游戏");

    // 桌面宽度
    private final int TABLE_WIDTH = 300;
    // 桌面高度
    private final int TABLE_HEIGHT = 400;

    // 球拍的高度和宽度
    private final int RACKET_WIDTH = 60;
    private final int RACKET_HEIGHT = 20;

    // 小球的大小
    private final int Ball_SIZE = 16;  // 这个是直径的大小

    // 定义变量 记录小球的坐标
    private int ballX = 120;
    private int ballY = 20;

    // 定义变量 记录小球在x和y轴方向上分别的移动速度
    private int speedY = 10;
    private int speedX = 5;

    // 定义变量 记录球拍的坐标
    private int racketX = 120;
    private final int racketY = 340;  // 这里设置为常量 是因为我们只需要 这个球拍沿着x轴移动

    // 定有变量 标识当前游戏是否已结束
    private boolean isOver = false;

    // 声明一个定时器
    private Timer timer;

    // 自定义一个类 继承canves 充当画布
    private class MyCanves extends Canvas {
        @Override
        public void paint(Graphics g) {
            // TODO 这里绘制内容

            if (isOver) {
                // 游戏结束
                g.setColor(Color.BLUE);  // 设置字体为蓝色

                g.setFont(new Font("Times", Font.BOLD, 30));  // 第一个参数是给这个字体类型取的名字
                // 第二个参数表示的是 把这个字体加粗 第三个参数表示 这个字体的大小

                g.drawString("游戏结束!", 50, 200);  // 结束的文字 和 这个文字的位置
            } else {
                // 游戏中

                // 绘制 小球
                g.setColor(Color.RED);  // 设置小球为红色
                g.fillOval(ballX, ballY, Ball_SIZE, Ball_SIZE); // 前两个参数是小球的位置 后两个是 小球的长宽

                // 绘制 球拍
                g.setColor(Color.PINK);  // 设置为 粉色
                g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HEIGHT);  // 参数含义同上
            }
        }
    }
        MyCanves drawArea = new MyCanves();  // 创建一块属于自己的画布

        public void init() {
            // 组装视图 游戏逻辑控制

            // 完成球拍坐标的变化
            KeyListener listener = new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    // 获取当前按下的键
                    int keyCode = e.getKeyCode();

                    if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {  // VK_LEFT表示的是向左的标
                        // <-向左移动
                        if (racketX > 0) {  // 防止左边越界
                            racketX -= 5;
                        }
                    }

                    // -> 向右移动
                    if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {  // VK_RIGHT 表示的是右标
                        if (racketX < TABLE_WIDTH - RACKET_WIDTH) {
                            racketX += 5;
                        }
                    }
                }
            };

            // 给Frame和drawArea注册监听器
            frame.addKeyListener(listener);
            drawArea.addKeyListener(listener);

            // 小球坐标控制
            ActionListener task = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // 根据边界范围 修正速度
                    if (ballX <= 0 || ballX >= (TABLE_WIDTH - Ball_SIZE)) {
                        speedX = -speedX;
                    }
                    if (ballY <= 0 || (ballY > racketY - Ball_SIZE && ballX > racketX && ballX < racketX + RACKET_WIDTH)) {
                        speedY = -speedY;
                    }
                    if (ballY > racketY - Ball_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
                        // 当前小球超出了球拍的范围 游戏结束

                        // 停止计时器
                        timer.stop();

                        // 修改游戏是否结束的标记
                        isOver = true;

                        // 重绘界面
                    }
                    // 更新小球的坐标 重绘界面
                    ballX += speedX;
                    ballY += speedY;

                    // 重绘界面
                    drawArea.repaint();
                }
            };
            timer = new Timer(100, task);  // 第一个参数单位为毫秒 这个是 让这个界面0.1s更新一次
            timer.start();

            drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT)); // 设置画布的大小
            frame.add(drawArea);

            // 设置关闭按钮
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });

            // 设置合适的大学
            frame.pack();
            frame.setVisible(true);
        }
    public static void main(String[] args){
        new Main().init();
    }
}
package org.crazyit.ball; import java.awt.Image; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; /** * 小球对象 * * @author yangenxiong yangenxiong2009@gmail.com * @author Kelvin Mak kelvin.mak125@gmail.com * @version 1.0 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br>Copyright (C), 2009-2010, yangenxiong * <br>This program is protected by copyright laws. */ public class Ball extends BallComponent { // 定义球的竖向速度 private int speedY = 10; // 定义弹球的横向速度 private int speedX = 8; // 定义是否在运动 private boolean started = false; // 定义是否结束运动 private boolean stop = false; /** * m 有参数构造器 * * @param panelWidth * int 画板宽度 * @param panelHeight * int 画板高度 * @param offset * int 位移 * @param path * String 图片路径 */ public Ball(int panelWidth, int panelHeight, int offset, String path) throws IOException { // 调用父构造器 super(panelWidth, panelHeight, path); // 设置y坐标 this.setY(panelHeight - super.getImage().getHeight(null) - offset); } /** * 设置横向速度 * * @param speed * int 速度 * @return void */ public void setSpeedX(int speed) { this.speedX = speed; } /** * 设置竖向速度 * * @param speed * int 速度 * @return void */ public void setSpeedY(int speed) { this.speedY = speed; } /** * 设置是否在运动 * * @param b * boolean * @return void */ public void setStarted(boolean b) { this.started = b; } /** * 设置是否结束运动 * * @param b * boolean * @return void */ public void setStop(boolean b) { this.stop = b; } /** * 返回横向速度 * * @return int 速度 */ public int getSpeedX() { return this.speedX; } /** * 返回竖向速度 * * @return int 速度 */ public int getSpeedY() { return this.speedY; } /** * 是否在运动 * * @return boolean 是否在运动 */ public boolean isStarted() { return this.started; } /** * 是否已经结束运动 * * @return boolean 是否已经结束运动 */ public boolean isStop() { return this.stop; } }
Java中实现弹球小游戏需要用到图形化库,比如Swing或JavaFX等。下面是一个简单的实现思路: 1. 创建一个游戏窗口,设置窗口的大小和标题。 2. 在窗口中创建一个挡板和一个小球,挡板可以通过键盘控制左右移动,小球则需要设置一个初始位置和速度。 3. 在每次游戏循环中,需要判断小球是否碰到了窗口的边缘,如果碰到了需要改变方向。 4. 同时也需要判断小球是否碰到了挡板,如果碰到了需要改变方向。 5. 如果小球掉到了窗口底部则游戏结束,可以根据需要进行重新开始或退出游戏的操作。 以下是一个简单的代码示例,供参考: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class BallGame extends JFrame implements KeyListener { private int panelWidth = 500; private int panelHeight = 500; private int ballSize = 20; private int ballX = panelWidth / 2 - ballSize / 2; private int ballY = panelHeight / 2 - ballSize / 2; private int ballSpeedX = 5; private int ballSpeedY = 5; private int paddleWidth = 80; private int paddleHeight = 10; private int paddleX = panelWidth / 2 - paddleWidth / 2; private int paddleY = panelHeight - paddleHeight - 20; private boolean leftPressed = false; private boolean rightPressed = false; public BallGame() { super("弹球小游戏"); setSize(panelWidth, panelHeight); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); addKeyListener(this); setVisible(true); } @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.BLUE); g.fillOval(ballX, ballY, ballSize, ballSize); g.setColor(Color.BLACK); g.fillRect(paddleX, paddleY, paddleWidth, paddleHeight); } public void moveBall() { ballX += ballSpeedX; ballY += ballSpeedY; if (ballX < 0 || ballX + ballSize > panelWidth) { ballSpeedX = -ballSpeedX; } if (ballY < 0) { ballSpeedY = -ballSpeedY; } if (ballY + ballSize > panelHeight) { JOptionPane.showMessageDialog(this, "游戏结束!"); System.exit(0); } if (ballY + ballSize >= paddleY && ballX + ballSize >= paddleX && ballX <= paddleX + paddleWidth) { ballSpeedY = -ballSpeedY; } } public void movePaddle() { if (leftPressed && paddleX > 0) { paddleX -= 5; } if (rightPressed && paddleX + paddleWidth < panelWidth) { paddleX += 5; } } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { leftPressed = true; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { rightPressed = true; } } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { leftPressed = false; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { rightPressed = false; } } @Override public void keyTyped(KeyEvent e) {} public static void main(String[] args) { new BallGame(); while (true) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } BallGame game = new BallGame(); game.moveBall(); game.movePaddle(); game.repaint(); } } } ``` 以上代码可能存在一些问题,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值