今天搞了个开车的可以玩,但是就是觉得有几个地方不是很好.大家可以帮我优化一下.
CarRace.java
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.util.*;

class Car
{
Image img;
int x, y;
Dimension dim;

Car(Image img)
{
this.img=img;
}

Car(Image img, int x, int y)
{
this.img=img; this.x=x; this.y=y;
}

Car(Image img, int x, int y, Dimension dim)
{
this(img, x, y);
this.dim=dim;
}

void draw(Graphics g, ImageObserver observer)
{
g.drawImage(img, x, y, observer);
}

int getX()
{ return x;}

int getY()
{ return y;}

void setX(int x)
{this.x=x;}

void setY(int y)
{this.y=y;}

void setLocation(int x, int y)
{
this.x=x; this.y=y;
}

int getWidth()
{ return img.getWidth(null);}

int getHeight()
{ return img.getHeight(null);}

Rectangle2D getRectangle()
{
return new Rectangle2D.Float(x, y, getWidth(), getHeight());
}

void move(int dx, int dy)
{
x+=dx;
y+=dy;

if(dim!=null)
{
if(x<0)x=0;
if(x+getWidth()>dim.getWidth())
x=(int)dim.getWidth()-getWidth();
if(y<0)x=0;
if(y+getWidth()>dim.getHeight())
x=(int)dim.getWidth()-getHeight();
}
}

boolean intersects(Car car)
{
return getRectangle().intersects(car.getRectangle());
}

boolean intersects(int x, int y)
{
return getRectangle().intersects(x, y, getWidth(), getHeight());
}
}

public class CarRace extends Applet implements KeyListener, Runnable
{
Image buff;
Canvas screen;
Graphics2D gs, gb;
Car redCar;
Car[] enemy=new Car[20];
Button bStart;
Thread game;
boolean loop=true;
Dimension dim=new Dimension(200, 300);
int road;
Random rnd=new Random();

public void init()
{
prepareResource();
setBackground(Color.blue);
initScreen();
add(screen);
bStart=new Button("开始游戏");
add(bStart);

bStart.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent ae)
{
screen.requestFocus();
if(!game.isAlive())
game.start();
}
});
}

void prepareResource()
{
Image imgRed=getImage(getCodeBase(),"images/red_car.gif");//这个是汽车的图片(需要图片的加我的QQ:251342771)
Image imgBlue=getImage(getCodeBase(),"images/blue_car.gif");//这个是汽车的图片
Image imgGreen=getImage(getCodeBase(),"images/green_car.gif");//这个是汽车的图片
MediaTracker mt=new MediaTracker(this);

try
{
mt.addImage(imgRed, 0);
mt.addImage(imgBlue, 1);
mt.addImage(imgGreen, 2);
mt.waitForAll();

}catch(Exception e)
{}
buff=createImage((int)dim.getWidth(), (int)dim.getHeight());
gb=(Graphics2D)buff.getGraphics();
redCar=new Car(imgRed, 80,250, dim);

for(int i=0;i<10;i++)
{
enemy[i]=new Car(imgBlue, 0, 0);
}

for(int i=10;i<enemy.length;i++)
{
enemy[i]=new Car(imgGreen, 0, 0);
}

for(int i=0;i<enemy.length;i++)
{
setEnemy(i);
}
game=new Thread(this);
}

public void stop()
{
loop=false;
}

public void run()
{

while(loop)
{
drawScreen();

try
{ Thread.sleep(50);}catch(Exception e)
{}
}
}

void initScreen()
{

screen=new Canvas()
{

public void paint(Graphics g)
{

if(gs==null)
{
gs=(Graphics2D)screen.getGraphics();
}
drawScreen();
}
};
screen.setSize(dim);
screen.addKeyListener(this);
}

void setEnemy(int en)
{
int x, y;

next:while(true)
{
x=rnd.nextInt((int)dim.getWidth()-enemy[en].getWidth());
y=-rnd.nextInt(5000)-200;

outer: for(int j=0;j<enemy.length;j++)
{
if(j!=en && enemy[j].intersects(x, y))continue next;
}
enemy[en].setLocation(x, y);
break;
}
}

void check(Car en)
{

if(redCar.intersects(en))
{

if(redCar.getX()>en.getX())
{
en.move(-20, 0);
redCar.move(20, 0);
}

else
{
en.move(20,0);
redCar.move(-20, 0);
}
}
}

synchronized void drawScreen()
{
gb.clearRect(0, 0, (int)dim.getWidth(), (int)dim.getHeight());
gb.setPaint(new Color(100, 100, 100));
gb.fillRect(0, 0, (int)dim.getWidth(), (int)dim.getHeight());
drawRoad();

for(int i=0;i<enemy.length;i++)
{
enemy[i].move(0, 15);
enemy[i].draw(gb, screen);
if(enemy[i].getY()>dim.getHeight())
setEnemy(i);
check(enemy[i]);
}
redCar.draw(gb, screen);
gs.drawImage(buff, 0,0, screen);
}

void drawRoad()
{
road+=80;
gb.setPaint(Color.yellow);
gb.fillRect((int)dim.getWidth()/2, road,10,150);
if(road>=dim.getHeight())road=-150;
}

public void keyPressed(KeyEvent ke)
{

if(ke.getKeyCode()==KeyEvent.VK_LEFT)
{
redCar.move(-10,0);
}

else if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
{
redCar.move(10,0);
}

else if(ke.getKeyCode()==KeyEvent.VK_UP)
{
redCar.move(0,-10);
}

else if(ke.getKeyCode()==KeyEvent.VK_DOWN)
{
redCar.move(0,10);
}
}

public void keyReleased(KeyEvent ke)
{}

public void keyTyped(KeyEvent ke)
{}
}CarRace.html
<html>
<body>
<center>
<applet code="CarRace.class" width=250 height=350>
</applet>
</center>
</body>
</html>