一、游戏改进过程
(一)功能简介
本游戏改进前有黄、绿、蓝三种颜色的砖块,经过木板反射的小球碰到任何颜色的砖块,砖块都会消失,消掉每个砖块加十分,改进后的游戏中蓝色与绿色的砖块变为禁区,当小球碰到后,游戏就结束,在原有基础上增加了游戏的难度。
(二)可行性分析
本游戏源代码利用的是java语言,java语言实现起来比较简单,游戏代码所占空间不大,成本低,效果可见性高,方便装载。游戏规则简单、操作简单,成功闯关有一定的难度,可以给玩家一定的挑战性,适合儿童。
(三)需求分析
如今市场上有各种各样的益智类游戏, 都是针对于低龄人群设计的,本款游戏就是其中一个。在传统的打砖块游戏基础上,重新定义了游戏规则,实现了在大家都熟悉的场景中进行游戏的功能,非常适合儿童,既有趣味性,又挑战性,锻炼了玩家的反应能力、辨别能力、记忆能力等。
(四)总体设计
改进前存在的问题:
1.由于开始定义的run函数的取值是每0.5刷整个屏一次使得屏幕闪动而且小球的运行速度非常慢,虽然定义了个各方块的随机颜色,但是颜色的各异对游戏除了视觉效果并没有起到其他作用,游戏规则太简单使得游戏成功的机会非常大,如果是应用到实际中对于游戏玩家没有任何挑战无法引起玩家的任何兴趣。2.原来的程序设置timer为线程机制,看到的游戏结束,只是球超出了可视范围,但是木板还可以移动,即假死状态。
对系统的改进就是将以上提到的问题解决。
(五)详细设计
1.将刷屏的时间间隔降低,使得小球的运动速度变快增加了游戏的难度。
2.将蓝色和绿色都作为碰撞禁区,一旦小球碰到游戏立马结束,增加了游戏的难度。
3.改进后的游戏设置了flag标志变量,初始为true,结束变为false,此时游戏进入冻结状态,进入真正的结束状态,球和木板都无法再运动。
(六)代码分析:
1.模块构造:利用jframe定义了一个窗口,名为“打砖块”,
2.begin()函数定义开始时小球的位置。
3.paint()函数定义矩阵,矩阵的每个元素为一个方块。
4.paintrect()定义开始接小球的黑色方块。
5.Paintscore()定义每次成功或者失败时所得的分数。
6.通过keypressed的函数监听键盘传来的消息以决定目标左右的移动。
7.在board类中定义砖块的时候为了使得每次出现的颜色不一样儿使用math.randonm()参数随机数以决定砖块的颜色。
8.通过move函数决定每次小球的运动轨迹。
9.设置flag标志变量,初始为true,当小球碰到蓝色或者绿色砖块时,变为false,即游戏结束。
(七)游戏操作:游戏的操作简单易行,主要是根据发射角度与方向来决定操作,键盘的操作只涉及到左右两个键和进入游戏的一个enter键。
(八)黑盒测试
改进前结果:
游戏碰到绿色砖块游戏没有结束
改进后结果:
改进后由于小球碰到蓝色砖块游戏结束
二、有待改进的地方
1、由于对于java语言的掌握还不够深入,本游戏在改进前与改进后都还有很大的提升空间,比如对于刷屏的范围的掌握,可以试着将刷屏的范围减小以减小界面的刷新所带来的闪动问题。
2、游戏的视角效果相对比较简单,对于玩家没有足够的吸引力,同时如果有能力应该在听觉上有所反应,比如说当砖块被击中的时候可以模拟东西破碎的声音可以增强与玩家的交互,同时能够提高玩家的兴趣。
3、编程能力有限,对于游戏的改进只能实现一小部分,所以游戏在玩法上还有很大改善空间。
三、心得体会与收获
这是软件工程的第二次作业,本次实验的目的不仅是考察我们的专业知识,还是对我们团队合作能力的初步考验,两个人一组,我们要做好明确的分工,然后相互多沟通、多讨论,我主要负责的是代码改进。由于一直呆在实验班,所以Java、c++基础较差,但是自学过Java,所以本次实验选择了用Java实现的工程。
通过分析源程序代码,我感觉到其实实现一个像打砖块这样的小游戏并不难,算法没有多复杂,只是很巧妙,就比如求解一道数学题,有很多种解法,你只要选择最简单的一种,就可以事半功倍,我觉得写程序的技巧也和这个一样,在你写之前,一定要先分析,不能上来就写,要像做数学题一样,把思路想清楚,遵循自顶向下原则,把步骤细分到不能分解,想好我要做什么,该怎样做,这样结果会好很多,我相信即使是复杂的项目,按照这种方法也可以解决。
还有一个感觉就是我们写程序或者做项目的时候,要对自己有信心,不能总是知难而退,很多复杂的东西都是由简单叠加而成的,谁都不是一开始就什么都会,我们都敢于尝试,出错也没关系,自己反复修正思考的时候,才是进步最大的时候,要有这个过程的。
这个打砖块小游戏优化的空间还很大,目前我的编程能力很有限,但是以后对编程语言有很好掌握时,我想这个小游戏会提升更多。
四、游戏改进后源代码
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import javax.swing.JFrame;
public class dazhuankuai implements KeyListener {
private JFramejframe;
Canvas canvas;
public static board b;
int x;
int scoret;
int diffscore;
private int canvaswidth = 400;// canvas鐨勫睘鎬�
private int canvasheight = 600;
public static boolean isOver =false;
public static Graphics g;
dazhuankuai() {
jframe = new JFrame("打砖块");
canvas = new Canvas();
canvas.setSize(canvaswidth,canvasheight);
canvas.addKeyListener(this);
jframe.add(canvas);
jframe.setBounds(320,100, 410, 500);
jframe.addKeyListener(this);
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
begin();
}
public void begin() {
b = new board(this);
board.flag = true;
b.run();
b.ball.vx = 5;
b.ball.vy = 10;
}
void paint() {
g = canvas.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, 400, 350);
for (int i = 0; i < 20; i++)
for (int j = 0; j < 20; j++)
if (b.matrix[i][j]) {
g.setColor(b.brickcolor[i][j]);
g.fillRect(i * 20,j * 10, 20, 10);
g.setColor(Color.white);
g.drawRect(i * 20,j * 10, 20, 10);
}
g.setColor(Color.RED);
if (b.ball.y <= 350)
g.fillOval(b.ball.x,b.ball.y, 10, 10);
}
void paintrect() {
Graphics g = canvas.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 350, 400,10);
g.setColor(Color.black);
g.fillRect(b.leftpoint, 350, 50, 10);
}
void paintscore() {
if(board.flag){