深度遍历生成迷宫,关于两行代码的顺序问题
来源:6-3 深度优先遍历生成迷宫
甲骨文_0001
2017-09-30
写回答
1回答
-
如果采用我的代码结构,耐心等待绘制的最终完成,应该也是一条通路的。只不过联通会在最后发生,因为相当于是使用了后序遍历,先通过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); } } }
112017-09-30
相似问题