详细代码(GBK格式编码)
package com.draw;
import javax.swing.Timer;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class PinBall {
//创建窗口对象
Frame frame = new Frame("弹球小游戏");
//设置游戏界面宽度和高度
private final int TABLE_WIDTH = 250;
private final int TABLE_HEIGHT = 400;
//设置球拍的宽度和高度
private final int RACKET_WIDTH = 65;
private final int RACKET_HEIGHT = 15;
//设置小球的大小
private final int BALL_SIZE = 15;
//定义变量,记录小球坐标
private int ballX = 80;
private int ballY = 20;
//定义变量,记录小球在X,Y轴分别移动的速度
private int speedX = 5;
private int speedY = 10;
//定义变量,记录球拍坐标
private int racketX = 100;
private final int racketY = 350;//Y坐标固定
//定义变量,标识当前游戏是否结束
private boolean isOver = false;
//声明一个定时器
private Timer timer;
//自定义一个类,继承canvas,充当画布
private class MyCanvas 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, 180);
} else {
//第二部分 游戏中
//绘制小球
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 drawArea = new MyCanvas();
//组装视图,及游戏逻辑的控制
//实现球拍坐标的变化
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 < (TABLE_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 >= (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;
//重绘界面
drawArea.repaint();
}
//更新小球坐标
ballX += speedX;
ballY += speedY;
//重回界面
drawArea.repaint();
}
};
timer = new Timer(100, task);
timer.start();
drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));
frame.add(drawArea);
//设置frame最佳大小,并可视化
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new PinBall().init();
}
}
运行结果