⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carrace.java

📁 一个非常简单的赛车小游戏,含源码,适合初学者.
💻 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;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()   //若转向其他网页,则停止game线程。loop=false.
	{
		loop=false;
	}
	
	public void run()      //以给定的时间间隔反复调用drawScreen()方法
	{
		while(loop)
		{
			drawScreen();
			try
			{
				Thread.sleep(50);
			}
			catch(Exception e)
			{
			}
		}
	}
	
	void initScreen()   //创建screen对象,并覆写Paint()方法。将screen的大小设定为dim(成员变量),并注册监听事件
	{
		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) //随机确定第en个敌车的位置
	{
		int x,y;
		next:while(true)
		{
			x=rnd.nextInt((int)dim.getWidth()-enemy[en].getWidth());
			y=-rnd.nextInt(5000)-200;
			
			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) //检查主车与敌对车en是否发生了冲突,若是,则刻画冲突效果
	{
		if(redCar.intersects(en)) //如果红车与敌对车部分重叠
		{
			if(redCar.getX()>en.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;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);
		}
	}
	public void keyReleased(KeyEvent ke){}
	public void keyTyped(KeyEvent ke){}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -