www.pudn.com > racecar.rar > CarRace.java


package CarPackage; 
 
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类构造函数,完成情况下的初始化 
	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); 
	} 
	 
	//获得x的坐标 
	int getX() 
	{ 
		return x; 
	} 
	 
	//获得y的坐标 
	int getY() 
	{ 
		return y; 
	} 
	 
	//设定x的坐标 
	void setX(int x) 
	{ 
		this.x=x; 
	} 
	 
	//设定y的坐标 
	void setY(int y) 
	{ 
		this.y=y; 
	} 
	 
	//将坐标移至(x,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()); 
	} 
	 
	//将汽车在x坐标移动dx,在y坐标移动dy 
	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(); 
			} 
		} 
	} 
	 
	//若当前汽车与car发生冲突,则返回true。否则返回false 
	boolean intersects(Car car) 
	{ 
		return getRectangle().intersects(car.getRectangle()); 
	} 
	 
	//若当前汽车与其(x,y)位置处的其他汽车发生冲突,则返回true;否则返回false 
	boolean intersects(int x,int y) 
	{ 
		return getRectangle().intersects(x,y,getWidth(),getHeight()); 
	} 
} 
 
public class CarRace extends Applet implements KeyListener,Runnable //CarRace用于管理整个程序 
{ 
	Image buff;       //使用Double Buffering(双缓冲)的Image变量 
	Canvas screen;		//程序运行时的画面 
	Graphics2D gs,gb;	//表示screen与buff的Graphics2D对象引用变量 
	Car redCar;			//主车 
	Car[] enemy=new Car[20];//20辆敌对车 
	Button bStart;//“开始游戏”按牛 
	Thread game;//游戏线程 
	boolean loop=true;//控制游戏的布尔变量。若loop为false,则停止game线程 
	Dimension dim=new Dimension(200,300);//screen的大小 
	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"); 
		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;ien.getX())//如果红车在敌对车右边 
			{ 
				en.move(-20, 0);          //敌对车向左边偏20 
				redCar.move(20, 0);			//红车向右边偏20 
			} 
			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;idim.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); 
		} 
	} 
	public void keyReleased(KeyEvent ke){} 
	public void keyTyped(KeyEvent ke){} 
}