如果采用我的代码结构,耐心等待绘制的最终完成,应该也是一条通路的。只不过联通会在最后发生,因为相当于是使用了后序遍历,先通过go去遍历,最后才将当前节点和访问的下一个节点之间的通路打通。
如果你的代码在最终绘制不是联通的,应该是你的draw的位置有问题。draw应该发生在你的map修改以后。我看你的代码draw发生在每次go调用中,这是不合适的。go只是一个逻辑过程。而draw其实是显示反映数据的变化,应该是绘制数据一旦发生变化(你的代码中map一旦发生变化),就进行draw操作。试试看:)
另外,为了保险起见,在整个动画逻辑完成以后也应该执行一下draw:)请再体会一下我的代码逻辑,注意我加注释的部分。
private void run(){
// 在动画逻辑开始之前,先绘制一遍初始状态
setData(-1, -1);
// 动画逻辑
go(data.getEntranceX(), data.getEntranceY()+1);
// 在动画逻辑之后,绘制一遍最终状态,虽然在一些情况下是多余的:)
setData(-1, -1);
}
private void go(int x, int y){
if(!data.inArea(x,y))
throw new IllegalArgumentException("x,y are out of index in go function!");
data.visited[x][y] = true;
for(int i = 0 ; i < 4 ; i ++){
int newX = x + d[i][0]*2;
int newY = y + d[i][1]*2;
if(data.inArea(newX, newY) && !data.visited[newX][newY]){
// setData是修改数据,同时绘制!这两个动作绑定在一起!
// 每次显示数据一发生修改,说明我们的画面要产生变化,就进行一次绘制:)
setData(x + d[i][0], y + d[i][1]);
// 之后继续根据我们的逻辑遍历相关节点
go(newX, newY);
}
}
}