import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
//创建的类 继承于JFrame
class Pengzhuang extends JFrame{
//设置游戏屏幕大小
final int WIDTH = 450, HEIGHT = 400;
//设置车的行驶速度
double p1Speed = .5 , p2Speed = .5;
//用0,1,2,3表示赛车的方向(上左右下)
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT =3;
//赛车的行驶方向默认向上
int p1Direction = UP;
int p2Direction = UP;
//创建矩形的代码起初看上去有点复杂,但是矩形的创建大同小异,它们的大小取决于WIDTE和HEIGHT两个属性值
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 / 9) * 9 ,HEIGHT / 9);
Rectangle center = new Rectangle(((int)(WIDTH / 9 )* 2),(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 , HEIGHT / 30);
//用下面的矩形代表第二辆赛车
Rectangle p2 = new Rectangle(((WIDTH / 9)+((int)((WIDTH / 9) *1.5) / 2)) ,(HEIGHT / 2) + (HEIGHT / 10 ) , WIDTH / 30 , HEIGHT / 30);
//构造方法
public Pengzhuang(){
//通过下面代码设置JFrame
super("Radical Racing");
setSize(WIDTH , HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
//初始化内部类(两辆车同时行驶,通过线程实现)
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 line0 = new Rectangle(WIDTH / 9 ,HEIGHT / 2 ,(int)((WIDTH / 9) * 1.5)/2 , HEIGHT / 140);
//下面的矩形用于绘制内跑道的起跑线
Rectangle line1 = 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.WHITE);
//绘制起跑线
g.fillRect(line0.x ,line0.y ,line0.width ,line0.height);
g.fillRect(line1.x ,line1.y ,line1.width ,line1.height);
//绘制终点线为黄色
g.setColor(Color.YELLOW);
//绘制终点线
g.fillRect(finish.x ,finish.y ,finish.width ,finish.height);
//设置赛车1和颜色
g.fill3DRect(p1.x ,p1.y ,p1.width ,p1.height ,true);
g.setColor(Color.BLUE);
//绘制塞车2和颜色
g.fill3DRect(p2.x ,p2.y ,p2.width ,p2.height ,true);
g.setColor(Color.RED);
}
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 = -4;
}
//如果赛车撞到内环,那么也像撞到外墙一样减速,不同是减2.5
if(p1.intersects(center)){
p1Speed = -2.5;
}
//赛车在行驶中不断加速,最大为5
if(p1Speed <= 5){
p1Speed =p1Speed + .2;
}
//玩家通过键盘操作控制赛车的行驶方向
if(p1Direction == UP){
p1.y = p1.y - (int)p1Speed;
}
if(p1Direction == DOWN){
p1.y = p1.y - (int)p1Speed;
}
if(p1Direction == LEFT){
p1.x = p1.x - (int)p1Speed;
}
if(p1Direction == RIGHT){
p1.x = p1.x - (int)p1Speed;
}
//赛车每次向前行驶的时间间隔为75ms
Thread.sleep(75);
}catch(Exception e){
//如果程序运行错误,那么退出循环
break;
}
}
}
//该方法在按下某个键是调用
public void keyPressed(KeyEvent event){}
//该方法在释放某个键时调用
public void keyReleased(KeyEvent evnet){}
//该方法在键入某个键时调用
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;
}
}