package pong;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.Image;
import javax.swing.*; // Imports the necessary components to make the program function.
public class ping extends Applet implements ActionListener {
public void init() {
setSize(700, 500); // Sets screen size to 700, 500.
}
int xPosition1, xPosition2, xPosition3, xPosition4, xPosition5, xPosition6, xPosition7, xPosition8, xPosition9, xPosition10, xPosition11, xPosition12, xPosition13, xPosition14, xPosition15, xPosition16, xPosition17, xPosition18, xPosition19, xPosition20; // Creates variables for the posistion of 20 diffrent strings.
int fontWidth1, fontWidth2, fontWidth3, fontWidth4, fontWidth5, fontWidth6, fontWidth7, fontWidth8, fontWidth9, fontWidth10, fontWidth11, fontWidth12, fontWidth13, fontWidth14, fontWidth15, fontWidth16, fontWidth17, fontWidth18, fontWidth19, fontWidth20; // Creates variablesto measure the width of 20 strings.
int start = 0; // Variable used to initialize settings everytime a pong game is started.
int level = 1; // Variable to decide what screen of the game you see.
int x2, y2; // Variables created to store mouse co-ordinates for use of the buttons.
int ballX = (int) (Math.random() * (675 - 25 + 1)) + 25; // Creates a random location for the ball's x co-ordinate.
int ballY = (int) (Math.random() * (300 - 25 + 1)) + 25; // Creates a random location for the ball's y co-ordinate.
int xVelo = 1, yVelo = 1; // Creats variables for the velocity of the ball, and starts it at one.
int paddleX = 325; // Variable for the location of the paddle's x co-ordinate.
int paddleY = 490; // Variable for the location of the paddle's y co-ordinate.
int paddleX2 = 325; // Variable for the location of player 2's paddle x co-ordinate.
int paddleY2 = 0; // Variable for the location of player 2's paddle y co-ordinate.
int score = 0; // A variable to record the score of the player's.
int pause = 0; // A variable used for the pauseing of a pong game.
int high[] = new int[6]; // A variable created to store high scores and display them on the high score screen.
int record = 0; // When record == 1 it will record the current score into the high score array.
int lev = 0; // Used to decide whether it should show the player 1 death screen or the player 2 death screen.
int win = 0; // Records which player one in a two player game.
public void start() {
Timer timer;
final int FREQ = 1;
timer = new Timer(FREQ, this);
timer.start(); // Creates a timer used for the refreshing of the game screen, which is used to create the movement of the ball.
}
public void actionPerformed(ActionEvent evt) {
if (level == 2 && pause == 0 || level == 7 && pause == 0) {
repaint(); // Refreshes the screen with the timer when a pong game is active.
}
}
public boolean mouseDown(Event evt, int x, int y) {
x2 = x; // Records the x location of the mouse.
y2 = y; // Recors the y location of the mouse.
if (start != 1) {
repaint(); // Only refreshes the screen if a game is not currently running.
}
return true;
}
public boolean keyDown(Event evt, int key) {
if (key == Event.LEFT && pause == 0) {
paddleX -= 10; // Moves the paddle left when the left arrow is pressed, and the game is not paused.
}
if (key == Event.RIGHT && pause == 0) {
paddleX += 10; // Moves the paddle right when the right arrow is pressed, and the game is not paused.
}
if (key == 'a' && pause == 0 || key == 'A' && pause == 0) {
paddleX2 -= 10; // Moves the second paddle left when the A key is pressed, and the game is not paused.
}
if (key == 'd' && pause == 0 || key == 'D' && pause == 0) {
paddleX2 += 10; // Moves the second paddle right when the D key is pressed, and the game is not paused.
}
if (key == Event.UP && xVelo > -5 && xVelo < 5 && (level == 2 || level == 7)) {
if (xVelo > 0 && yVelo > 0) {
xVelo += 1;
yVelo += 1; // Increases ball speed when Up arrow is pressed.
}
if (xVelo < 0 && yVelo < 0) {
xVelo -= 1;
yVelo -= 1; // Increases ball speed when Up arrow is pressed.
}
if (xVelo > 0 && yVelo < 0) {
xVelo += 1;
yVelo -= 1; // Increases ball speed when Up arrow is pressed.
}
if (xVelo < 0 && yVelo > 0) {
xVelo -= 1;
yVelo += 1; // Increases ball speed when Up arrow is pressed.
}
}
if (key == Event.DOWN && (xVelo > 1 || xVelo < -1) && (level == 2 || level == 7)) {
if (xVelo > 0 && yVelo > 0) {
xVelo -= 1;
yVelo -= 1; // Decreases ball speed when Down arrow is pressed.
}
if (xVelo < 0 && yVelo < 0) {
xVelo += 1;
yVelo += 1; // Decreases ball speed when Down arrow is pressed.
}
if (xVelo > 0 && yVelo < 0) {
xVelo -= 1;
yVelo += 1; // Decreases ball speed when Down arrow is pressed.
}
if (xVelo < 0 && yVelo > 0) {
xVelo += 1;
yVelo -= 1; // Decreases ball speed when Down arrow is pressed.
}
}
if (key == 'q' && level == 2 || key == 'Q' && level == 2 || key == 'q' && level == 7 || key == 'Q' && level == 7) {
start = 0; // Initializes the game variables.
if (level == 2) {
lev = 1; // Records that it was a single player game that was quit.
} else if (level == 7) {
lev = 0; // Records that a two player game was quit.
}
level = 6; // Tells the game to start the game over screen.
record = 1; // Tells the program to record the score.
repaint();
}
if (key == 'p' && level == 2 || key == 'P' && level == 2 || key == 'p' && level == 7 || key == 'P' && level == 7) {
if (pause == 0) {
pause = 1; // When unpaused the program becomes paused.
} else if (pause == 1) {
pause = 0; // When paused the program becomes unpaused.
}
}
if (paddleX < 0) {
paddleX = 620; // When paddle reaches the left side of screen it appears at the right side.
}
if (paddleX > 620) {
paddleX = 0; // When paddle reaches the right side of screen it appears at the left side.
}
if (paddleX2 < 0) {
paddleX2 = 620; // When paddle 2 reaches the left side of screen it appears at the right side.
}
if (paddleX2 > 620) {
paddleX2 = 0; // When paddle 2 reaches the right side of screen it appears at the left side.
}
return true;
}
public void paint(Graphics g) {
Font arial = new Font("Arial", Font.BOLD, 24);
FontMetrics fontMetricsName = getFontMetrics(arial);
Font arial2 = new Font("Arial", Font.BOLD, 10);
FontMetrics fontMetricsName2 = getFontMetrics(arial2);
Font arial3 = new Font("Arial", Font.BOLD, 12);
Font arial4 = new Font("Arial", Font.BOLD, 48);
FontMetrics fontMetricsName3 = getFontMetrics(arial4); // Creates Fonts that are needed for the programs.
Image background = getImage(getCodeBase(), ""); // Uploads a background image for my menu's.
if (level == 1) { // The Main Menu
g.drawImage(background, 0, 0, 700, 500, this); // Sets the background image.
g.setFont(arial4);
fontWidth1 = fontMetricsName3.stringWidth("Pong");
xPosition1 = (size().width - fontWidth1) / 2;
g.drawString("Pong", xPosition1, 55); // Creates the Pong Title.
g.setFont(arial);
fontWidth2 = fontMetricsName.stringWidth("Start Game");
xPosition2 = (size().width - fontWidth2) / 2;
g.fillRoundRect(xPosition2, 80, fontWidth2, 28, 10, 10);
g.setColor(Color.white);
g.drawString("Start Game", xPosition2, 104); // Creates the Start Game button.
fontWidth17 = fontMetricsName.stringWidth("2 Player");
xPosition17 = (size().width - fontWidth17) / 2;
g.setColor(Color.black);
g.fillRoundRect(xPosition17, 180, fontWidth17, 28, 10, 10);
g.setColor(Color.white);
g.drawString("2 Player", xPosition17, 204); // Creates the 2 Player button.
fontWidth3 = fontMetricsName.stringWidth("Rules");
xPosition3 = (size().width - fontWidth3) / 2;
g.setColor(Color.black);
g.fillRoundRect(xPosition3, 280, fontWidth3, 28, 10, 10);
g.setColor(Color.white);
g.drawString("Rules", xPosition3, 304); // Creates the Rules button.
fontWidth4 = fontMetricsName.stringWidth("Controls");
xPosition4 = (size().width - fontWidth4) / 2;
g.setColor(Color.black);
g.fillRoundRect(xPosition4, 380, fontWidth4, 28, 10, 10);
g.setColor(Color.white);
g.drawString("Controls", xPosition4, 404); // Creates the Controls Button.
fontWidth5 = fontMetricsName.stringWidth("Exit Program");
xPosition5 = (size().width - fontWidth5) / 2;
g.setColor(Color.black);
g.fillRoundRect(xPosition5, 470, fontWidth5, 28, 10, 10);
g.setColor(Color.white);
g.drawString("Exit Program", xPosition5, 494); // Creates the Exit Button.
g.setFont(arial2);
g.setColor(Color.black);
g.drawString("Matt Macleod", 20, 485); // Places my name in the bottom-left corner.
fontWidth6 = fontMetricsName2.stringWidth("© January 24th, 2012"); // Places a copyright with the date made.
xPosition6 = 680 - fontWidth6;
g.drawString("© December 13th, 2012", xPosition6, 485);
} else if (level == 2) { // Main Pong Game
if (start == 0) {
ballX = (int) (Math.random() * (675 - 25 + 1)) + 25;
ballY = (int) (Math.random() * (300 - 25 + 1)) + 25;
paddleX = 325;
paddleY = 490;
xVelo = 1;
yVelo = 1;
lev = 0;// All above reinitialize the pong variables.
}
start = 1; // Keeps the program from constantly reinitalizing.
g.setColor(Color.black);
g.fillRoundRect(paddleX, paddleY, 80, 10, 10, 10); // Creates Paddle.
ballX += xVelo; // Moves the ball according to velocity.
ballY += yVelo; // Moves the ball according to velocity.
g.fillOval(ballX, ballY, 25, 25); // Creats pong ball.
g.setFont(arial);
fontWidth11 = fontMetricsName.stringWidth("Score: " + score);
xPosition11 = size().width - fontWidth11;
g.drawString("Score: " + score, 700 - fontWidth11, 20); // Creates a score display in the top right of the screen.
if (ballX < 0) {
xVelo = -xVelo; // Left Wall Collision.
}
if (ballX > 675) {
xVelo = -xVelo; // Right Wall Collision.
}
if (ballY < 0) {
yVelo = -yVelo; // Top Wall Collision
}
if (ballY > 475) {
start = 0; // Allows pong settings to reinitialize on re-start up.
level = 6; // Displays game over screen.
record = 1; // Tells it to record the score of the player.
lev = 1; // Says this was a single player game.
repaint();
}
if (ballX >= paddleX && ballX <= paddleX + 80 && ballY >= paddleY && ballY <= paddleY + 10 && ballY < 490 || ballX + 25 >= paddleX && ballX + 25 <= paddleX + 80 && ballY + 25 >= paddleY && ballY + 25 <= paddleY + 10 && ballY < 490 || ballX + 25 >= paddleX && ballX + 25 <= paddleX + 80 && ballY >= paddleY && ballY <= paddleY + 10 && ballY < 490 || ballX >= paddleX && ballX <= paddleX + 80 && ballY + 25 >= paddleY && ballY + 25 <= paddleY + 10 && ballY < 490) {
yVelo = -yVelo;
ballY = 465;
score += 1; // Collsion with paddle along with a score increase. The paddle collision works by detecting all corner of the ball and disallowing the ball to travel inside of the paddle. This also raises the balls to the top of the paddle to avoid it from being stuck inside and rapidly collide without getting out.
}
} else if (level == 3) { // Rules Screen
g.drawImage(background, 0, 0, 700, 500, this); // Creates a background image.
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Rules", 0, 24);
g.setFont(arial3);
g.drawString("Move the paddle to keep the ball from hitting the bottom edge of the screen.", 0, 36);
g.drawString("A point will be scored every time the user successfully intercepts the ball.", 0, 48);
g.drawString("Try to maximize your high score and challenge friends to beat you.", 0, 60);
g.drawString("Once the ball hits the bottom of the screen it is game over.", 0, 72); // Displays all the rules needed and the title.
fontWidth7 = fontMetricsName.stringWidth("Return to Main Menu");
xPosition7 = 0;
g.fillRoundRect(xPosition7, 96, fontWidth7, 28, 10, 10);
g.setColor(Color.white);
g.setFont(arial);
g.drawString("Return to Main Menu", xPosition7, 120); // Creates a Return to Main Menu button.
} else if (level == 4) { // Creates Controls Screen
g.drawImage(background, 0, 0, 700, 500, this); // Displays the background image.
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Controls", 0, 24);
g.setFont(arial3);
g.drawString("Left Arrow Key: Move Paddle Left", 0, 36);
g.drawString("Right Arrow Key: Move Paddle Right", 0, 48);
g.drawString("A: Move Paddle Left (Player 2)", 0, 60);
g.drawString("D: Move Paddle Right (Player 2)", 0, 72);
g.drawString("Up Arrow Key: Increase Ball Speed", 0, 84);
g.drawString("Down Arrow Key: Decrease Ball Speed", 0, 96);
g.drawString("P: Pause Game", 0, 108);
g.drawString("Q: Quit Game", 0, 120); // Displays all controls along with a title.
fontWidth8 = fontMetricsName.stringWidth("Return to Main Menu");
xPosition8 = 0;
g.fillRoundRect(xPosition8, 126, fontWidth8, 28, 10, 10);
g.setColor(Color.white);
g.setFont(arial);
g.drawString("Return to Main Menu", xPosition8, 150); // Creates a Return to Main Menu button.
} else if (level == 5) { // Exits Game
System.exit(0); // Closes the applet.
} else if (level == 6) { // Game Over / Highscore
while (record == 1) { // Checks to see if it should record a score.
high[5] = score; // Sets score to the appropriate spot in the array.
score = 0; // Resets the score for next round.
bubbleSort(high); // Sorts it so that the highest number will be displayed first.
record = 0; // Used so that it will only record once.
}
g.drawImage(background, 0, 0, 700, 500, this); // Displays the background image.
fontWidth10 = fontMetricsName.stringWidth("Return to Main Menu");
xPosition10 = (size().width - fontWidth10) / 2;
g.fillRoundRect(xPosition10, 426, fontWidth10, 28, 10, 10);
g.setColor(Color.white);
g.setFont(arial);
g.drawString("Return to Main Menu", xPosition10, 450); // Creates Return to Main Menu button.
g.setColor(Color.black);
if (lev == 0) { // When a 2 player game is quit.
fontWidth20 = fontMetricsName.stringWidth("Rage Quit!");
xPosition20 = (size().width - fontWidth20) / 2;
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Rage Quit!", xPosition20, 150); // Displays the words rage quit.
}
if (lev == 1) { // When a single player game is over.
fontWidth9 = fontMetricsName.stringWidth("Game Over");
xPosition9 = (size().width - fontWidth9) / 2;
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Game Over", xPosition9, 150); // Displays game over.
g.drawString("High Score:", xPosition9, 180);
g.drawString("1. " + high[0], xPosition9, 210);
g.drawString("2. " + high[1], xPosition9, 240);
g.drawString("3. " + high[2], xPosition9, 270);
g.drawString("4. " + high[3], xPosition9, 300);
g.drawString("5. " + high[4], xPosition9, 330);// Displays the high score chart.
}
if (lev == 2) { // If a 2 player game is finished.
if (win == 1) { // If Player One wins the game
fontWidth18 = fontMetricsName.stringWidth("Player 1 Wins!");
xPosition18 = (size().width - fontWidth18) / 2;
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Player 1 Wins!", xPosition18, 150); // Displays Player 1 Wins.
} else if (win == 2) { // If Player Two wins the game
fontWidth19 = fontMetricsName.stringWidth("Player 2 Wins!");
xPosition19 = (size().width - fontWidth19) / 2;
g.setColor(Color.black);
g.setFont(arial);
g.drawString("Player 2 Wins!", xPosition19, 150); // Display Player 2 Wins.
}
}
} else if (level == 7) { // 2 Player Pong
if (start == 0) {
ballX = (int) (Math.random() * (675 - 25 + 1)) + 25;
ballY = (int) (Math.random() * (300 - 25 + 1)) + 25;
paddleX = 325;
paddleY = 490;
paddleX2 = 325;
paddleY2 = 0;
xVelo = 1;
yVelo = 1;
lev = 0; // Reinitializes the variables for pong.
}
start = 1; // Keeps reinitializing from happening over and over.
g.setColor(Color.black);
g.fillRoundRect(paddleX, paddleY, 80, 10, 10, 10);
g.fillRoundRect(paddleX2, paddleY2, 80, 10, 10, 10); // Creates both paddles.
ballX += xVelo; // Moves the ball according to velocity.
ballY += yVelo; // Moves the ball according to velocity.
g.fillOval(ballX, ballY, 25, 25); // Displays the ball.
if (ballX < 0) {
xVelo = -xVelo; // Left Wall Collison
}
if (ballX > 675) { // Right Wall Collison
xVelo = -xVelo;
}
if (ballY < 0) { // Ball exits in player 2's side of the screen.
start = 0; // So that variables will reinitialize when a new game is started.
level = 6; //Opens the Game Over Screen
lev = 2; // Tells the program it is a 2 player game.
win = 1; // Will display that Player 1 wins.
repaint();
}
if (ballY > 475) { // Ball exits in player 1's side of the screen.
start = 0; // So that variables will reinitialize when a new game is started.
level = 6; //Opens the Game Over Screen
lev = 2; // Tells the program it is a 2 player game.
win = 2; // Will display that Player 2 wins.
repaint();
}
if (ballX >= paddleX && ballX <= paddleX + 80 && ballY >= paddleY && ballY <= paddleY + 10 && ballY < 490 || ballX + 25 >= paddleX && ballX + 25 <= paddleX + 80 && ballY + 25 >= paddleY && ballY + 25 <= paddleY + 10 && ballY < 490 || ballX + 25 >= paddleX && ballX + 25 <= paddleX + 80 && ballY >= paddleY && ballY <= paddleY + 10 && ballY < 490 || ballX >= paddleX && ballX <= paddleX + 80 && ballY + 25 >= paddleY && ballY + 25 <= paddleY + 10 && ballY < 490) {
yVelo = -yVelo;
ballY = 465; // Collsion with paddle. The paddle collision works by detecting all corner of the ball and disallowing the ball to travel inside of the paddle. This also raises the balls to the top of the paddle to avoid it from being stuck inside and rapidly collide without getting out.
}
if (ballX >= paddleX2 && ballX <= paddleX2 + 80 && ballY >= paddleY2 && ballY <= paddleY2 + 10 && ballY > 0 || ballX + 25 >= paddleX2 && ballX + 25 <= paddleX2 + 80 && ballY + 25 >= paddleY2 && ballY + 25 <= paddleY2 + 10 && ballY > 0 || ballX + 25 >= paddleX2 && ballX + 25 <= paddleX2 + 80 && ballY >= paddleY2 && ballY <= paddleY2 + 10 && ballY > 0 || ballX >= paddleX2 && ballX <= paddleX2 + 80 && ballY + 25 >= paddleY2 && ballY + 25 <= paddleY2 + 10 && ballY > 0) {
yVelo = -yVelo;
ballY = 10; // Collsion with paddle 2. The paddle collision works by detecting all corner of the ball and disallowing the ball to travel inside of the paddle. This also raises the balls to the bottom of the paddle to avoid it from being stuck inside and rapidly collide without getting out.
}
}
if (x2 >= xPosition2 && x2 <= xPosition2 + fontWidth2 && y2 >= 80 && y2 <= 108 && level == 1) { // Detects when the Start Game button is pressed.
level = 2; // Starts up the game.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition3 && x2 <= xPosition3 + fontWidth3 && y2 >= 280 && y2 <= 308 && level == 1) {
level = 3; // Displays the rules screen
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition4 && x2 <= xPosition4 + fontWidth4 && y2 >= 380 && y2 <= 408 && level == 1) {
level = 4; // Displays the controls screen.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition4 && x2 <= xPosition4 + fontWidth4 && y2 >= 470 && y2 <= 498 && level == 1) {
level = 5; // Exits the program
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition7 && x2 <= xPosition7 + fontWidth7 && y2 >= 96 && y2 <= 124 && level == 3) {
level = 1; // Opens the Main Menu.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition8 && x2 <= xPosition8 + fontWidth8 && y2 >= 126 && y2 <= 154 && level == 4) {
level = 1; // Opens the Main Menu.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition10 && x2 <= xPosition10 + fontWidth10 && y2 >= 426 && y2 <= 454 && level == 6) {
level = 1; // Opens the Main Menu.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
if (x2 >= xPosition17 && x2 <= xPosition17 + fontWidth17 && y2 >= 180 && y2 <= 208 && level == 1) {
level = 7; // Starts up 2 player pong.
x2 = 0;
y2 = 0; // Resets the x an y co-ordinates.
repaint();
}
}
private static void bubbleSort(int[] high) {
int n = high.length; // Sets n to the length of the array.
int temp = 0; // Declares a temperary variable
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < (n - i - 1); j++) {
if (high[j] < high[j + 1]) {
temp = high[j];
high[j] = high[j + 1];
high[j + 1] = temp; // Sorts in reverse order, placing the highest numbers first in the list.
}
}
}
}
}