JAVA 期末作业 GUI 坦克大战


代码:

主类:

创建游戏窗口对象,调用启动方法

public class TankWar {
    public static void main(String[] args) {
        //创建游戏窗口对象,调用运行方法
        new GamePanel().lunch();
    }
}

游戏对象类:

所有游戏对象的超类

 1 import java.awt.*;
 2 
 3 public abstract class GameObject {
 4     //图像
 5     protected Image image;
 6     //坐标
 7     protected int x;
 8     protected int y;
 9     //定义四个bool方向变量,当方向变量为true时进行移动
10     protected boolean left = false;
11     protected boolean right = false;
12     protected boolean down = false;
13     protected boolean up = false;
14     //设置Jframe容器
15     protected GamePanel gamePanel;
16     //构造方法
17     public GameObject(String image, int x, int y, GamePanel gamePanel) {
18         this.image = Toolkit.getDefaultToolkit().getImage(image);
19         this.x = x;
20         this.y = y;
21         this.gamePanel = gamePanel;
22     }
23     //绘制自己
24     public abstract void paintSelf(Graphics g);
25     //返回矩形进行碰撞检测
26     public abstract Rectangle gerRec();
27 }

坦克类:

子类有玩家和地方坦克类

  1 import java.awt.*;
  2 import java.awt.event.KeyEvent;
  3 import java.util.ArrayList;
  4 import java.util.Iterator;
  5 import java.util.Random;
  6 //坦克类
  7 public abstract class Tank extends GameObject {
  8     //定义移动次数
  9     public int movetime= 0;
 10     //定义坦克长宽
 11     public int width = 40;
 12     public int height = 40;
 13     //移动速度
 14     protected int speed = 5;
 15     // 定义初始方向
 16     public Direction direction ;
 17     // 定义子弹发射冷却变量
 18     boolean attackCoolDown = true;
 19     //定义四个方向图片
 20     private String upImg;
 21     private String downImg;
 22     private String leftImg;
 23     private String rightImg;
 24 
 25 
 26     public Tank(String image, int x, int y, GamePanel gamePanel, String upImg, String downImg, String leftImg, String rightImg) {
 27         super(image, x, y, gamePanel);
 28         this.upImg = upImg;
 29         this.downImg = downImg;
 30         this.leftImg = leftImg;
 31         this.rightImg = rightImg;
 32     }
 33 
 34     //定义移动方法
 35     //向左移动
 36     public void leftward() {
 37         //判断的时坦克下一步移动的位置是否发生碰撞,如果没有碰撞到墙或者边界或者物体,则进行移动,否则只设置图片和方向;
 38         if (hitWall(x-speed,y)&&hitTank(x-speed,y))
 39         x -= speed;
 40         setImg(leftImg);
 41         direction = Direction.LEFT;
 42     }
 43 
 44     public void rightward() {
 45         if (hitWall(x+speed,y)&&hitTank(x+speed,y))
 46         x += speed;
 47         setImg(rightImg);
 48         direction = Direction.RIGHT;
 49     }
 50 
 51     public void upward() {
 52         if (hitWall(x,y-speed)&&hitTank(x,y-speed))
 53         y -= speed;
 54         setImg(upImg);
 55         direction = Direction.UP;
 56     }
 57 
 58     public void downward() {
 59         if (hitWall(x,y+speed)&&hitTank(x,y+speed))
 60         y += speed;
 61         setImg(downImg);
 62         //枚举
 63         direction = Direction.DOWN;
 64     }
 65 
 66     //设置坦克图片
 67     private void setImg(String Img) {
 68         this.image = Toolkit.getDefaultToolkit().getImage(Img);
 69     }
 70 
 71     //攻击方法,在键盘监听事件中调用攻击方法
 72     public void attack() {
 73         //如果攻击冷却为true则攻击
 74         if (attackCoolDown) {
 75             //创建子弹对象
 76             //获取坦克头部坐标
 77             Point p = getHeadPoint();
 78             Bullet bullet = new Bullet("images/bullet.png", p.x, p.y, this.gamePanel, direction);
 79             //将子弹添加到子弹集合中
 80             gamePanel.bullets.add(bullet);
 81             //启动线程,每隔一秒更改攻击冷却变量,实现攻击间隔为一秒
 82             new MyThread().start();
 83         }
 84 
 85     }
 86     //检测是否碰撞到坦克,若碰撞则返回false,否则返回true;
 87     public boolean hitTank(int a,int d)
 88     {
 89         Rectangle newrec = new Rectangle(a, d, width, height);
 90         //获得地方坦克集合,遍历
 91         ArrayList bots = gamePanel.bots;
 92         for (Bot b : bots)
 93         {
 94             if (b==this)
 95                 break;
 96             //利用intersects方法检测是否发生碰撞
 97             if (b.gerRec().intersects(newrec))
 98             {
 99                 //即将发生碰撞将该坦克移动次数设置为39,进行下一次移动则改变方向
100                 this.movetime = 39;
101                 return false;
102             }
103         }
104         return true;
105     }
106     //检测是否与围墙、边界、玩家和基地碰撞
107     public boolean hitWall(int a,int b)
108     {
109         Rectangle newrec = new Rectangle(a, b, width, height);
110         //获取围墙集合
111         ArrayList walls = gamePanel.walls;
112         for (Wall w : walls)
113         {
114             if (w.gerRec().intersects(newrec))
115             {
116                 this.movetime = 39;
117                 return false;
118             }
119         }
120         //检测是否碰撞边界
121         if (a<=5||a+width>=780||b<=25||b+height>=600)
122             return false;
123         //检测是否碰撞基地
124         if (newrec.intersects(gamePanel.base.gerRec()))
125             return false;
126         //检测是否碰撞玩家
127         if (this!=gamePanel.player)
128         {
129             if (this.gerRec().intersects(gamePanel.player.gerRec()))
130                 return false;
131         }
132         return true;
133     }
134     //得到坦克炮口坐标
135     public Point getHeadPoint() {
136         switch (direction) {
137             case UP:
138                 return new Point(x + width / 2, y);
139             case DOWN:
140                 return new Point(x + width / 2, y + height);
141             case LEFT:
142                 return new Point(x, y + height / 2);
143             case RIGHT:
144                 return new Point(x + width, y + height / 2);
145         }
146         return null;
147     }
148 
149 
150     @Override
151     public abstract void paintSelf(Graphics g);
152 
153     @Override
154     public abstract Rectangle gerRec();
155 
156     //自定义线程
157     class MyThread extends Thread {
158         @Override
159         public void run() {
160             attackCoolDown = false;
161             try {
162                 MyThread.sleep(1000);
163             } catch (InterruptedException e) {
164                 e.printStackTrace();
165             }
166             attackCoolDown = true;
167             this.stop();
168         }
169     }
170 }

玩家类

 1 import java.awt.*;
 2 import java.awt.event.KeyEvent;
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 
 6 public class Player extends Tank{
 7     public Player(String image, int x, int y, GamePanel gamePanel, String upImg, String downImg, String leftImg, String rightImg) {
 8         super(image, x, y, gamePanel, upImg, downImg, leftImg, rightImg);
 9     }
10     //添加键盘监听事件,按下则方向键则将坦克该方向设置为true
11     public void keyPressed(KeyEvent k) {
12 
13         switch (k.getKeyCode()) {
14             case KeyEvent.VK_UP:
15                 up = true;
16                 break;
17             case KeyEvent.VK_DOWN:
18                 down = true;
19                 break;
20             case KeyEvent.VK_LEFT:
21                 left = true;
22                 break;
23             case KeyEvent.VK_RIGHT:
24                 right = true;
25                 break;
26                 //按下空格调用攻击键
27             case KeyEvent.VK_SPACE:
28                 attack();
29         }
30     }
31     //按键松开时,将方向变量设为false,实现键盘按住不放时坦克可以持续移动
32     public void keyReleased(KeyEvent k) {
33         switch (k.getKeyCode()) {
34             case KeyEvent.VK_UP:
35                 up = false;
36                 break;
37             case KeyEvent.VK_DOWN:
38                 down = false;
39                 break;
40             case KeyEvent.VK_LEFT:
41                 left = false;
42                 break;
43             case KeyEvent.VK_RIGHT:
44                 right = false;
45                 break;
46         }
47     }
48     //方向变量为true则调用对应的移动方法
49     private void move() {
50         if(left)
51             leftward();
52         else if(right)
53             rightward();
54         else if(up)
55             upward();
56         else if(down)
57             downward();
58     }
59     //绘制自己,同时调用移动方法
60     @Override
61     public void paintSelf(Graphics g) {
62     g.drawImage(image,x,y,null);
63     move();
64     }
65     @Override
66     public Rectangle gerRec() {
67         return new Rectangle(x,y,width,height);
68     }
69 }

敌方坦克类

 1 import java.awt.*;
 2 import java.awt.event.KeyEvent;
 3 import java.util.ArrayList;
 4 import java.util.Random;
 5 //敌方坦克类
 6 public class Bot extends Tank{
 7 
 8 
 9     public Bot(String image, int x, int y, GamePanel gamePanel, String upImg, String downImg, String leftImg, String rightImg) {
10         super(image, x, y, gamePanel, upImg, downImg, leftImg, rightImg);
11         direction = getRanDirect();
12     }
13 
14     //自定义随机移动方法,当移动次数为40时随机改变方向
15     public void go()
16     {
17         //调用攻击方法
18         attack();
19        if (movetime == 40)
20        {
21            direction = getRanDirect();
22            movetime = 0;
23        }
24        else
25            movetime++;
26         switch (direction)
27         {
28             case DOWN:downward();break;
29             case LEFT:leftward();break;
30             case RIGHT:rightward();break;
31             case UP:upward();break;
32         }
33     }
34     //随机获取移动方向
35     public Direction getRanDirect()
36     {
37         Random random = new Random();
38         int i = random.nextInt(4);
39         switch (i)
40         {
41             case 0: return Direction.UP;
42             case 1: return Direction.DOWN;
43             case 2: return Direction.LEFT;
44             case 3: return Direction.RIGHT;
45         }
46         return null;
47     }
48 
49     //重写攻击方法
50     @Override
51     public void attack()
52     {
53         if(attackCoolDown) {
54             Random random = new Random();
55             int i = random.nextInt(50);
56             if (i == 1) {
57                 Point p = getHeadPoint();
58                 EnemyBullet bullet = new EnemyBullet("images/bullet.png", p.x, p.y, this.gamePanel, direction);
59                 this.gamePanel.bullets.add(bullet);
60                 new MyThread().start();
61             }
62         }
63     }
64     //重写绘制方法,使用自定义移动方法
65     @Override
66     public void paintSelf(Graphics g) {
67         g.drawImage(image,x,y,null);
68         go();
69     }
70 
71     @Override
72     public Rectangle gerRec() {
73         return new Rectangle(x,y,width,height);
74     }
75 }

子弹类

  1 import java.awt.*;
  2 import java.util.ArrayList;
  3 import java.util.Iterator;
  4 import java.util.ListIterator;
  5 
  6 public class Bullet extends GameObject{
  7     //尺寸
  8     int width = 10;
  9     int height = 10;
 10     //速度
 11     int speed = 20;
 12     //方向
 13     Direction direction;
 14     //定义移动方法
 15     public void leftword()
 16     {
 17         x -= speed;
 18     }
 19     public void rightword()
 20     {
 21         x += speed;
 22     }
 23     public void upword()
 24     {
 25         y -= speed;
 26     }
 27     public void downword()
 28     {
 29         y += speed;
 30     }
 31 
 32     public Bullet(String image, int x, int y, GamePanel gamePanel, Direction direction) {
 33         super(image, x, y, gamePanel);
 34         this.direction = direction;
 35     }
 36 
 37     public void go()
 38     {
 39             switch (direction)
 40             {
 41                 case UP:
 42                     upword();break;
 43                 case DOWN:
 44                     downword();break;
 45                 case LEFT:
 46                     leftword();break;
 47                 case RIGHT:
 48                     rightword();break;
 49             }
 50         //检测是否到达边界
 51         hitboder();
 52     }
 53     //检测是否碰撞边界
 54     public void hitboder()
 55     {
 56         //到达边界将该子弹添加进清除子弹集合
 57         if (x<=15||y<=45||x>=770||y>=580)
 58             gamePanel.removelist.add(this);
 59     }
 60     //碰撞围墙,子弹和围墙消失
 61     public void hitWall() {
 62         //获取墙集合
 63         ArrayList walls = this.gamePanel.walls;
 64         //获取围墙集合迭代器
 65         ListIterator wal = walls.listIterator();
 66         while (wal.hasNext())
 67         {
 68             Wall b = wal.next();
 69             if(this.gerRec().intersects(b.gerRec()))
 70             {
 71                 //因为在增强for循环中,删除元素会造成异常,所以采用迭代器的删除方法
 72                 wal.remove();
 73                 //将子弹添加入清除子弹集合
 74                 this.gamePanel.removelist.add(this);
 75             }
 76         }
 77         //如果子弹击中基地,设置为状态2游戏失败
 78         if (this.gerRec().intersects(gamePanel.base.gerRec()))
 79         {
 80             gamePanel.state = 2;
 81         }
 82     }
 83     //同碰撞围墙检测,检测是否碰撞地方坦克
 84     public void hitBot() {
 85         ArrayList bots = this.gamePanel.bots;
 86         ListIterator bot = bots.listIterator();
 87         while (bot.hasNext())
 88         {
 89             Bot b = bot.next();
 90             if(this.gerRec().intersects(b.gerRec()))
 91             {
 92                 bot.remove();
 93                 this.gamePanel.removelist.add(this);
 94             }
 95         }
 96     }
 97     @Override
 98     public void paintSelf(Graphics g) {
 99         g.drawImage(image,x,y,null);
100         this.go();
101         hitBot();
102         hitWall();
103     }
104 
105     @Override
106     public Rectangle gerRec() {
107         return new Rectangle(x,y,width,height);
108     }
109 }

敌方子弹类:

//敌方子弹类,继承子弹类
public class EnemyBullet extends Bullet{
    public EnemyBullet(String image, int x, int y, GamePanel gamePanel, Direction direction) {
        super(image, x, y, gamePanel, direction);
    }
    //重写碰撞坦克方法,如果碰撞玩家则游戏结束
    @Override
    public void hitBot()
    {
        if(this.gerRec().intersects(this.gamePanel.player.gerRec()))
        {
            this.gamePanel.state = 2;
        }
    }
}

围墙类:

 1 import java.awt.*;
 2 //定义围墙类
 3 public class Wall extends GameObject{
 4     //定义长度
 5     int length = 35;
 6 
 7     public Wall(String image, int x, int y, GamePanel gamePanel) {
 8         super(image, x, y, gamePanel);
 9     }
10 
11     @Override
12     public void paintSelf(Graphics g) {
13         g.drawImage(image,x,y,null);
14     }
15 
16     @Override
17     public Rectangle gerRec() {
18         return new Rectangle(x,y,length,length);
19     }
20 }

基地类

 1 import java.awt.*;
 2 //基地类
 3 public class Base extends GameObject{
 4     //设置长度
 5     int length = 35;
 6 
 7     public Base(String image, int x, int y, GamePanel gamePanel) {
 8         super(image, x, y, gamePanel);
 9     }
10 
11     @Override
12     public void paintSelf(Graphics g) {
13         g.drawImage(image,x,y,null);
14     }
15 
16     @Override
17     public Rectangle gerRec() {
18         return new Rectangle(x,y,length,length);
19     }
20 }

GamePanel类

  1 import javax.swing.*;
  2 import java.applet.AudioClip;
  3 import java.awt.*;
  4 import java.awt.event.KeyAdapter;
  5 import java.awt.event.KeyEvent;
  6 import java.awt.event.KeyListener;
  7 import java.util.ArrayList;
  8 import java.util.Random;
  9 
 10 public class GamePanel extends JFrame {
 11     //游戏状态;设置状态为0:开始界面状态
 12     int state = 0;
 13     //窗口长宽
 14     int width =800;
 15     int height=610 ;
 16     //双缓存图片
 17     Image bufferImage  = null;
 18     //select指针初始坐标
 19     int y = 260;
 20     //重绘次数
 21     int repaintNum = 0;
 22     // 开始界面的坦克图标
 23     Image  select = Toolkit.getDefaultToolkit().getImage("images/right.jpg");
 24     //基地
 25     Base base = new Base("images/base.gif",340,570,this);
 26     //子弹列表
 27     ArrayList bullets = new ArrayList<>();
 28     //敌方坦克列表
 29     ArrayList bots = new ArrayList<>();
 30     //地方子弹列表
 31     ArrayList enemyBullets = new ArrayList<>();
 32     //需要删除的地方子弹列表
 33     ArrayList removelist = new ArrayList<>();
 34     //墙列表
 35     ArrayList walls = new ArrayList<>();
 36     //玩家
 37     Player player = new Player("images/up.jpg",125,510,this,"images/up.jpg",
 38             "images/down.jpg","images/left.jpg","images/right.jpg");
 39 
 40 
 41     //窗口启动方法
 42     public void lunch()
 43     {
 44         //添加键盘监听器
 45         this.addKeyListener(new KeyMonitor());
 46         //标题
 47         setTitle("坦克大战");
 48         //窗口初始大小
 49         setSize(width,height);
 50         //使屏幕居中
 51         setLocationRelativeTo(null);
 52         //添加关闭事件
 53         setDefaultCloseOperation(3);
 54         //用户不能调整大小
 55         setResizable(false);
 56         //使窗口可见
 57         setVisible(true);
 58         //创建敌方坦克和围墙
 59         buildBot();
 60         buildWall();
 61         //每隔20ms重绘一次
 62         while(true)
 63         {
 64             //如果坦克数量小于10并且每重绘三百次重新生成一个地方坦克
 65             if(bots.size()<10&&repaintNum%300 == 0)
 66             {
 67                 //获取随机坐标
 68                 Random random = new Random();
 69                 int xx = random.nextInt(700);
 70                 Bot bot = new Bot("images/bot_u.png",xx,110,this,"images/bot_u.png","images/bot_d.png","images/bot_l.png","images/bot_r.png");
 71                //添加入敌方坦克列表
 72                 bots.add(bot);
 73             }
 74             //重绘
 75             repaint();
 76             //线程休眠50ms;
 77             try {
 78                 Thread.sleep(50);
 79             } catch (InterruptedException e) {
 80                 e.printStackTrace();
 81             }
 82         }
 83     }
 84     //创建坦克对象
 85     private void buildBot() {
 86         for(int i = 0;i<5;i++)
 87         {
 88             String img = null;
 89             //随机获取坦克坐标
 90             Random random = new Random();
 91             int xx = random.nextInt(700);
 92             int yy = random.nextInt(300);
 93             int o = random.nextInt(4);
 94             //随机获取坦克朝向
 95             switch (o)
 96             {
 97                 case 0 : img = "images/bot_u.png";break;
 98                 case 1 : img = "images/bot_d.png";break;
 99                 case 2 : img = "images/bot_l.png";break;
100                 case 3 : img = "images/bot_r.png";break;
101             }
102             Bot bot = new Bot(img,xx,yy,this,"images/bot_u.png","images/bot_d.png","images/bot_l.png","images/bot_r.png");
103             bots.add(bot);
104         }
105     }
106     //建造围墙对象
107     private void buildWall() {
108         String wal = "images/wall.gif";
109         walls.add(new Wall(wal,100,200,this));
110         walls.add(new Wall(wal,100,240,this));
111         walls.add(new Wall(wal,100,280,this));
112         walls.add(new Wall(wal,100,320,this));
113         walls.add(new Wall(wal,100,360,this));
114         walls.add(new Wall(wal,360,180,this));
115         walls.add(new Wall(wal,400,180,this));
116         walls.add(new Wall(wal,320,180,this));
117         walls.add(new Wall(wal,280,180,this));
118         walls.add(new Wall(wal,500,250,this));
119         walls.add(new Wall(wal,540,295,this));
120         walls.add(new Wall(wal,580,340,this));
121         walls.add(new Wall(wal,700,100,this));
122         walls.add(new Wall(wal,700,140,this));
123         walls.add(new Wall(wal,700,180,this));
124         walls.add(new Wall(wal,700,220,this));
125         walls.add(new Wall(wal,300,560,this));
126         walls.add(new Wall(wal,300,520,this));
127         walls.add(new Wall(wal,340,520,this));
128         walls.add(new Wall(wal,380,520,this));
129         walls.add(new Wall(wal,380,560,this));
130     }
131     //定义清除列表函数,使用可变参数,可以传入多个集合;
132     public void clear(ArrayList ...al)
133     {
134         //遍历参数数组
135         for (ArrayList a : al)
136         {
137             //如果列表不为空则清空
138             if (a.size()!=0)
139                 a.clear();
140         }
141     }
142 
143     //paint方法
144     @Override
145     public void paint(Graphics g) {
146         //重绘次数+1
147         repaintNum++;
148         //现将元素绘制到图片,再将图片绘制到界面内,解决屏幕闪动问题;
149         if(bufferImage ==null)
150         {
151             bufferImage = this.createImage(width,height);
152         }
153         //获取图片的画笔
154         Graphics graphics = bufferImage.getGraphics();
155         //设置画笔颜色
156         graphics.setColor(Color.black);
157         //绘制实心矩形
158         graphics.fillRect(0,0,width,height);
159         //状态为0时,绘制游戏开始界面
160         if(state == 0)
161         {
162             //改变画笔颜色
163             graphics.setColor(new Color(158, 51, 51, 218));
164             //改变文字大小和样式
165             graphics.setFont(new Font("楷体",Font.BOLD,100));
166             //添加文字
167             graphics.drawString("BATTILE CITY",80,170);
168             graphics.setFont(new Font("微软雅黑",Font.BOLD,40));
169             graphics.setColor(Color.white);
170             graphics.drawString("开始游戏",320,300);
171             graphics.drawString("游戏说明",320,400);
172             graphics.drawImage(select,240,y,null);
173         }
174         //1: 游戏进行中界面
175         else if(state == 1){
176             //显示敌人数量
177             graphics.setFont(new Font("微软雅黑",Font.BOLD,20));
178             graphics.setColor(Color.white);
179             graphics.drawString("敌人数量:"+bots.size(),40,80);
180             //绘制玩家坦克
181             player.paintSelf(graphics);
182             //移除应该消灭的子弹
183             bullets.removeAll(removelist);
184             //遍历子弹集合,绘制子弹
185             for (Bullet b:bullets) {
186                 b.paintSelf(graphics);
187             }
188             //遍历敌方子弹集合,绘制子弹
189             for (EnemyBullet b:enemyBullets) {
190                 b.paintSelf(graphics);
191             }
192             //遍历敌方坦克集合,绘制敌方坦克
193             for(Bot b : bots)
194             {
195                 b.paintSelf(graphics);
196             }
197             //遍历围墙集合,绘制围墙
198             for(Wall w : walls)
199             {
200                 w.paintSelf(graphics);
201             }
202             //绘制基地
203             base.paintSelf(graphics);
204             //如果坦克数量为零,判定胜利,进入状态四
205             if (bots.size()==0)
206                 state = 4;
207         }
208         //2: 绘制游戏失败界面
209         else if(state == 2)
210         {
211             //首先清空所有集合元素
212             clear(bullets,bots,walls,enemyBullets);
213             //绘制界面
214             graphics.drawImage(Toolkit.getDefaultToolkit().getImage("images/gameover.png"),50,0,null);
215             graphics.setFont(new Font("微软雅黑",Font.BOLD,40));
216             graphics.setColor(Color.white);
217             graphics.drawString("重新来过",320,300);
218             graphics.drawString("退出游戏",320,400);
219             graphics.drawImage(select,240,y,null);
220         }
221         //4: 绘制游戏胜利界面
222         else if (state == 4)
223         {
224             //改变画笔颜色
225             graphics.setColor(new Color(158, 51, 51, 218));
226             //改变文字大小和样式
227             graphics.setFont(new Font("楷体",Font.BOLD,100));
228             //添加文字
229             graphics.drawString("V I C T O R Y",80,170);
230             graphics.setFont(new Font("微软雅黑",Font.BOLD,40));
231             graphics.setColor(Color.white);
232             graphics.drawString("再来一次",320,300);
233             graphics.drawString("退出游戏",320,400);
234             graphics.drawImage(select,240,y,null);
235         }
236         //5: 绘制游戏说明界面
237         else if (state == 5)
238         {
239             graphics.setColor(Color.white);
240             graphics.setFont(new Font("楷体",Font.BOLD,40));
241             //添加文字
242             graphics.drawString("通过键盘上的方向键控制坦克移动,",80,170);
243             graphics.drawString("空格控制子弹发射,每隔一秒只能",80,230);
244             graphics.drawString("发射一颗子弹,敌方坦克击中我方",80,290);
245             graphics.drawString("坦克或者基地则游戏失败,消灭地",80,350);
246             graphics.drawString("方所有坦克则获得胜利。",80,410);
247             graphics.drawString("按enter键返回开始界面",80,470);
248         }
249         // 将图片绘制到界面中
250         g.drawImage(bufferImage,0,0,null);
251 
252     }
253     //键盘监视器
254     class KeyMonitor extends KeyAdapter{
255         //按下键盘
256         @Override
257         public void keyPressed (KeyEvent e)
258         {
259             //监听游戏开始界面
260             if(state ==0)
261             {
262                 //改变坦克图标位置
263                 if(e.getKeyCode()==KeyEvent.VK_UP||e.getKeyCode()==KeyEvent.VK_DOWN)
264                 {
265                     if(y == 260)
266                         y = 360;
267                     else
268                         y = 260;
269                 }
270                 //根据图标位置选择下一步状态
271                 if(e.getKeyCode() == KeyEvent.VK_ENTER)
272                     if(y==260)
273                         //开始游戏
274                         state = 1;
275                     else
276                         //游戏说明
277                         state = 5;
278             }
279             //监听游戏运行时界面
280             else if(state == 1){
281                 //为玩家添加键盘监听事件
282                 player.keyPressed(e);
283             }
284             //监听游戏失败或者胜利界面
285             else if (state == 2||state ==4)
286             {
287                 if(e.getKeyCode()==KeyEvent.VK_UP||e.getKeyCode()==KeyEvent.VK_DOWN)
288                 {
289                     if(y == 260)
290                         y = 360;
291                     else
292                         y = 260;
293                 }
294                 if(e.getKeyCode() == KeyEvent.VK_ENTER)
295                 {
296                     //重新游戏,添加围墙,敌人,并设置玩家起始坐标,设置状态1开始游戏
297                     if(y == 260)
298                     {
299                         buildBot();
300                         buildWall();
301                         state = 1;
302                         player.x = 125;
303                         player.y = 510;
304                     }
305                     //退出java虚拟机
306                     else
307                         System.exit(0);
308                 }
309             //监听游戏说明界面
310             }
311             else if (state == 5)
312             {
313                 if (e.getKeyCode() == KeyEvent.VK_ENTER)
314                     state =0;
315             }
316         }
317         //为玩家添加键盘监听事件
318         @Override
319         public void keyReleased(KeyEvent e)
320         {
321             player.keyReleased(e);
322         }
323     }
324 }

枚举类

1 //枚举类
2 public enum Direction {
3     UP,DOWN,LEFT,RIGHT
4 }

运行截图:

状态0:

状态 5

 状态 1

 状态2 :

状态 4:

 游戏素材