JavaGUI-坦克大战04
7.线程的应用03
7.3坦克大战4.0版
7.3.4功能3:敌方坦克自由移动
功能3:让敌人的坦克也可以自由随机地上下左右移动
思路:
- 因为要求敌人的坦克自由移动,因此需要将敌人坦克当做线程使用,EnemyTank类实现Runnable接口
- 线程的run方法的具体操作为:根据当前的方向继续移动敌坦,然后改变敌坦移动方向,再继续移动,如此不断循环。break的条件是当前的敌人坦克被击中,即enemy.isLive == false。
- 在MyPanel类中,每创建一个敌人坦克对象就启动一个线程。
EnemyTank:- package li.TankGame.version04;
- import java.util.Vector;
- public class EnemyTank extends Tank implements Runnable {
- //在敌人坦克类使用Vector保存多个Shot
- Vector<Shot> shots = new Vector<>();
- boolean isLive = true;
- public EnemyTank(int x, int y) {
- super(x, y);
- }
- @Override
- public void run() {
- while (true) {
- //根据坦克的方法来继续移动
- switch (getDirect()) {
- case 0://上
- //让坦克保持一个方向走30步
- for (int i = 0; i < 100; i++) {
- moveUp();
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- break;
- case 1://右
- //让坦克保持一个方向走30步
- for (int i = 0; i < 100; i++) {
- moveRight();//走一步
- try {
- Thread.sleep(50);//每走一步就休眠50毫秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- break;
- case 2://下
- for (int i = 0; i < 100; i++) {
- moveDown();
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- break;
- case 3://左
- for (int i = 0; i < 100; i++) {
- moveLeft();
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- break;
- }
- //随机地改变坦克的方向 0-3
- setDirect((int) (Math.random() * 4));//[0,4)的取整
- //如果被击中了,就退出线程
- if (!isLive) {
- break;//退出线程
- }
- }
- }
- }
复制代码 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方法,使我方坦克也不能走出边界:- package li.TankGame.version04;
- import java.util.Vector;
- public class EnemyTank extends Tank implements Runnable {
- //在敌人坦克类使用Vector保存多个Shot
- Vector<Shot> shots = new Vector<>();
- boolean isLive = true;
- public EnemyTank(int x, int y) {
- super(x, y);
- }
- @Override
- public void run() {
- while (true) {
- //根据坦克的方法来继续移动
- switch (getDirect()) {
- case 0://上
- //让坦克保持一个方向走30步
- for (int i = 0; i < 100; i++) {
- if (getY() > 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;//退出线程
- }
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |