import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.JApplet;
public class SinglePlayer
extends JFrame
implements KeyListener {
// just a random variable to randomize some things
static Random rand = new Random(System.currentTimeMillis());
// the width & height for our applet
public static int width = 500, height = 500;
// will the user be playing against the computer or a person
//public boolean twoPlayers = false;
// is the game paused
boolean paused = true;
// what is the top boundary
int top = 20;
// information to be displayed
static String info = "TECHNO PONG";
static String pause1 = "blue player use a/z";
static String pause2 = "red player use k/m";
static String pause3 = "p to pause";
// font to display normal info
Font defFont = new Font("arial", 0, 12);
// double buffering stuff
Image dbImage;
Graphics dbGraphics;
// the ball
Ball ball = new Ball(this, width/2, height/2, 2, 2, top, height);
// the paddles
Paddle leftPaddle = new Paddle(Paddle.TYPE_LEFT, 5,
height/2, top, height, 'a', 'z');
Paddle rightPaddle = new Paddle(Paddle.TYPE_RIGHT,
width-Paddle.width-5, height/2, top, height, 'k', 'm');
// scores
int leftScore=0;
int rightScore=0;
// font used to display score
Font scoreFont = new Font("Arial", 0, 18);
/**
* Initialize method, it will start up pong
* and keep it going.
*/
public SinglePlayer()
{
init();
setSize(width, height);
setVisible(true);
setResizable(false);
}
public void init() {
// ask the user if they want to play against the computer
int option = JOptionPane.showConfirmDialog(this,
"placeholder",
"Competition", JOptionPane.OK_OPTION);
// set the size and background color
this.setSize(width, height);
this.getContentPane().setBackground(Color.black);
// create the double buffering images/graphics
this.dbImage = this.createImage(width, height);
this.dbGraphics = this.dbImage.getGraphics();
// give ability to catch keyboard input
this.addKeyListener(this);
// a new thread that keeps on updating our applet
new Thread() {
public void run() {
while(true) {
// do if paused
if(!paused) {
// update and paint our game often
updatePong();
paint(getGraphics());
pause(5);
} else {
// paint our game only, we are paused
paint(getGraphics());
pause(100);
}
}
}
}.start();
}
/* updates the game */
public void updatePong() {
updateBall();
updatePaddles();
}
/* update our ball */
public void updateBall() {
checkBallWithPaddle(ball, leftPaddle);
checkBallWithPaddle(ball, rightPaddle);
ball.update();
}
/* check to see if the given ball collided with the given paddle */
public void checkBallWithPaddle(Ball ball, Paddle paddle) {
// make some temp variables for easy referencing
int bx = ball.xLoc, by = ball.yLoc, bs = ball.size;
int px = paddle.xLoc, py = paddle.yLoc;
int pw = Paddle.width, ph = Paddle.height, sec = ph/5;
boolean ballCollided=false;
if(paddle.myType == Paddle.TYPE_LEFT) {
if(isWithin(px, px+pw, bx, 0) && isWithin(py, py+ph, by, bs)) {
ballCollided = true;
ball.xLoc = px+pw;
}
} else {
if(isWithin(px, px+pw, bx+bs, 0) && isWithin(py, py+ph, by, bs)) {
ballCollided = true;
ball.xLoc = px-bs;
}
}
if(ballCollided) {
// bounce the ball
ball.bounceX();
// randomize the bounce a little
int change = rand.nextInt(4);
int change2 = rand.nextInt(2)-1;
// depending on where the ball hit the paddle
// change the velocity a little
if(by<=py+sec)
ball.yVel -= change;
else if(by<=py+(2*sec))
ball.yVel -= (change/2);
else if(by >= py+(3*sec))
ball.yVel += (change/2);
else if(by >= py+(4*sec))
ball.yVel += change;
else
ball.yVel += change2*change;
}
}
// check if the targed is within the given range with size buffer
public static boolean isWithin(int min, int max, int target, int size) {
if(min > max) {
int temp = min;
min = max;
max = temp;
}
if(target+size>=min && target<=max)
return true;
return false;
}
public void updatePaddles() {
leftPaddle.update();
// pick which update to do, user or ai
if(PongGui.twoplayers)
rightPaddle.update();
else
rightPaddle.aiUpdate(ball);
}
/* paint function */
public void paint(Graphics g) {
super.paint(dbGraphics);
drawBall();
drawPaddles();
drawScore();
drawBoard();
drawInfo();
if(paused)
drawPause();
// update our screen
update(g);
}
public void drawBall() {
dbGraphics.setColor(Color.white);
dbGraphics.fillOval(ball.xLoc, ball.yLoc, ball.size, ball.size);
}
public void drawPaddles() {
dbGraphics.setColor(Color.blue);
dbGraphics.fillRect(leftPaddle.xLoc, leftPaddle.yLoc,
Paddle.width, Paddle.height);
dbGraphics.setColor(Color.red);
dbGraphics.fillRect(rightPaddle.xLoc, rightPaddle.yLoc,
Paddle.width, Paddle.height);
}
public void drawScore() {
dbGraphics.setFont(scoreFont);
dbGraphics.setColor(Color.blue);
dbGraphics.drawString(""+leftScore, 10, top-1);
dbGraphics.setColor(Color.red);
dbGraphics.drawString(""+rightScore, width-50, top-1);
}
public void drawBoard() {
dbGraphics.setColor(Color.white);
dbGraphics.drawLine(0, top, width, top);
}
public void drawInfo() {
dbGraphics.setColor(Color.white);
dbGraphics.setFont(scoreFont);
dbGraphics.drawString(info, (width/2)-50, top-5);
}
public void drawPause() {
dbGraphics.setFont(defFont);
int x = width/2;
int y = top+30;
dbGraphics.setColor(Color.blue);
dbGraphics.drawString(pause1, x-48, y-15);
dbGraphics.setColor(Color.red);
dbGraphics.drawString(pause2, x-48, y);
dbGraphics.setColor(Color.white);
dbGraphics.drawString(pause3, x-28, y+15);
}
public void update(Graphics g) {
if(g == null)
return;
g.drawImage(this.dbImage, 0,0, this);
}
// gets called whena key is pressed
public void keyPressed(KeyEvent e) {
//send the key press to each of the paddles
leftPaddle.handleKey(e.getKeyChar(), true);
rightPaddle.handleKey(e.getKeyChar(), true);
}
// gets call when a key is released
public void keyReleased(KeyEvent e) {
// pause the game if need be
if(e.getKeyChar() == 'p')
paused = !paused;
// send the signal to each of the paddles
leftPaddle.handleKey(e.getKeyChar(), false);
rightPaddle.handleKey(e.getKeyChar(), false);
}
// the ball went out
public void ballOut(boolean outAtRight) {
// on the left side
if(ball.xLoc < 10)
rightScore++;
else// on the right side
leftScore++;
// reset the ball
ball.reset();
// pause the game
paused = true;
}
// do nothing on type
public void keyTyped(KeyEvent e) {;}
// makes the program sleep for a little bit
public static void pause(long millis) {
try{Thread.sleep(millis);}
catch(Exception e) {;}
}
public static void main(String[] args)
{
new SinglePlayer();
}
}