弹球游戏源代码
2016-05-18 00:00
225 查看
package com;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;
public class PinBall {
public static void main(String[] args) {
new PinBall().init();
}
class MyCanvas extends Canvas {
// 重写Canvas的paint()方法,实现绘图
@Override
public void paint(Graphics g) {
if (isLose) {// 遊戲
g.setColor(new Color(255, 0, 0));
g.setFont(new Font("Times", Font.BOLD, 30));
g.drawString("哈哈,游戏结束啦~~~~~", 0, 200);
} else {// 游戏没有结束
g.setColor(new Color(240, 240, 80));
// 绘制小球
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
g.setColor(new Color(80, 80, 200));
// 绘制球拍
g.fillRect(racketX, RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);
}
}
}
// 桌面的宽度
private final int TABLE_WIDTH = 300;
// 桌面的高度
private final int TABLE_HEIGHT = 400;
// 球拍的垂直位置
private final int RACKET_Y = 340;
// 球拍的高度
private final int RACKET_HEIGHT = 20;
// 球拍的宽度
private final int RACKET_WIDTH = 60;
// 球的大小
private final int BALL_SIZE = 16;
// 窗体
private JFrame f = new JFrame("弹球游戏——润康制作");
// 随机数
Random rand = new Random();
// 小球的纵向运行速度
private int ySpeed = 10;
// 控制小球的运动方向 -0.5~0.5
private double xyRate = rand.nextDouble() - 0.5;
// 小球的横向运行速度
private int xSpeed = (int) (ySpeed * xyRate * 2);
// 小球的坐标
private int ballX = rand.nextInt(200) + 20;
private int ballY = rand.nextInt(10) + 20;
// 球拍的水平位置
private int racketX = rand.nextInt(200);
// 画布
private MyCanvas tableArea = new MyCanvas();
// 计时器
Timer timer;
// 记录游戏是否结束 isLose
private boolean isLose = false;
public void init() {
// 设置桌面区域的最佳大小
tableArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));// Dimension
// 尺寸
f.add(tableArea);
// 定义键盘的监听器
KeyAdapter keyProcessor = new KeyAdapter() {
3ff8
public void keyPressed(KeyEvent ke) {
// 按下左键时的动作
if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
if (racketX > 0)
racketX -= 10;
}
// 按下右键时的动作
if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
if (racketX < TABLE_WIDTH - RACKET_WIDTH)
racketX += 10;
}
}
};
// 为窗口和tableArea对象分别添加键盘监听器
f.addKeyListener(keyProcessor);
tableArea.addKeyListener(keyProcessor);
// 定义事件执行的周期
ActionListener taskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 如果小球碰到左边的边框
if (ballX <= 0 || ballX > TABLE_WIDTH - BALL_SIZE) {
xSpeed = -xSpeed;
}
// 如果小球的高度超出了球拍的位置,且横向不在球拍的范围之内,游戏结束
if (ballY >= RACKET_Y - BALL_SIZE
&& (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
timer.stop();
isLose = true;
tableArea.repaint();
} else if (ballY <= 0
|| (ballY >= RACKET_Y - BALL_SIZE && racketX < ballX && ballX <= racketX
+ RACKET_WIDTH)) {// 如果小球在球拍之内,且达到球拍的位置,小球反弹
ySpeed = -ySpeed;
}
// 改变小球的坐标
ballX += xSpeed;
ballY += ySpeed;
System.out.println("小球的横坐标" + ballX + "小球的纵坐标" + ballY);
tableArea.repaint();
}
};
// 0.1秒,执行一次时间
timer = new Timer(90, taskPerformer);
timer.start();
f.pack();
f.setVisible(true);
}
}
相关文章推荐
- AWT编程
- 可视化日历【Java,有详细的注释】
- XML格式文本 与 JavaBean 相互转换
- 佩奇:Google将投入巨资开发前瞻性…
- 数学公式计算 结合 JavaBean
- 使用Java为图片添加水印
- Java处理数学公式得出结果
- C#系统命名空间[精心整理的…
- Python爬虫学习资料书籍推荐
- Python文件迭代的用法实例教程
- 【java】Date、String、Calendar类型之间的转化
- Java ClassLoader原理
- dao设计模式
- javaBean
- 内置对象
- Beego的controller怎么用嵌入实现继承问题
- springmvc-json小案例
- java创建线程的三种方式(学习笔记)
- 模拟图书管理系统(简单c语言DOS界面)
- godaddy online livechat 在线客服地址