今天看到一个网站。一些开发人员面临的挑战是在满足特定要求的情况下制作最小的游戏,他们发布了令人难以置信的 219 字节大小且可在 Chrome 17 上运行的最终代码(其中一项要求)。我试图探索代码(使用网站提供的解释)并对我不理解的代码进行研究。但是,据我所知,代码太重了,所以我正在寻求一些帮助。
美化后的代码如下:
<body id=b onkeyup=e=event onload=
z=c.getContext('2d');
z.fillRect(s=0,0,n=150,x=11325);
setInterval("
0<x%n
&x<n*n
&(z[x+=[1,-n,-1,n][e.which&3]]^=1)?
z.clearRect(x%n,x/n,1,1,s++)
:b.innerHTML='GameOver:'+s
",9)>
<canvas id=c>
游戏名为“Tron”,就像经典的蛇游戏(没有苹果)。
无论如何,这是我的问题:
1) 他们如何在不使用getElementById()
而不是简单的情况下选择 id 为“c”的元素c
查看代码底部,有一个画布,带有<canvas id=c>
. 我了解高级浏览器会自动修复""
. id="c"
但是,当在事件中调用函数时onload
,它会分配z = c.getContent('2d');
并直接引用画布,甚至不需要应用诸如document.getElementById()
. 他们提到的时候也一样<body id=b>
。这怎么可能?在什么情况下我可以做类似的事情?
2)通过快速分配变量来替换函数的参数会影响函数吗?如果有,将如何计算?
特别是,看看第三行:
z.fillRect(s = 0, 0, n = 150, x = 11325);
我了解最基本的水平,fillRect()
需要4个参数fillRect(x-cor, y-cor, width, height)
。但是,上面的代码会生成一个 150x150 的矩形。首先,我阅读了描述,他们声称默认情况下,代码会生成一个 300x150 的矩形,所以我假设分配短函数实际上不会为父函数的参数分配任何内容。我做了一个测试,并替换n = 150
为n = 200
. 奇怪的是,它产生了一个 200x150 的矩形,所以我再次同意它n = 150
确实分配150
给了那个插槽。因此,上面的代码可以写成:
z.fillRect(0, 0, 150, 11325);
然而,另一个问题来了。为什么它的高度不是 11325px 而是 150px 呢?我以为它被重置为默认值是因为 11325 超出了浏览器的处理能力,所以我将其改为 500;它产生了同样的问题。
所以一般来说,当你在函数内部进行短赋值时(例如someCustomFunction.call(s = 1)
:),那里到底发生了什么?如果什么都没发生,为什么上例中的矩形在替换时改变了它的大小,而在替换n = 200
时却没有x = 200
?
附加问题:这个问题不是我真正感兴趣的问题,因为它太个人化了,但我很想知道。消息来源指出“x 将成为 tron 的位置,并设置为 11325(11325 = 75 x 75 + 75 = 网格中心)”,这种一数表示位置如何工作?
3) 这到底是什么意思?
这是我最头疼的部分,因为作者把它包装得太巧妙了。
&(z[x+=[1,-n,-1,n][e.which&3]]^=1)?
我把它拆开,并认为它实际上是 z[]^=1 以便检查后面的? :
运算符的条件。但首先:
做什么^=1
?
有人对该项目发表了评论,并表示可以将其替换为--
. 我认为它是按位 AND 运算符,但它与 有什么关系--
?
接下来:
他们如何[e.which&3]
与预设数组一起使用来过滤击键“i”、“j”、“k”、“l”太有效?
我注意到数组的长度为 4,这是需要过滤的键的长度。此外,按另一个键而不是“i”、“j”、“k”、“l”也可以。它让我相信它&3
在过滤 4 个键方面做了一些事情,但我不知道怎么做。
这些都是我要问的。简短而复杂的代码真的让我很兴奋,我非常感谢任何有助于进一步理解代码的帮助。