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

文章图片
有人说 , 俄罗斯方块总是很有趣的 。 像Emacs中的所有东西一样 , 它的源代码是开放的 , 易于检查和修改 , 因此我们可以使它变得更加有趣 。 所谓更加有趣 , 我的意思是更难 。 --Nickdrozd(作者)
你知道吗 , Emacs捆绑了一个俄罗斯方块的实现?只需要输入M-xtetris就行了 。

文章图片
在对文本编辑器的讨论中 , Emacs鼓吹者经常提到这一点 。 “没错 , 但是你那个编辑器能运行俄罗斯方块吗?”我很好奇 , 这会让大家相信Emacs更优秀吗?比如 , 为什么有人会关心他们是否可以在文本编辑器中玩游戏呢?“没错 , 但是你那台吸尘器能播放mp3吗?”
有人说 , 俄罗斯方块总是很有趣的 。 像Emacs中的所有东西一样 , 它的源代码是开放的 , 易于检查和修改 , 因此我们可以使它变得更加有趣 。 所谓更加有趣 , 我的意思是更难 。
让游戏变得更难的一个最简单的方法就是“隐藏下一个块预览” 。 你无法在知道下一个块会填满空间的情况下有意地将S/Z块放在一个危险的位置——你必须碰碰运气 , 希望出现最好的情况 。 下面是没有预览的情况(如你所见 , 没有预览 , 我做出的某些选择带来了“可怕的后果”):

文章图片
预览框由一个名为tetris-draw-next-shape1的函数设置:
(defuntetris-draw-next-shape()(dotimes(x4)(dotimes(y4)(gamegrid-set-cell(+tetris-next-xx)(+tetris-next-yy)tetris-blank)))(dotimes(i4)(let((tetris-shapetetris-next-shape)(tetris-rot0))(gamegrid-set-cell(+tetris-next-x(aref(tetris-get-shape-celli)0))(+tetris-next-y(aref(tetris-get-shape-celli)1))tetris-shape))))
首先 , 我们引入一个标志 , 决定是否允许显示下一个预览块2:
(defvartetris-preview-next-shapenil''Whennon-nil,showthenextblockthepreviewbox.'')
现在的问题是 , 我们如何才能让tetris-draw-next-shape遵从这个标志?最明显的方法是重新定义它:
(defuntetris-draw-next-shape()(whentetris-preview-next-shape;;existingtetris-draw-next-shapelogic))
但这不是理想的解决方案 。 同一个函数有两个定义 , 这很容易引起混淆 , 如果上游版本发生变化 , 我们必须维护修改后的定义 。
一个更好的方法是使用advice 。 Emacs的advice类似于Python装饰器 , 但是更加灵活 , 因为advice可以从任何地方添加到函数中 。 这意味着我们可以修改函数而不影响原始的源文件 。
有很多不同的方法使用Emacsadvice(查看手册) , 但是这里我们只使用advice-add函数和:around标志 。 advice函数将原始函数作为参数 , 原始函数可能执行也可能不执行 。 我们这里 , 我们让原始函数只有在预览标志是非空的情况下才能执行:
(defuntetris-maybe-draw-next-shape(tetris-draw-next-shape)(whentetris-preview-next-shape(funcalltetris-draw-next-shape)))(advice-add'tetris-draw-next-shape:around#'tetris-maybe-draw-next-shape)
这段代码将修改tetris-draw-next-shape的行为 , 而且它可以存储在配置文件中 , 与实际的俄罗斯方块代码分离 。
去掉预览框是一个简单的改变 。 一个更激烈的变化是 , 让块随机停止在空中:

文章图片
本图中 , 红色的I和绿色的T部分没有掉下来 , 它们被固定下来了 。 这会让游戏变得极其困难 , 但却很容易实现 。
和前面一样 , 我们首先定义一个标志:
(defvartetris-stop-midairt''Ifnon-nil,pieceswillsometimesstopintheair.'')
推荐阅读
- 我的第一部5G手机■爆发!5G手机前三个月出货量超去年全年,换机潮何时出现?
- 千篇一律 拒绝千篇一律的下厨方式,定义我的轻厨主义
- #我的护球最独特#可以踢走我,皇马金球巨星提前走人?霸气喊话齐祖:若我水平下滑
- 『我的第一部5G手机』百度产品笔试题:5G时代会产生哪些应用生活场景?(上)
- 「我的第一部5G手机」靴子终落地:工信部解绑700MHz 广电正式登上5G舞台
- 『笑看韩综艺』节目结束刘在石传达最后感言,“谢谢大家一直以来对我的爱护”
- 表情包小师妹:你要不装逼还是我的好儿子,表情包:傻儿子
- #育儿小手册#画质虽超前但却失去格斗游戏的灵魂!,一人之下vs火影手游
- 我的第一部5G手机■用户体验全面进化 这四款双模5G旗舰口碑炸裂
- 『我的第一部5G手机』4月京东手机换新季 游戏嗨玩日以旧换新至高补贴5400元
