import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;
import java.io.*;
import java.net.*;
import java.applet.AudioClip;
public class GameRace extends JFrame {
final int WIDTH = 900, HEIGHT = 650;
boolean winnerChosen = false;
double p1Speed =15, p2Speed =15;
int p1Laps = 0, p2Laps = 0;
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3;
int p1Direction = UP;
int p2Direction = UP;
Rectangle left = new Rectangle(0,0,WIDTH/9, HEIGHT);
Rectangle right = new Rectangle((WIDTH/9)*8,0,WIDTH/9,HEIGHT);
Rectangle top = new Rectangle(0,0,WIDTH,HEIGHT/9);
Rectangle bottom = new Rectangle(0, (HEIGHT/9)*8,WIDTH,HEIGHT/9);
Rectangle center = new Rectangle((int)((WIDTH/9) *2.5), (int)((HEIGHT/9)*2.5), (int) ((WIDTH/9)*5),
(HEIGHT/9)*4);
Rectangle obstacle = new Rectangle(WIDTH/2, (int)((HEIGHT/9)*7),WIDTH/10,
HEIGHT/9);
Rectangle obstacle2 = new Rectangle(WIDTH/3, (int)((HEIGHT/9)*5),
WIDTH/10,HEIGHT/4);
Rectangle obstacle3 = new Rectangle(2*(WIDTH/3), (int)((HEIGHT/9)*5),
WIDTH/10,HEIGHT/4);
Rectangle obstacle4 = new Rectangle(WIDTH/3,HEIGHT/9,WIDTH/30,HEIGHT/9);
Rectangle obstacle5 = new Rectangle(WIDTH/2, (int)((HEIGHT/9)*1.5),
WIDTH/30,HEIGHT/4);
Rectangle finish = new Rectangle(WIDTH/9, (HEIGHT/2) -HEIGHT/9,
(int)((WIDTH/9)*1.5),HEIGHT/70);
Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2, WIDTH/30,WIDTH/30);
Rectangle p2 = new Rectangle(((WIDTH/9)+ ((int)((WIDTH/9)*1.5)/2)), (HEIGHT/2)+
(HEIGHT/10), WIDTH/30,WIDTH/30);
public GameRace()
{
super("Radical Racing");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
JOptionPane.showMessageDialog(null, "Welcome To Radical Racing!\n\n"+"Game: 2 player oponent\n"+
"Complete 3 full laps before your oponent!\n"+"Controls:\n"+"Player1(BLUE CAR):\n"+"WASD letters, speed is automatic \n"+"Player2(RED CAR):\n"+"IJKL letters, speed is automatic\n"+"Click OK to start");
Move1 m1 = new Move1();
Move2 m2 = new Move2();
m1.start();
m2.start();
}
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,WIDTH,HEIGHT);
g.setColor(Color.GREEN);
Rectangle lineO = new Rectangle(WIDTH/9,HEIGHT/2, (int)((WIDTH/9)*1.5)/2,HEIGHT/140);
Rectangle lineI = new Rectangle(((WIDTH/9)+((int)((WIDTH/9)*1.5)/2)),(HEIGHT/2)+
(HEIGHT/10), (int)((WIDTH/9)*1.5)/2,HEIGHT/140);
g.fillRect(left.x,left.y,left.width,left.height);
g.fillRect(right.x,right.y,right.width,right.height);
g.fillRect(top.x,top.y,top.width,top.height);
g.fillRect(bottom.x,bottom.y,bottom.width,bottom.height);
g.fillRect(center.x,center.y,center.width,center.height);
g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height);
g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height);
g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height);
g.fillRect(obstacle4.x,obstacle4.y,obstacle4.width,obstacle4.height);
g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height);
g.setColor(Color.BLUE);
g.fill3DRect(p1.x,p1.y,p1.width,p1.height,true);
g.setColor(Color.RED);
g.fill3DRect(p2.x,p2.y,p2.width,p2.height,true);
g.setColor(Color.WHITE);
g.fillRect(lineO.x,lineO.y,lineO.width,lineO.height);
g.fillRect(lineI.x,lineI.y,lineI.width,lineI.height);
g.setColor(Color.YELLOW);
g.fillRect(finish.x,finish.y,finish.width,finish.height);
}
private class Move1 extends Thread implements KeyListener
{
public void run()
{
addKeyListener(this);
while(true) {
try {
repaint();
if(p1.intersects(left) || p1.intersects(right) ||
p1.intersects(top) || p1.intersects(bottom) ||
p1.intersects(obstacle) || p1.intersects(obstacle2) ||
p1.intersects(p2) || p1.intersects(obstacle3) ||
p1.intersects(obstacle4) || p1.intersects(obstacle5))
{
p1Speed = -19;
}
if(p1.intersects(center))
{
p1Speed = -19;
}
if(p1.intersects(finish)&&p1Direction==UP) {
p1Laps++;
}
if(p1Laps>=24)
{
if(!winnerChosen)
{
winnerChosen = true;JOptionPane.showMessageDialog(null, "Player 1Wins!!!");
break;
}
else
{
JOptionPane.showMessageDialog(null, "Player 1 Looser...");
break;
}
}
if(p1Speed<5)
{
p1Speed+=20;
}
if(p1Direction==UP)
{
p1.y-=(int)p1Speed;
}
if(p1Direction==DOWN)
{
p1.y+=(int)p1Speed;
}
if(p1Direction==LEFT)
{
p1.x-=(int)p1Speed;
}
if(p1Direction==RIGHT)
{
p1.x+=(int)p1Speed;
}
Thread.sleep(75);
}
catch(Exception e) {
break;
}
}
}
public void keyPressed(KeyEvent event)
{
}
public void keyReleased(KeyEvent event)
{
}
public void keyTyped(KeyEvent event)
{
if(event.getKeyChar()=='a')
{
p1Direction = LEFT;
}
if(event.getKeyChar()=='s')
{
p1Direction = DOWN;
}
if(event.getKeyChar()=='d')
{
p1Direction = RIGHT;
}
if(event.getKeyChar()=='w')
{
p1Direction = UP;
}
}
}
private class Move2 extends Thread implements KeyListener
{
public void run()
{
addKeyListener(this);
while(true) {
try {
repaint();
if(p2.intersects(left) || p2.intersects(right) ||
p2.intersects(top) || p2.intersects(bottom) ||
p2.intersects(obstacle) || p2.intersects(obstacle2) ||
p1.intersects(p2) || p2.intersects(obstacle4) ||
p2.intersects(obstacle3) || p2.intersects(obstacle5))
{
p2Speed = -19;
}
if(p2.intersects(center))
{
p2Speed = -19;
}
if(p2.intersects(finish)&&p2Direction==UP)
{
p2Laps++;
}
if(p2Laps>=24)
{
if(!winnerChosen)
{
winnerChosen = true;
JOptionPane.showMessageDialog(null, ",Player 2 WINS!!!");
break;
}
else
{
JOptionPane.showMessageDialog(null, "Player 2: LOOSER\n"+"Player 1:WINNER");
break;
}
}
if(p2Speed<=5)
{
p2Speed+=20;
}
if(p2Direction==UP)
{
p2.y-=(int)p2Speed;
}
if(p2Direction==DOWN)
{
p2.y+=(int)p2Speed;
}
if(p2Direction==LEFT)
{
p2.x-=(int)p2Speed;
}
if(p2Direction==RIGHT)
{
p2.x+=(int)p2Speed;
}
Thread.sleep(75);
}
catch(Exception e)
{
break;
}
}
}
public void keyPressed(KeyEvent event)
{
}
public void keyReleased(KeyEvent event)
{
}
public void keyTyped(KeyEvent event)
{
if(event.getKeyChar()=='j')
{
p2Direction = LEFT;
}
if(event.getKeyChar()=='k')
{
p2Direction = DOWN;
}
if(event.getKeyChar()=='l')
{
p2Direction = RIGHT;
}
if(event.getKeyChar()=='i')
{
p2Direction = UP;
}
}
}
public static void main(String args[]) {
new GameRace();
}
}