首页 > 解决方案 > Javascript Snake Collision Understanding

问题描述

I need help with understanding this part of code with Snake collision in javascript, I marked parts that I do not fully understand how they work: Full code at: https://codeincomplete.com/posts/starting-snakes/

// do not understand this function
function occupies(a, b)   {
    return a && b && (a.x == b.x) && (a.y == b.y);
}; 

//do not understand this function 
function snakeOccupies(pos, ignoreHead) {
    var segment = ignoreHead ? head.next : head;
    do {
        if (occupies(segment, pos))
            return true;
    } while (segment = segment.next);
    return false;
};

function unoccupied() {
    var pos = {};
    do {
        //understand this part but i do not understand what does while do
        pos.x = Math.round(random(0, nx-1));
        pos.y = Math.round(random(0, ny-1));
    } while (foodOccupies(pos) || snakeOccupies(pos));
    return pos;
};

标签: javascript

解决方案


在此代码中,游戏区域上的位置由具有属性x和的对象表示y

occupies检查两个这样的对象是否代表相同的位置。return a == b;仅仅or是不够的return a === b;,因为单独的对象可以是彼此的副本并代表相同的位置。例如,表达式的{ x: 1, y: 1 } === { x: 1, y: 1 }计算结果为false

a && b &&部分是处理一个/两个参数abundefinednull或什么的情况。如果a是假的,occupies将返回a。如果a为真但b为假,它将返回b。(在 javascript 中,值、 、 、falseundefinednull假的;所有其他值都是真值。)由于返回值仅在 a 内部使用,因此任何假值都被视为,任何真值都被视为。0''NaNif(...)falsetrue

do-while 循环unoccupied运行块的内容,然后计算foodOccupies(pos) || snakeOccupies(pos). 如果它评估为true(或以其他方式为真)它将再次运行该块;否则它将停止。它将继续运行循环,直到条件不成立。这个和没有的while循环的唯一区别是这个循环不会在循环do的第一次迭代之前检查条件(所以它保证至少运行一次块)。

这个循环snakeOccupies有点不寻常:条件 ( segment = segment.next) 不仅返回一个检查真实性的值,它还改变了一个变量的值。

head是蛇头的位置。它具有属性xy,就像其他位置一样,除了它还包含一个名为 的属性next。这个属性的值是另一个位置,代表蛇头之后的下一个方格,它有自己的next属性引用蛇头上的下一个位置,以此类推。这就是 Bergi 关于“链表”的含义:它是 ( x, y) 对的序列,可以作为数组实现,但它是通过元素之间的链接来实现的。

所以 do-while 循环遍历蛇中的位置(可能忽略head)。如果它到达一个位于 的位置pos,则snakeOccupies返回true。否则,循环将最终到达蛇的末端,segment将被设置为虚假(可能undefinednull),循环将退出并snakeOccupies返回false


推荐阅读