日期:2014-05-20  浏览次数:20700 次

马士兵的坦克大战关于方向的疑惑
class Tank{
public static final int XSPEED=5;
public static final int YSPEED=5;
private int x,y;
private Boolean BU=false,BR=false,BD=false,BL=false;
enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};
Direction dir = Direction.STOP;
public Tank(int x,int y){
this.x=x;
this.y=y;
}

void move(){
switch(dir){
case L:
x-=XSPEED;
break;
case LU:
x-=XSPEED;
y-=YSPEED;
break;
                case U:
y-=YSPEED;
break;
case RU:
x+=XSPEED;
y-=YSPEED;
break;
case R:
x+=XSPEED;
break;
case RD:
x+=XSPEED;
y+=YSPEED;
break;
case D:
y+=YSPEED;
break;
case LD:
x-=XSPEED;
y+=YSPEED;
break;
case STOP:
break;
}
}

void locateDirection(){
if(!BU&&!BR&&!BD&&BL) dir=Direction.L;
        else if(BU&&!BR&&!BD&&BL) dir=Direction.LU;
else if(BU&&!BR&&!BD&&!BL) dir=Direction.U;
else if(BU&&BR&&!BD&&!BL) dir=Direction.RU;
else if(!BU&&BR&&!BD&&!BL) dir=Direction.R;
else if(!BU&&BR&&BD&&!BL) dir=Direction.RD;
else if(!BU&&!BR&&BD&&!BL) dir=Direction.D;
else if(!BU&&!BR&&BD&&BL) dir=Direction.LD;
}

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 keyPressed(KeyEvent e){
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_UP: 
BU=true;
break;
case KeyEvent.VK_RIGHT: 
BR=true;
break;
case KeyEvent.VK_DOWN: 
BD=true;
break;
case KeyEvent.VK_LEFT: 
BL=true;
break;
}
locateDirection();
}
}
在这个坦克类中我按向上,BU=true了,调用Direction()方法else if(BU&&!BR&&!BD&&!BL) dir=Direction.U;
默认的BR,BD,BU,BL都是false 加个!不是都是true了吗,按了BU当然BU也是true了,其他的都是true了,还怎么区分方向呢
------解决方案--------------------
举个例子
比如就上下左右4个方向,都是初始化为false;
我按上,上变成true,这个时候其他3个方向还是false;这样我判断上的那个if
就是if 上&&!左&&!右&&!下
这个时候左右下都是false所以成功进入了if执行向上的操作

但是如果我按上的时候同时按了下,那么上和下都是true了,而向上操作的判断是
if 上&&!左&&!右&&!下
这个时候下是true了,所以!下是false,那么向上的if判断结果是false不执行向上操作。
他把你按的按钮设置成true,其他都设置成!的目的就是,只有你按这一个键的时候,才进入,如果你错按了其他键就不进入,这就是他的逻辑。
如果看懂了就结贴给分吧。