Java实现弹球小游戏~基于GUI图形界面编程和Timer定时器实现~AWT5

弹球小游戏

基于AWT编程和Timer定时器实现。

详细解释在代码中有注释:

import java.awt.*;
import java.awt.event.*;
import java.sql.Time;

import javax.swing.*;
public class PinBall {
    //创建窗口对象
    private Frame frame= new Frame("弹球游戏");

    //桌面宽度
    private final int TABLE_WIDTH=300;
    //桌面高度
    private final int TABLE_HEIGHI=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 int racketY=340;

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

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


    //自定义一个类,继承canvas,充当画布

    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {


            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);


            }
        }
    }

    //创建绘画区域
    MyCanvas drawArea=new MyCanvas();


    public void init(){

        //组装视图,游戏逻辑的控制

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});


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

                if(keyCode == KeyEvent.VK_LEFT){
                    //控制小球向左移动
                    if(racketX>0){
                        racketX-=10;
                   }
                }

                if(keyCode == KeyEvent.VK_RIGHT){
                    //控制小球向右移动
                    if(racketX<(TABLE_WIDTH-RACKET_WIDTH)){
                        racketX+=10;
                    }
                }
            }
        };

        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;
                    //重回jiem
                    drawArea.repaint();
                }

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

                //重绘界面
                drawArea.repaint();
            }
        };

        timer=new Timer(100,task);
        timer.start();

        drawArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHI));
        frame.add(drawArea);


        //设置frame最佳大小和可视
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new PinBall().init();
    }
}

运行结果:
通过键盘左右键控制球拍移动。
当球掉入球拍下方时,游戏结束!
在这里插入图片描述

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Salute-Y

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值