bug描述:
在潜艇大战小游戏中,水雷与战舰碰撞无反应
//判断是否碰撞水雷
private void isHitMine() {
// System.out.println("1");//运行有输出,说明程序进入到该方法了
for (int i = 0; i < mines.length; i++) {
Mine m = mines[i];//获取每一个水雷
//System.out.println(m.width);
// System.out.println(m.isHit(ship));
if(m.isLive() && ship.isLive() && m.isHit(ship)){ //若都活着,并且还撞上了
m.goDead(); //水雷去死
ship.minusLife(); //战舰减命
}
}
}
排错过程:
1)运行程序发现水雷与战舰相撞无反应,定位至水雷与战舰的碰撞方法
2)打桩运行程序判断程序运行时是否调用到该方法,有输出说明方法调用了
3)起初最先在for循环打桩有数据输出说明for循环也执行了
4)最后定位到if判断,在判断中打桩测试发现战舰与水雷调用isLive()方法是正常的
测试 m.isHit(ship)方法无输出
5)检查该方法发现该碰撞方法无问题,并且该碰撞方法写在父类中,潜艇与炸弹也调用了
该方法,碰撞后无异常
6)思考:在该项目中,一个isHit方法,潜艇与炸弹调用无异常,可以初步排除该方法无误
7)此时需要换个角度:
假定该方法无问题,水雷与战舰调用的该方法,就需要检查水雷与战舰的类,确认无误
后,检查他们的父类
/炸弹、水雷、战舰超类
public SeaObject(int width, int height, int x, int y, int speed) {
//this.width = -width;
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.speed = speed;
}
最后发现超类中水雷的构造方法给它的宽赋值为负(-)
bug快速定位:
目前可以想到的方法一:利用git对比两个版本的代码,可以更高效率的解决这类问题
方法二:在碰撞方法哪里打桩输出战舰与水雷相关的属性值,查看他们的属性值是否无误
初次分享,欢迎大家发现不足的地方给予指正!!!