Skip to content

PiYuanZhouLv/BouncingMaze

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

数字回响 出题程序 - BouncingMaze

有一天,我在闲逛时发现后排同学拿着方格纸在干什么, 出于好奇,我去问了他们。他们研发了一款新游戏,正在出题互相考验。 我回到座位,觉得人工出题慢而且解法多,应该用程序出题才好。

思考多日,我终于想到了!!!于是就有了这个程序。

忠告

如果你好奇代码是什么原理,建议阅读下面的“代码逻辑”部分,不建议阅读源码。

如果你看了源码的话,你会发现整个代码就是一坨巨大的屎山。

大部分核心逻辑被紧凑到一块,且没有注释,主逻辑部分大量重复,复用率很低很低。

说实话,程序第一次跑出来的时候我都惊讶了,我本来以为会有bug的,结果竟然跑通了?!

如果你还是执意要这么做的话,我也不拦你,但请做好心理准备!

经典永流传:

原来这段代码只有两个人懂:我和上帝。 现在,这段代码只有上帝能懂了。

文件说明

  • generate.py 是程序的主逻辑
  • visualize.py 是用来可视化题目和解法的模块
  • util.py 是辅助模块,里面最重要的一个函数是正/反运动的逻辑
  • solve.py 是用来求解的文件,但只有2D版的
  • test_route.py 与这个项目无关,是第一代思路的一部分,由AI编写,没有达到我想要的目的
  • 各种各样的.png/.json 是题目/解答
  • LXGWWenKaiGB-Regular.ttf 是用于可视化模块绘图的字体, 字体仓库:lxgw/LxgwWenKaiGB

关于游戏……

游戏规则比较简单

  1. 游戏从左上角出发,目标是抵达右下角。

对于3D/4D/5D的游戏,是从最表面、最左列、最上面的棋盘的左上角出发, 到最深层、最右列、最下面的棋盘的右下角

  1. 每个格子的数字代表你下一步应该走多远。 注意:你只能走这么远,不能多也不能少

  2. 每次走时,只能选择上、下、左、右中的一个方向,中途不可拐弯。

  3. 关于传送门

在高于2D的游戏中你可以选择生成含有传送门的版本。 走到传送门上时,你可以像正常格一样走出下一步, 也可以移动至拥有相同颜色及图案的格子上。

在高于2D的游戏中有一类特殊的传送门, 展现为向上、下、左、右方向的“〉”或圆环/叉叉(仅5D), 它代表可以传送至与之上/下/左/右相邻的棋盘, 圆环代表更表一层的棋盘,叉叉代表更里一层的棋盘。 值得注意的是,这类传送门是“对称”的,即传送到的那格会有可以传送至原有格的标记, 一定程度上可以用于防止传送错位置。

  1. 关于墙壁

大部分墙都是“反弹墙”,用粗线表示,向该方向走时会被反弹

如(用“||”代表反弹墙):

+ - - - + - - - + - - - + - - - +
|       |       |       |       ||
|   X   |   5   |       |       ||
|       |       |       |       ||
+ - - - + - - - + - - - + - - - +
    ^       ^       ^       ^
    |      (0)----->1------>2---\反
    5<------4<------3<----------/弹

从“5”处出发向右走最终会到达“X”处。

还有些墙是“粘性墙”,用斜线表示,斜线边代表“粘性”。 向该方向走到此处时“被粘住”,不反弹;从另一边靠近时同“反弹墙”

如:

+ - - - + - - - + - - - + - - - +
|       |       |       |      \|
|       |   5   |       |   X  \|
|       |       |       |      \|
+ - - - + - - - + - - - + - - - +
            ^       ^       ^
           (0)----->1------>2被粘住

+ - - - + - - - + - - - + - - - +
|       |       |       |       |/
|   X   |   5   |       |       |/
|       |       |       |       |/
+ - - - + - - - + - - - + - - - +
    ^       ^       ^       ^
    |      (0)----->1------>2---\反
    5<------4<------3<----------/弹

还有一种“二极管”,用小三角形表示,小三角形指向导通方向。 顺着导通方向走时,与没有墙一致;反之,与“弹性墙”一致。

如:

+ - - - + - - - + - - - + - - - + - - - +
|       |       |       |       |       |
|       |   3   |     |>|       |   X   |
|       |       |       |       |       |
+ - - - + - - - + - - - + - - - + - - - +
            ^       ^       ^       ^
           (0)----->1------>2------>3
                      导 通


+ - - - + - - - + - - - + - - - + - - - +
|       |       |       |       |       |
|   X   |   3   |       |<|     |       |
|       |       |       |       |       |
+ - - - + - - - + - - - + - - - + - - - +
    ^       ^       ^
    |      (0)----->1---\反
    3<------2<----------/弹

代码逻辑

谜题生成分四个阶段

  1. 准备阶段:

使用random_mapsummon_magic_port函数随机生成地图, 调用fill_number函数进入下一阶段。

  1. 第一阶段:

开始延伸“前树”、“后树”

“前树”指从起点可以到的地方构成的类似树的结构, “后树”指从终点可以倒推到的地方构成的类似树的结构。

“前树”延伸是通过 向“前树”末节未填写数字的部分填写数字并加入新的可到达位置 完成的; “后树”延伸是通过 对“后树”上任一节点生成一个方向和步数后倒推并将该步数填入、添加该位置 完成的。

这一阶段的延伸规则是:

“前树”与“前树”不交叉,“后树”与“后树”不交叉

当某次延伸使“前树”“后树”产生唯一交叉时,将该路径连接作为唯一答案。 答案上的节点既在“前树”上又在“后树”上,进入下一阶段。

  1. 第二阶段

“前树”“后树”继续延伸,规则为:

同种树可交叉,异种树不可交叉

直到无法延伸时,此时可能还有一些格子未填充数字, 这些格子既不在“前树”上又不在“后树”上, 即“既不能正向到达又不能反向推达”,即为“孤岛”,填充任意数字即可。

将结果返回,进入下一阶段。

  1. 表现阶段

通过visualize模块对应绘图函数将地图及答案绘制、保存。

谜题生成结束。

后续

在代码正常运行后,我马上编制了三份试题(每份有10x10两张+30x30一张)给最后一排做, 半个晚自习后,他们表示。与他们手工编制的题目相比,这个简直难爆了。10x10的基本上都做出来了, 但30x30的第二天上午才做出了第一个(注:他们后面半个晚自习和回家之后都在写作业,没有解题)。

为了让这个游戏“便于发行”(其实说说罢了),他们起了名字:

中文名:数字回响

英文名:Kill Time Cell

中文名是说明概括主要玩法的,而英文名是因为这个实在太耗时间了。 而我的“BouncingMaze(弹跳迷宫)”就作为这段出题程序的名字了。

我们还开玩笑般的准备了主题曲的标题《都是粘墙惹的祸》, 因为加上我共4个人都因为忽略了粘墙而得出过错误的解法。

后来我也把代码从2D扩展到3D、4D、5D,他们也逐渐熟练了。

最后一次给他们打印题目是5D+传送门版的,是10x10x4x2x2(10x10一个棋盘,一张纸4x2个棋盘,一共两张纸), 他们中的一个用了一个上午自习的时间解了出来,而我让他们猜这段程序出题用了多久。

答案是:5秒。

之后也是快要高考了,也就没有再玩了。 高考后,再看到这段代码的时候,十分感怀,写下了这篇说明文档,以纪念高中的快乐时光。

2025年8月4日 记

About

后排同学发明的小游戏的出题程序

Resources

Stars

Watchers

Forks

Contributors

Languages