📄 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;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 + -