目录
- 需求分析 3
1.1目的 3
1.2背景 3 - 系统设计 3
2.1 项目结构 3
2.2游戏初始化界面设计 4
2.3游戏开始界面设计 5
2.4游戏结束界面设计 5 - 系统实现 6
3.1 游戏初始化(UI类) 6
3.1.1 框架结构 6
3.1.2 构造函数 6
3.1.3 窗体初始化 7
3.1.4 数据初始化 7
3.1.5 Paint方法 8
3.1.6 监听 8
3.2 球线程(Thread Ball类) 9
3.2.1 框架结构 9
3.2.2 run方法 10
3.3 球板线程(Thread Paddle类) 11
3.3.1框架结构 11
3.3.2 run方法 11
3.4 绘图线程(Thread Controle类) 12
3.4.1框架结构 12
3.4.2 run方法 12
3.5主函数(Main 类) 13 - 系统测试 13
4.1游戏状态切换测试 13
4.1.1未开始-开始 13
4.1.2开始-结束 14
4.1.3结束-重新开始 14
4.2游戏运行bug改进 15
4.2.1 小球和球板碰撞bug 15
4.2.2 游戏界面闪烁 15 - 小结 16
1.需求分析
1.1目的
利用多线程的思想,编写一个游戏。
1.2背景
1).游戏名称:弹球游戏。
2).开发环境:IDEA。
3).游戏规则:小球实现从不同角度,不同坐标落下,与挡板接触后反弹并加分,落在地面上则游戏结束失败。
2.系统设计
2.1 项目结构
由五个类构成:
1).三个线程类分别控制球的移动,球板的移动和画面的重绘。
2).UI类控制界面的初始化和绘制。
3).Main类用来创建线程和启动线程。
2.2游戏初始化界面设计
1).游戏界面显示:点击开始游戏。
2).点击以后,游戏状态改变,显示开始游戏界面。
2.3游戏开始界面设计
1).画出两个对象:球和球板。
2).显示得分。
2.4游戏结束界面设计
1).给出提示信息:游戏结束以及得分情况。
2).给出提示信息:按下空格可以重新开始。
3.系统实现
3.1 游戏初始化(UI类)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class Ui extends JFrame implements KeyListener ,MouseListener{
//判断球还活着
static boolean blIsOver;
//分数
static int intSore;
//定义游戏状态 0:游戏未开始/1:游戏开始/2:暂停/3:结束
static int state=0;
//双缓存解决界面闪烁
Image offScreenImage=null;
//构造函数
public Ui() {
initFrame();
initData();
addKeyListener(this);
addMouseListener(this);
setVisible(true);
}
public void initFrame(){
setTitle("弹球游戏");
setBackground(Color.WHITE);
setSize(900,600);
//setLocationRelativeTo(null);
setLocation(300,50);
setResizable(false);
setFocusable(true); //获取键盘焦点,将键盘聚集在游戏界面上
//setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}//初始化窗体
public void initData(){
//球的初始化坐标
ThreadBall.PositionX=(int)(Math.random()*100)+300;//300-400
ThreadBall.PositionY=(int)(Math.random()*100)+100;//100-200
//初始化角度
ThreadBall.intDu= (int)(Math.random()*3)+1;//1-4
//初始化球板
ThreadPaddles.PositionA=0;
ThreadPaddles.PositionB=450;
//初始化
intSore=0;
System.out.println("state="+state);
}//初始化数据
public void paint(Graphics gImage) {
if(offScreenImage==null){
offScreenImage=createImage(900,600);
}
//获取画笔对象
Graphics g=offScreenImage.getGraphics();//画笔对象
g.fillRect(0,0,900,600); //填充一个宽900,高600的区域
if(state==0){
//游戏未开始
g.clearRect(0, 0, 900, 600);//0,0:是相对于容器的坐标
//g.draw