javascript - 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;
};
解决方案
在此代码中,游戏区域上的位置由具有属性x
和的对象表示y
。
occupies
检查两个这样的对象是否代表相同的位置。return a == b;
仅仅or是不够的return a === b;
,因为单独的对象可以是彼此的副本并代表相同的位置。例如,表达式的{ x: 1, y: 1 } === { x: 1, y: 1 }
计算结果为false
。
该a && b &&
部分是处理一个/两个参数a
和b
是undefined
或null
或什么的情况。如果a
是假的,occupies
将返回a
。如果a
为真但b
为假,它将返回b
。(在 javascript 中,值、 、 、false
和undefined
是null
假的;所有其他值都是真值。)由于返回值仅在 a 内部使用,因此任何假值都被视为,任何真值都被视为。0
''
NaN
if(...)
false
true
do-while 循环unoccupied
运行块的内容,然后计算foodOccupies(pos) || snakeOccupies(pos)
. 如果它评估为true
(或以其他方式为真)它将再次运行该块;否则它将停止。它将继续运行循环,直到条件不成立。这个和没有的while循环的唯一区别是这个循环不会在循环do
的第一次迭代之前检查条件(所以它保证至少运行一次块)。
这个循环snakeOccupies
有点不寻常:条件 ( segment = segment.next
) 不仅返回一个检查真实性的值,它还改变了一个变量的值。
head
是蛇头的位置。它具有属性x
和y
,就像其他位置一样,除了它还包含一个名为 的属性next
。这个属性的值是另一个位置,代表蛇头之后的下一个方格,它有自己的next
属性引用蛇头上的下一个位置,以此类推。这就是 Bergi 关于“链表”的含义:它是 ( x
, y
) 对的序列,可以作为数组实现,但它是通过元素之间的链接来实现的。
所以 do-while 循环遍历蛇中的位置(可能忽略head
)。如果它到达一个位于 的位置pos
,则snakeOccupies
返回true
。否则,循环将最终到达蛇的末端,segment
将被设置为虚假(可能undefined
或null
),循环将退出并snakeOccupies
返回false
。
推荐阅读
- typescript - 如何在打字稿中键入函数引用
- php - 通过带有 PDO 页面的会话变量将登录 ID 传递到另一个页面
- javascript - 包含 promise 调用的函数中的参数范围
- c# - Json 反序列化错误。不支持的类型:System.Guid
- postgresql - 我可以将自己的 UDF 作为内置函数添加到 PostgreSQL 吗?
- c# - ASP.NET MVC - Kendo Grid 缓慢分页
- c++ - 在片段着色器中丢失纹理定义
- ios - 如何使用自己的 pod 创建可可触摸框架
- javascript - 当进行 http 请求/axios 时,Nativescript 卡住并停止
- javascript - 如何测试 forEach 是否调用了 savePost 三次?