day04-应用线程03

打印 上一主题 下一主题

主题 933|帖子 933|积分 2799

JavaGUI-坦克大战04

7.线程的应用03

7.3坦克大战4.0版

7.3.4功能3:敌方坦克自由移动

功能3:让敌人的坦克也可以自由随机地上下左右移动
思路:

  • 因为要求敌人的坦克自由移动,因此需要将敌人坦克当做线程使用,EnemyTank类实现Runnable接口
  • 线程的run方法的具体操作为:根据当前的方向继续移动敌坦,然后改变敌坦移动方向,再继续移动,如此不断循环。break的条件是当前的敌人坦克被击中,即enemy.isLive == false。
  • 在MyPanel类中,每创建一个敌人坦克对象就启动一个线程。
EnemyTank:
  1. package li.TankGame.version04;
  2. import java.util.Vector;
  3. public class EnemyTank extends Tank implements Runnable {
  4.     //在敌人坦克类使用Vector保存多个Shot
  5.     Vector<Shot> shots = new Vector<>();
  6.     boolean isLive = true;
  7.     public EnemyTank(int x, int y) {
  8.         super(x, y);
  9.     }
  10.     @Override
  11.     public void run() {
  12.         while (true) {
  13.             //根据坦克的方法来继续移动
  14.             switch (getDirect()) {
  15.                 case 0://上
  16.                     //让坦克保持一个方向走30步
  17.                     for (int i = 0; i < 100; i++) {
  18.                         moveUp();
  19.                         try {
  20.                             Thread.sleep(50);
  21.                         } catch (InterruptedException e) {
  22.                             e.printStackTrace();
  23.                         }
  24.                     }
  25.                     break;
  26.                 case 1://右
  27.                     //让坦克保持一个方向走30步
  28.                     for (int i = 0; i < 100; i++) {
  29.                         moveRight();//走一步
  30.                         try {
  31.                             Thread.sleep(50);//每走一步就休眠50毫秒
  32.                         } catch (InterruptedException e) {
  33.                             e.printStackTrace();
  34.                         }
  35.                     }
  36.                     break;
  37.                 case 2://下
  38.                     for (int i = 0; i < 100; i++) {
  39.                         moveDown();
  40.                         try {
  41.                             Thread.sleep(50);
  42.                         } catch (InterruptedException e) {
  43.                             e.printStackTrace();
  44.                         }
  45.                     }
  46.                     break;
  47.                 case 3://左
  48.                     for (int i = 0; i < 100; i++) {
  49.                         moveLeft();
  50.                         try {
  51.                             Thread.sleep(50);
  52.                         } catch (InterruptedException e) {
  53.                             e.printStackTrace();
  54.                         }
  55.                     }
  56.                     break;
  57.             }
  58.             //随机地改变坦克的方向 0-3
  59.             setDirect((int) (Math.random() * 4));//[0,4)的取整
  60.             //如果被击中了,就退出线程
  61.             if (!isLive) {
  62.                 break;//退出线程
  63.             }
  64.         }
  65.     }
  66. }
复制代码
MyPanel:line 46-47
7.3.5功能4: 控制坦克移动范围



如图,坦克的绘图以图案的左上方坐标为参考。
在向上时,坦克的纵坐标限制为y>0,向下时,y+600,向右时,x+60 0) {                            moveUp();                        }                        try {                            Thread.sleep(50);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    break;                case 1://右                    //让坦克保持一个方向走30步                    for (int i = 0; i < 100; i++) {                        if (getX() + 60 < 700) {//700为面板宽度                            moveRight();//走一步                        }                        try {                            Thread.sleep(50);//每走一步就休眠50毫秒                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    break;                case 2://下                    for (int i = 0; i < 100; i++) {                        if (getY() + 60 < 550) {//550为面板宽度                            moveDown();                        }                        try {                            Thread.sleep(50);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    break;                case 3://左                    for (int i = 0; i < 100; i++) {                        if (getX() > 0) {                            moveLeft();                        }                        try {                            Thread.sleep(50);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    break;            }            //随机地改变坦克的方向 0-3            setDirect((int) (Math.random() * 4));//[0,4)的取整            //如果被击中了,就退出线程            if (!isLive) {                break;//退出线程            }        }    }}[/code]修改MyPanel类中的keyPressed方法,使我方坦克也不能走出边界:
  1. package li.TankGame.version04;
  2. import java.util.Vector;
  3. public class EnemyTank extends Tank implements Runnable {
  4.     //在敌人坦克类使用Vector保存多个Shot
  5.     Vector<Shot> shots = new Vector<>();
  6.     boolean isLive = true;
  7.     public EnemyTank(int x, int y) {
  8.         super(x, y);
  9.     }
  10.     @Override
  11.     public void run() {
  12.         while (true) {
  13.             //根据坦克的方法来继续移动
  14.             switch (getDirect()) {
  15.                 case 0://上
  16.                     //让坦克保持一个方向走30步
  17.                     for (int i = 0; i < 100; i++) {
  18.                         if (getY() > 0) {
  19.                             moveUp();
  20.                         }
  21.                         try {
  22.                             Thread.sleep(50);
  23.                         } catch (InterruptedException e) {
  24.                             e.printStackTrace();
  25.                         }
  26.                     }
  27.                     break;
  28.                 case 1://右
  29.                     //让坦克保持一个方向走30步
  30.                     for (int i = 0; i < 100; i++) {
  31.                         if (getX() + 60 < 700) {//700为面板宽度
  32.                             moveRight();//走一步
  33.                         }
  34.                         try {
  35.                             Thread.sleep(50);//每走一步就休眠50毫秒
  36.                         } catch (InterruptedException e) {
  37.                             e.printStackTrace();
  38.                         }
  39.                     }
  40.                     break;
  41.                 case 2://下
  42.                     for (int i = 0; i < 100; i++) {
  43.                         if (getY() + 60 < 550) {//550为面板宽度
  44.                             moveDown();
  45.                         }
  46.                         try {
  47.                             Thread.sleep(50);
  48.                         } catch (InterruptedException e) {
  49.                             e.printStackTrace();
  50.                         }
  51.                     }
  52.                     break;
  53.                 case 3://左
  54.                     for (int i = 0; i < 100; i++) {
  55.                         if (getX() > 0) {
  56.                             moveLeft();
  57.                         }
  58.                         try {
  59.                             Thread.sleep(50);
  60.                         } catch (InterruptedException e) {
  61.                             e.printStackTrace();
  62.                         }
  63.                     }
  64.                     break;
  65.             }
  66.             //随机地改变坦克的方向 0-3
  67.             setDirect((int) (Math.random() * 4));//[0,4)的取整
  68.             //如果被击中了,就退出线程
  69.             if (!isLive) {
  70.                 break;//退出线程
  71.             }
  72.         }
  73.     }
  74. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表