用键盘"<--"和"-->"方向键控制黑板的左右移动,从而实现接住小球使小球反弹回去
效果图显示
当掉下去时显示“游戏结束”
代码实现
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PinBall {
//创建窗口对象
private Frame frame = new Frame("弹球小游戏");
//窗口宽度
private final int WIDTH = 300;
//窗口高度
private final int HEIGHT = 400;
//板子的宽度和高度
private final int RACKET_WIDTH = 60;
private final int RACKET_HEIGHT = 20;
//记录板子的坐标
private int racketX = 120;
//板子只能水平移动,不能垂直移动
private final int racketY = 340;
//小球的大小,即圆的直径长度
private final int BALL_SIZE = 16;
//记录小球的坐标
private int ballX = 120;
private int ballY = 20;
//记录小球在x和y轴方向上分别移动的速度
private int speedX = 5;
private int speedY = 10;
//标识游戏是否结束,true为结束
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.blue);
g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEIGHT);
}
}
}
//创建绘画区域
MyCanvas drawArea = new MyCanvas();
public void init(){
//完成球拍坐标的变化
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//获取当前按下的键
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_LEFT){
//向左移动的左箭头
if(racketX > 0){//不在左边时
racketX -= 20;
}
}
if(keyCode == KeyEvent.VK_RIGHT){
//向右移动的右箭头
if(racketX < (WIDTH - RACKET_WIDTH)){//桌面宽度减去球拍宽度
racketX += 20;
}
}
}
};
//给frame窗口和drawArea绘画区域注册监听器
frame.addKeyListener(listener);
drawArea.addKeyListener(listener);
//小球坐标的控制
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//更新小球坐标,重绘画面
//根据边界范围修正正反速度
//当小球碰到左右边界时修改小球的运动方向
if(ballX <= 0 || ballX >= (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)){
if(ballY == HEIGHT){//当小球掉到最底部位置时才让其游戏结束停止运行
//当前小球超出球拍水平线并且超出球拍宽度的范围,游戏结束
timer.stop();//停止计时器
System.out.println("游戏已结束运行!");
//修改游戏标记为结束
isOver = true;
//重绘画面
drawArea.repaint();
}
}
//更新小球的坐标
ballX += speedX;
ballY += speedY;
//重绘界面
drawArea.repaint();
}
};
//每隔100毫秒执行task监听器刷新绘图界面
timer = new Timer(100,task);
timer.start();//开始执行
//设置画板的大小
drawArea.setSize(WIDTH,HEIGHT);
frame.add(drawArea);
frame.setLocation(700,250);//窗口位置居中显示
frame.pack();//最佳大小
frame.setVisible(true);//窗口显示
//单击右上角的X结束运行
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("游戏已结束运行!");
System.exit(0);
}
});
}
public static void main(String[] args) {
new PinBall().init();
}
}