Java贪食蛇编程日志(一) 随即产生Enum元素的Bug

来源:互联网 发布:网络春晚串词 编辑:程序博客网 时间:2024/05/16 11:18

产生蛇的节点时,由于程序有一个线程让它移动的,代码部分如下:

for(int i=0; i<this.bodyNodes.size(); i++) {Node node = this.bodyNodes.get(i);switch (node.dir) {case Up: {node.posY--;break;}case Down: {node.posY++;break;}case Left: {node.posX--;break;}case Right: {node.posX++;break;}}if(i != 0) {tempDir = preDir;preDir = node.dir;node.dir = tempDir;}}

然后添加新节点代码如下:

Node tailNode = this.bodyNodes.get(this.bodyNodes.size()-1);dir = tailNode.dir;switch(tailNode.dir) {case Up: {posX = tailNode.posX;posY = tailNode.posY+1;break;}case Down: {posX = tailNode.posX;posY = tailNode.posY-1;break;}case Left: {posX = tailNode.posX+1;posY = tailNode.posY;break;}case Right: {posX = tailNode.posX-1;posY = tailNode.posY;break;}}}this.bodyNodes.add(new Node(posX, posY, dir));


因为我是在new出蛇的时候给它循环5次addNode()的方法,结果偶尔来会出现几个节点不相连的情况,我以为是同步问题,就是说它添加一半的时候蛇移动的那个线程参合进来,当拿到最后节点位置后,线程切换,另一个线程把已有的节点给挪开了,导致新添加的节点就跟最后一个节点隔了一段距离。。。


最后发现不是的,是蛇的方向使用了Enum,然后开始的时候是随机产生的方向,结果,switch 的一个case把posY写成了posX,由于随机产生,所以bug时隐时现,导致我以为是线程问题产生的bug。


原创粉丝点击