Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // breakout.c
- //
- // Computer Science 50
- // Problem Set 3
- //
- // standard libraries
- #define _XOPEN_SOURCE
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- // Stanford Portable Library
- #include <spl/gevents.h>
- #include <spl/gobjects.h>
- #include <spl/gwindow.h>
- // 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;
- // velocity of balls
- double velocity = drand48()*rand();
- // keep playing until game over
- while (lives > 0 && bricks > 0)
- {
- // TODO
- int x = 185, y = 285;
- // updating score board..
- updateScoreboard(window, label, points);
- // start moving ball..
- move(ball, velocity, velocity);
- pause(10);
- GEvent event = getNextEvent(MOUSE_EVENT);
- if (event != NULL)
- {
- if (getEventType(event) == MOUSE_MOVED)
- {
- double x = getX(event) - getWidth(paddle)/2;
- setLocation(paddle, x, 550);
- }
- }
- // bounce back the ball if it bounce back to edges, top, brick, paddle, etc...
- if (getX(ball) + getWidth(ball) == getWidth(window))
- {
- velocity = -velocity;
- }
- else if (getX(ball) == 0)
- {
- velocity = -velocity;
- }
- else if (getY(ball) + getHeight(ball) > getHeight(window) - getHeight(paddle))
- {
- lives--;
- setLocation(ball, 193, 293);
- waitForClick();
- }
- else if (getY(ball) == 0)
- {
- velocity = -velocity;
- }
- // detect collision..
- GObject object = detectCollision(window, ball);
- if (object != NULL)
- {
- if (object == paddle)
- {
- velocity = -velocity;
- }
- else if (strcmp(getType(object), "GRect") == 0)
- {
- updateScoreboard(window, label, points);
- removeGWindow(window, "GRect");
- velocity = -velocity;
- points++;
- bricks--;
- }
- else if (strcmp(getType(label), "GLabel") == 0)
- {
- return 0;
- }
- }
- }
- if ((lives == 0) && (bricks > 0))
- {
- GLabel lost = newGLabel("Sorry!!\n\t\t\t\t YOU LOST :(");
- setFont(lost, "Arial-30");
- setLocation(lost, 185, 285);
- add(window, lost);
- }
- else if (bricks == 0)
- {
- GLabel lost = newGLabel("HURRAH!!!\n\t\t\t\t YOU WON :)");
- setFont(lost, "Arial-30");
- setLocation(lost, 185, 285);
- add(window, lost);
- }
- // wait for click before exiting
- waitForClick();
- // game over
- closeGWindow(window);
- return 0;
- }
- /**
- * Initializes window with a grid of bricks.
- */
- void initBricks(GWindow window)
- {
- // Making if and else conditions only for different colors in rows..
- int y=10;
- for (int i=0; i<ROWS; i++)
- {
- int x=10;
- if (i == 0)
- {
- for (int j=0; j<COLS; j++)
- {
- GRect bricks = newGRect(x, y, 30, 8);
- setFilled(bricks, true);
- setColor(bricks, "RED");
- add(window, bricks);
- x=x+38;
- }
- printf("\n");
- }
- else if (i == 1)
- {
- for (int j=0; j<COLS; j++)
- {
- GRect bricks = newGRect(x, y, 30, 8);
- setFilled(bricks, true);
- setColor(bricks, "BLUE");
- add(window, bricks);
- x=x+38;
- }
- printf("\n");
- }
- else if (i == 2)
- {
- for (int j=0; j<COLS; j++)
- {
- GRect bricks = newGRect(x, y, 30, 8);
- setFilled(bricks, true);
- setColor(bricks, "GREEN");
- add(window, bricks);
- x=x+38;
- }
- printf("\n");
- }
- else if (i == 3)
- {
- for (int j=0; j<COLS; j++)
- {
- GRect bricks = newGRect(x, y, 30, 8);
- setFilled(bricks, true);
- setColor(bricks, "YELLOW");
- add(window, bricks);
- x=x+38;
- }
- printf("\n");
- }
- else if (i == 4)
- {
- for (int j=0; j<COLS; j++)
- {
- GRect bricks = newGRect(x, y, 30, 8);
- setFilled(bricks, true);
- setColor(bricks, "BLUE");
- add(window, bricks);
- x=x+38;
- }
- printf("\n");
- }
- y=y+15;
- }
- }
- /**
- * Instantiates ball in center of window. Returns ball.
- */
- GOval initBall(GWindow window)
- {
- GOval ball = newGOval(185, 285, RADIUS*2, RADIUS*2);
- setFilled(ball, true);
- setColor(ball, "BLACK");
- add(window, ball);
- return ball;
- }
- /**
- * Instantiates paddle in bottom-middle of window.
- */
- GRect initPaddle(GWindow window)
- {
- GRect paddle = newGRect(165,550,50,12);
- setFilled(paddle, true);
- setColor(paddle, "BLACK");
- add(window, paddle);
- return paddle;
- }
- /**
- * Instantiates, configures, and returns label for scoreboard.
- */
- GLabel initScoreboard(GWindow window)
- {
- GLabel label = newGLabel("");
- setFont(label, "SansSerif-40");
- double x= (getWidth(WIDTH) - getWidth(label))/2;
- double y= (getHeight(HEIGHT) + getFontAscent(label))/2;
- setLocation(label, x, y);
- return label;
- }
- /**
- * 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement