斯坦福大学CS106A编程方法学的第三次作业,Breakout,我自己写好了代码,并且能够完整运行。从编写这个程序的过程中学习到了很多的东西,比如各种GObject的创建、使用、常用方法等等。但是我觉得收获最大的还是一种编程设计思想:自上而下的设计。
我一开始写程序的时候写着写着就乱了,不知道下一步应该做什么。CS106A的作业要求上面已经做了很多的分解工作,但是每一步的具体方法对我来说依然是一个很大的挑战。后来,开始把注意力放在了如何设计程序上,而不是如何写出最终的代码。我认为,自上而下的设计就是把很复杂的问题高度抽象化,把一个庞大的问题简单直观的分解成几个较为简单明了的问题,然后不断的进行分解,直到最终的问题可以用简洁的代码表达出来。我最终的程序中,run()方法里只有两行:setup()用于初始化游戏,play()用于进行游戏。这样的分解,也为之后思考的问题提供了不少的便利。
在实际写代码的过程中,即使把程序设计好了,还是很容易迷失方向,在游戏中尤其体现在时间的先后关系上。后来,我开始在程序中添加大量的注释,这样才解决了容易迷失方向这个问题。在实际编写代码的时候,在每一个方法前用注释标明这个方法具体要做的几件事情,然后一件件的写出代码。这个过程实际上也是一种对问题的自上而下的分解,不仅可以让自己知道应该写出那些内容,也加深了对于所要解决的问题的思考。
下面就把我的代码贴出来,肯定有写的不到位的地方,也希望大家能够指出来,大家共同进步。
import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Breakout extends GraphicsProgram {
/** Width and height of application window in pixels */
public static final int APPLICATION_WIDTH = 400;
public static final int APPLICATION_HEIGHT = 600;
/** Dimensions of game board (usually the same) */
private static final int WIDTH = APPLICATION_WIDTH;
private static final int HEIGHT = APPLICATION_HEIGHT;
/** Dimensions of the paddle */
private static final int PADDLE_WIDTH = 60;
private static final int PADDLE_HEIGHT = 10;
/** Offset of the paddle up from the bottom */
private static final int PADDLE_Y_OFFSET = 30;
/** Number of bricks per row */
private static final int NBRICKS_PER_ROW = 10;
/** Number of rows of bricks */
private static final int NBRICK_ROWS = 10;
/**Number of bricks */
private static int brickNum = NBRICKS_PER_ROW * NBRICK_ROWS;
/** Separation between bricks */
private static final int BRICK_SEP = 4;
/** Width of a brick */
private static final int BRICK_WIDTH =
(WIDTH - (NBRICKS_PER_ROW - 1) * BRICK_SEP) / NBRICKS_PER_ROW;
/** Height of a brick */
private static final int BRICK_HEIGHT = 8;
/** Radius of the ball in pixels */