Pinball games

package game;

import javax.swing.*;
import javax.swing.plaf.synth.ColorType;
import java.awt.*;
import java.awt.event.*;

public class 弹珠小游戏 extends JFrame {
    /*电脑上每一个键都对应一个整数
    * */
    //桌面宽度和高度
    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;
    //球拍初始位置
    private int racketY = 340;
    private int racketX = 120;
    //小球的速度
    private int speedY = 10;
    private int speedX = 5;
    //表示游戏是否结束
    private boolean isOver = false;
    //声明一个定时器
    private Timer timer;

    //自定义一个类 充当画布
    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {
            if (isOver){
                //游戏结束
                g.setColor(Color.BLUE);
                //设置字体 粗体 及 大小
                g.setFont(new Font("Timer",Font.BOLD,30));
                //绘画字体
                g.drawString("挑战失败,游戏结束",20,185);
            }else {
                //游戏中
                //小球 颜色 填充fill
                g.setColor(Color.GREEN);
                g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);
                //球拍
                g.setColor(Color.CYAN);
                g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEIGHT);
            }


        }
    }

    public void init(){
        //组装示图 设计逻辑思路
        MyCanvas myCanvas = new MyCanvas();
        KeyListener keyListener = 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;
                    }
                }

            }
        };

        this.addKeyListener(keyListener);
        myCanvas.addKeyListener(keyListener);
        //对小球进移动 timer
        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){
                    //当小球超出球拍 游戏结束
                    //停止定时器
                    timer.stop();
                    //提示结束
                    isOver = true;
                    //重新绘制界面 可以提前结束
                    myCanvas.repaint();
                }

                ballX += speedX;
                ballY += speedY;

                //重绘界面  自动调用 paint()方法
                myCanvas.repaint();
            }
        };

        //创建一个定时器 对小球进行移动
        //每100毫秒移动一次
        //设置定时器开始
        timer = new Timer(100,task);
        timer.start();

        myCanvas.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
        this.add(myCanvas);


        this.setTitle("弹珠小游戏");
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.pack();
    }
    public static void main(String[] args) {
        new 弹珠小游戏().init();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值