小言_互联网的博客

植发咨询日记之打砖块

231人阅读  评论(0)

打砖块项目记录日记

前言 :

这周我们做的项目是打砖块游戏。老实说,在做之前,我的信心还是很足的。因为有乔布斯珠玉在前,框架已经被构建好,加上网上还有很多的教程。本以为可以借鉴这些大哥们的项目,来成就自己,没想到啊,还是年轻了。刚上手就被几个bug打懵逼了,看了半天都不知道问题在哪。
说起过程,都是泪。要让我现在说项目怎么样,实在是不好开口了。说简单吧,那是在骗自己。要说难,有这么多参考资料,还真难不到哪去。只能说吃一堑长一智吧,这次项目让我体会到了,无论是看似多么简单的代码,都不可小觑。作为一个合格的程序员,必须要时刻保持一个清晰的头脑和一份缜密的思维。仅以此文来记录那些灵光一闪的想法和突如其来的bug。


设置的游戏特性:

1.初始化了界面,使得小球,挡板和砖块出现在屏幕上
2.挡板可以反弹小球,小球打到砖块会使砖块消失,并在左上角的积分上面加1。当小球将界面上的所有砖块打掉之后,会在屏幕正中显示通关的提示
3.添加了三条生命,照顾一下手残的玩家(比如说我)
4.当屏幕上砖块数目消失一半的时候,挡板也会变为原先长度的1/2。
5.添加了一个加速按钮,当按下加速按钮的时候小球加速
6.在砖块背后隐藏了一张非常好看的照片
7.添加了两个类似彩蛋的按钮,按下去会有一些意想不到的功能


功能实现:

1.小球、挡板、砖块的创建:
// 设置小球为空心
ball.setFilled(true);

    // 填充颜色是黑色
    ball.setColor(Color.YELLOW);

    // 添加到画布上(20,20)的位置
    add(ball, 400, 400);
}

2.通过初始化的时候引用添加的方法,使得小球在一开始的时候出现

public void init() {
createTheCanvas();
setTitle(“一场爱情游戏”);//游戏名称
label1 = new GLabel(“当前积分为:” + b);
label1.setColor(Color.BLUE);
label1.setFont(“宋体”);
pushButton();//调用按钮功能
makeBall();// 往屏幕上添加小球
makeBricks();
makePaddle();
3.砖块消失的实现

} else if (getCollidingObject() != null) {
        vx = -vx;
        vy = -vy;
        b++;
        remove(getCollidingObject());
    }
    这里调用了函数getCollidingObject()
     public GObject getCollidingObject() {
    double x = ball.getX();
    double y = ball.getY();

    double x1 = ball.getX();
    double y1 = ball.getBottomY();

    double x2 = ball.getRightX();
    double y2 = ball.getY();

    double x3 = ball.getRightX();
    double y3 = ball.getBottomY();

    if (getElementAt(x, y) != null) {
        return getElementAt(x, y);
    } else if (getElementAt(x1, y1) != null) {
        return getElementAt(x1, y1);
    } else if (getElementAt(x2, y2) != null) {
        return getElementAt(x2, y2);
    } else if (getElementAt(x3, y3) != null) {
        return getElementAt(x3, y3);
    } else {
        return null;
    }
}

在调用的函数里设置了小球的四个点,当小球的四个点检测到图形,就会传输到图形的x值和y值。结合前面所写的代码,当返回的值不为空的时候,就会将返回的值图形删除。
4.积分计数
积分计数主要也是依赖于返回值的实现。在类下面添加了一个int b。设置b的初始值为0,每当函数返回一次数值,b就自加1。然后在前面添加一个label,用来装载b。
5.添加三条命
因为在本项目中,我的设置是当小球撞到底部就跳出循环,相当于游戏失败。为了实现三条命的实现,我在判断撞击到底部的语句下加了一个if语句
if (a < 3) {
remove(ball);
GLabel label = new GLabel(“点击屏幕继续开始”);
add(label, 400, 400);
++a;
makeBall();
waitForClick();
remove(label);
设置成员变量a,初始值为1,每次循环加1。每次进入if语句,会将原先的小球删除掉,然后添加一个新的小球,回到初始位置,然后设置等待用户点击事件。当鼠标点击,程序就开始继续运行。
6.挡板的变化
我设置的是,当打掉界面上一半的小球之后,直接就把原先的挡板删掉,再新建一个挡板到初始位子,宽度为之前挡板的一半。然后把这些代码打包成方法,添加到返回值判断的语句里
public void fangFa() {
if (getCollidingObject() == paddle) {
vx = randomGenerator.nextInt(-10, 10);
vy = -vy;
} else if (getCollidingObject() == image || getCollidingObject() == jep) {

    } else if (getCollidingObject() != null) {
        vx = -vx;
        vy = -vy;
        b++;
        remove(getCollidingObject());
    }
    if (b == 90) {
        baffleChange();

这里也主要用到的是b的值来判定。前文中有提到,b的值和返回删掉当班的值是相同的。当b的值等于屏幕上一半的砖块的值,就直接调用打包好的方法,实现挡板变短的操作。
7.添加照片
这个很简单,就利用Gimge函数创建一个jep对象,将图片路径复制到Giimge函数里就行了
public void createTheCanvas() {
image = new GImage(“img/1.jpeg”);
image.setSize(800, 243);
jep = new GImage(“img/2.jpeg”);
jep.setSize(840, 800);
add(jep, 0, 0);
add(image, 0, 40);
}
在函数init()初始化的时候调用这个方法。放到最前面。后面调用添加砖块方法的时候,砖块就会把图片覆盖啦。


致那些终将出现的bug:

东野圭吾说过,程序员只有两种东西不能直视,一种是太阳,另一种是bug。这东西,无法消除。就像阳光只能遮挡而不能倾覆。往往当你以为自己摆脱了bug的时候,你知识进入了另一个不明显的bug。毕竟程序本身就是最大的bug,所以我们只能尽力避免犯错,但是它终将会在你疏忽的时候出现。意料之外,情理之中。带给你一点感触,一点崩溃。这个时候,不要惊慌,不要害怕,鼓起勇气,坚定向前。没有就着眼泪修改bug,是不懂得编程之味的。bug修改的多了,看到那么一些奇怪的bug现象,自然会积累一些奇怪的想法,创造力也就上来了。改bug还可以修身养性,bug的美丽,是抹平性格棱角的尖刀。这是砥砺,也是前行的动力。之所以说这么多,是因为我突然发现,我不记得在本项目具体遇到了啥bug了,这么说在修身养性的同时,记忆力也有可能下降…所以这个环节就只能告一段落啦,我们下期再见。



转载:https://blog.csdn.net/qq_53497082/article/details/112591281
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场