「我的灵魂有多远」Emacs 俄罗斯方块变得更难,如何让( 二 )


目前 , Emacs俄罗斯方块的工作方式类似这样子:活动部件有x和y坐标 。 在每个时钟滴答声中 , y坐标递增(块向下移动一行) , 然后检查是否有与现存的块重叠 。 如果检测到重叠 , 则将该块回退(其y坐标递减)并设置该活动块到位 。 为了让一个块在半空中停下来 , 我们所要做的就是破解检测函数tetris-test-shape 。
这个函数内部做什么并不重要——重要的是它是一个返回布尔值的无参数函数 。 我们需要它在正常情况下返回布尔值true(否则我们将出现奇怪的重叠情况) , 但在其他时候也需要它返回true 。 我相信有很多方法可以做到这一点 , 以下是我的方法的:
(defuntetris-test-shape-random(tetris-test-shape)(or(andtetris-stop-midair;;Don'tstoponthefirstshape.(<1tetris-n-shapes);;StopeveryINTERVALpieces.(let((interval7))(zerop(modtetris-n-shapesinterval)));;Don'tstoptooearly(itmakesthegameunplayable).(let((upper-limit8))(<upper-limittetris-pos-y));;Don'tstopatthesameplaceeverytime.(zerop(mod(random7)10)))(funcalltetris-test-shape)))(advice-add'tetris-test-shape:around#'tetris-test-shape-random)
这里的硬编码参数使游戏变得更困难 , 但仍然可玩 。 当时我在飞机上喝醉了 , 所以它们可能需要进一步调整 。
顺便说一下 , 根据我的tetris-scores文件 , 我的最高分是:
01389WedDec515:32:192018
该文件中列出的分数默认最多为五位数 , 因此这个分数看起来不是很好 。
给读者的练习使用advice修改Emacs俄罗斯方块 , 使得每当方块下移动时就闪烁显示讯息“OHSHIT” 。 消息的大小与块堆的高度成比例(当没有块时 , 消息应该很小的或不存在的 , 当最高块接近天花板时 , 消息应该很大) 。 在这里给出的tetris-test-shape-random版本中 , 每隔七格就有一个半空中停止 。 一个玩家有可能能计算出时间间隔 , 并利用它来获得优势 。 修改它 , 使间隔随机在一些合理的范围内(例如 , 每5到10格) 。 另一个对使用Tetris使用advise的场景 , 你可以试试autotetris-mode 。 想出一个有趣的方法来打乱块的旋转机制 , 然后使用advice来实现它 。 Emacs只有一个巨大的全局命名空间 , 因此函数和变量名一般以包名做前缀以避免冲突 。 ?很多人会说你不应该使用已有的命名空间前缀而且应该将自己定义的所有东西都放在一个预留的命名空间中 , 比如像这样my/tetris-preview-next-shape , 然而这样很难看而且没什么意义 , 因此我不会这么干 。 ?via:https://nickdrozd.github.io/2019/01/14/tetris.html
作者:nickdrozd选题:lujun9972译者:lujun9972校对:wxy
【「我的灵魂有多远」Emacs 俄罗斯方块变得更难,如何让】本文由LCTT原创编译 , Linux中国荣誉推出
点击“了解更多”可访问文内链接


推荐阅读