package com.cy.TankWar_2;/*问题在下面,已标注*/import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;public class Tank_2 {
private static final int XSPEED=5;
private static final int YSPEED=5;
private int x, y;
private  Boolean BL = false, BU = false, BR = false,
BD = false; enum Direction {
L, LU, U, RU, R, RD, D, LD, STOP
}; private Direction dir = Direction.STOP; public Tank_2(int x, int y) {
this.x = x;
this.y = y;
} public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(x, y, 30, 30);
g.setColor(c);
move();
} public void move(){
 
switch(dir){
case L:
x-=XSPEED;
break;
case LU:
x-=XSPEED;
y-=YSPEED;
break;
case U:
y-=XSPEED;
break;
case RU:
x+=XSPEED;
y-=YSPEED;
break;
case R:
x+=XSPEED;
break;
case RD:
x+=XSPEED;
y+=YSPEED;
break;
case D:
y+=XSPEED;
break;
case LD:
x-=XSPEED;
y+=YSPEED;
break;
case STOP:
break;
}
} public void Passkey(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
BU=true;
break;
case KeyEvent.VK_DOWN:
BD=true;
break;
case KeyEvent.VK_LEFT:
BL=true;
break;
case KeyEvent.VK_RIGHT:
BR=true;
break;
}
locatDirction();

}
public void locatDirction(){
/*  这个方法的代码怎么理解?????????????????????? 
 * 我真的看不懂
 *                   */
if(BL && !BU && !BR && !BD) dir=Direction.L;
else if(BL && BU && !BR && !BD) dir=Direction.LU;
else if(! BL && BU && !BR && !BD) dir=Direction.U;
else if(!BL && BU && BR && !BD) dir=Direction.RU;
else if(!BL && !BU && BR && !BD) dir=Direction.R;
else if(!BL && !BU && BR && BD) dir=Direction.RD;
else if(!BL && !BU && !BR && BD) dir=Direction.D;
else if(BL && !BU && !BR && BD) dir=Direction.LD;
else if(!BL && !BU && !BR && !BD) dir = Direction.STOP;
} public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
BU=false;
break;
case KeyEvent.VK_DOWN:
BD=false;
break;
case KeyEvent.VK_LEFT:
BL=false;
break;
case KeyEvent.VK_RIGHT:
BR=false;
break;
}
locatDirction();


}}
java·求助java

解决方案 »

  1.   

    这不就是个逻辑表达式嘛
    BL && !BU && !BR && !BD
    这样写你理解不?
    if(BL==true && BU==false && BR==false && BD==false)
    比如BL=true BU=false BR=false BD=false
    那上面的表达式就是:
          true && !false && !false && !false
    即:  true && true && true && true
    就是true
      

  2.   

    BL BU BR BD是boolean类型,分别表示是否向左、上、右、下。
    代码: if(BL && !BU && !BR && !BD) dir=Direction.L;就是表示当BL为true,并且其他为false的时候(说明只按了向左的方向键),方向置为向左,其他的else if 语句以此类推。
      

  3.   

    但是·BL BU BR BD是初值是flase
     当我按下左键的时候,BL 变为 true BL BU BR BD还是flase。
    因为 if(BL && !BU && !BR && !BD) dir=Direction.L;
        它相当于  if(BL=false&&!BU=true&&!BR=true&&!BD=true)
     不成立呀·
      请大侠给我思路。
     
       
      

  4.   

    你这个BL==false是怎么的出来的?不是true么?
      

  5.   

    因为它的初值是false,当if语句执行的时候它还是false
      

  6.   

    Passkey(KeyEvent e)这里面
    case KeyEvent.VK_LEFT:
    BL=true;
    break;
    这里不是把它置为true了?
      

  7.   

     BL理解了,但是让这个if(BL && !BU && !BR && !BD)
    这个条件表达式成立·必须要满足
    BL && !BU=true && !BR=true && !BD=true
    此时BL=true,
    可是  现在·BL BU BR BD没有改变状态,还是它的初值flase。
    这个if(BL && !BU && !BR && !BD)
    还不成立呀!!!
       请高手给我理清思路··
       谢谢~~~
      

  8.   

    BL都已经变成true了,那还有"初值false"这一说啊?
    int key = e.getKeyCode();
    switch (key) {
    case KeyEvent.VK_UP:
    BU=true;
    break;
    case KeyEvent.VK_DOWN:
    BD=true;
    break;
    case KeyEvent.VK_LEFT:
    BL=true;//这里已经把BL设成true了
    break;
    case KeyEvent.VK_RIGHT:
    BR=true;
    break;
    }
    locatDirction();//这里才调这个方法,BL怎么还会是false呢?
      

  9.   

    那我这样问你·
    为啥要写!BU && !BR && !BD
      

  10.   

    BL && !BU && !BR && !BD //只有当BL是true,BU、BR、BD都是false时,这个表达式的结果才为true
    这只是一种情况,用来表示只有左键被按下
    你不这么写,怎么知道其他三个键是不是被按下?