qt6/eaf 2048 小游戏

上周为了处理一个 eaf-browser 里 focus 状态同步的需求(见 eaf 和 evil 的磨合 - #22,来自 twiddling ), 陆续看了小部分 eaf 代码,想着正好周末,要不趁热继续做一个 eaf/qt 的项目(还是想太多了),但 eaf 里已经实现了日常生活办公最常用的工具了,一下也想不起来还有什么足够简单又有用的应用能练手,于是就改变目标,写一个足够简单、没啥用但可能有趣,同时花的时间越少越好的项目。

我第一个想到的就是 2048 了,毕竟这游戏的简单和当年的流行程度令人印象深刻,想必也会有很多现成的实现,避免从头写,带着 “代码量少但 UI 不要太简陋” 的目的, 从 github 搜索到 GitHub - jingdao/2048-pyqt: clone of 2048 game on PyQt 后就开始改代码:

UI 、逻辑都没改(改了或许就不叫 2048 了),花时间最多的环节是从 pyQt4 到 pyQt6 的迁移, 很多常量的接口有变化,得一个一个查文档改。但由于 “代码少” 的要求,这游戏总的也就 200 行,因此没有太过于折腾。其次是把所有需要鼠标点击的控件都删了,改成键盘控制,还有就是一些奇怪的布局上的问题,总的还是花了大半天 - -!

output-2022-08-14-14:40:55

效果就上图所示了,hjkl 和方向键控制上下左右, 按数字后再按 r 是启一个新的布局重新开始游戏(数字只支持两位,表示行列数)。

也可以本地 python buffer.py num 直接运行,参数是格子行列数, 要在 emacs eaf 跑则将代码放到 eaf/app 目录下,见 readme 。

总的来说这完全就是改 QT6 代码,emacs 只是作为启动器和环境,把按键默认传过去

另外 emacs 里当把 gridsize 设置很大时,比如 20x20,没法及时刷新布局,不清楚什么原因,但谁会去玩 20x20 的 2048? 3x3 的都不玩了 :smile:

6 个赞

可以把这个项目加到EAF的社区链接,哈哈哈哈哈。

这里有一些可以玩的任务

我还没有注意到这个 TODO list, 不过看了一下,这些确实不在我 “足够简单” 的要求下了,哈哈,我先关注起来

今天移植了一个 AI 到这个游戏里,基本都是从 GitHub - kcwu/2048-python: 2048 ai in python 里拷贝粘贴的。 想着自己不玩了,但休息时看看机器玩还是可以的

另外不知道怎么回事,可能由于需要交互事件才能录制,自动运行的模式下 gif-screencast 录不到动图。


补充说明:

验证发现确实 emacs-gif-screencast 需要有持续的键盘/鼠标事件才能录制到动态图, 如下,要开一个正常的 buffer 不断移动光标才能录到: output-2022-08-21-00:31:23

1 个赞

这个有趣,“你写代码的过程能得多少分?” :joy:

哈哈,这个还不好说,我一直都是在 0.2 s 一个动作的频率下运行的,而且设置到合并成 4096 就自动结束了,一般这个速度下 2分钟内就结束了,所以就算一秒一次,10 分钟也能到 4096, 大概是 40000 多分。

这个算法的原始 github 里有完整测试的结果,如果不设置上限,平均是 80000 分。

1 个赞