// // breakout.c // // Computer Science 50 // Problem Set 3 // // standard libraries #define _XOPEN_SOURCE #include #include #include #include // Stanford Portable Library #include #include #include // height and width of game's window in pixels #define HEIGHT 600 #define WIDTH 400 // number of rows of bricks #define ROWS 5 // number of columns of bricks #define COLS 10 // radius of ball in pixels #define RADIUS 10 // lives #define LIVES 3 // prototypes void initBricks(GWindow window); GOval initBall(GWindow window); GRect initPaddle(GWindow window); GLabel initScoreboard(GWindow window); void updateScoreboard(GWindow window, GLabel label, int points); GObject detectCollision(GWindow window, GOval ball); int main(void) { // seed pseudorandom number generator srand48(time(NULL)); // instantiate window GWindow window = newGWindow(WIDTH, HEIGHT); // instantiate bricks initBricks(window); // instantiate ball, centered in middle of window GOval ball = initBall(window); // instantiate paddle, centered at bottom of window GRect paddle = initPaddle(window); // instantiate scoreboard, centered in middle of window, just above ball GLabel label = initScoreboard(window); // number of bricks initially int bricks = COLS * ROWS; // number of lives initially int lives = LIVES; // number of points initially int points = 0; // keep playing until game over while (lives > 0 && bricks > 0) { // TODO } // wait for click before exiting waitForClick(); // game over closeGWindow(window); return 0; } /** * Initializes window with a grid of bricks. */ void initBricks(GWindow window) { // TODO } /** * Instantiates ball in center of window. Returns ball. */ GOval initBall(GWindow window) { // TODO return NULL; } /** * Instantiates paddle in bottom-middle of window. */ GRect initPaddle(GWindow window) { // TODO return NULL; } /** * Instantiates, configures, and returns label for scoreboard. */ GLabel initScoreboard(GWindow window) { // TODO return NULL; } /** * Updates scoreboard's label, keeping it centered in window. */ void updateScoreboard(GWindow window, GLabel label, int points) { // update label char s[12]; sprintf(s, "%i", points); setLabel(label, s); // center label in window double x = (getWidth(window) - getWidth(label)) / 2; double y = (getHeight(window) - getHeight(label)) / 2; setLocation(label, x, y); } /** * Detects whether ball has collided with some object in window * by checking the four corners of its bounding box (which are * outside the ball's GOval, and so the ball can't collide with * itself). Returns object if so, else NULL. */ GObject detectCollision(GWindow window, GOval ball) { // ball's location double x = getX(ball); double y = getY(ball); // for checking for collisions GObject object; // check for collision at ball's top-left corner object = getGObjectAt(window, x, y); if (object != NULL) { return object; } // check for collision at ball's top-right corner object = getGObjectAt(window, x + 2 * RADIUS, y); if (object != NULL) { return object; } // check for collision at ball's bottom-left corner object = getGObjectAt(window, x, y + 2 * RADIUS); if (object != NULL) { return object; } // check for collision at ball's bottom-right corner object = getGObjectAt(window, x + 2 * RADIUS, y + 2 * RADIUS); if (object != NULL) { return object; } // no collision return NULL; }