易语言3D迷宫源代码

admin3年前 (2024-05-19)易语言交流1802
1.
.版本 2

.程序集 启动窗口窗口程序集
.程序集变量 窗口, 窗口
.程序集变量 关于信息, 文本型

.子程序 __启动窗口_创建完毕

图片框_背景.移动 (0, 0, _启动窗口.取用户区宽度 (), _启动窗口.取用户区高度 ())



.子程序 读取进度

连续赋值 (真, 图片框_进度条.可视, 图形按钮_开始游戏.禁止, 图形按钮_退出游戏.禁止, 图片框_进度条.播放动画)
时钟_显示进度条.时钟周期 = 1500
变量初始化 ()

.子程序 _时钟_显示进度条_周期事件

连续赋值 (假, 图片框_进度条.可视, 图形按钮_开始游戏.禁止, 图形按钮_退出游戏.禁止, 图片框_进度条.播放动画)
时钟_显示进度条.时钟周期 = 0
载入 (窗口, _启动窗口, 真)

.子程序 _图形按钮_开始游戏_被单击

窗口 = 窗口_游戏画面
读取进度 ()

.子程序 _图形按钮_退出游戏_被单击

销毁 ()

.子程序 _按钮1_被单击

_图形按钮_开始游戏_被单击 ()
2.
.版本 2
.支持库 OPenGL

.程序集 框架程序集
.程序集变量 着色描述表号, 整数型
.程序集变量 设备句柄, 整数型, , , OPenGL组件的设备句柄
.程序集变量 全屏显示, 逻辑型
.程序集变量 光源开关, 逻辑型
.程序集变量 雾开关, 逻辑型
.程序集变量 地图开关, 逻辑型
.程序集变量 玩家, 观察者
.程序集变量 键盘状态, 逻辑型, , "256"
.程序集变量 地图中心, 双精度小数型, , "2"
.程序集变量 迷宫, 字节型, , "0"
.程序集变量 鼠标超出, 整数型, , "2"
.程序集变量 鼠标位置, 整数型, , "2"
.程序集变量 鼠标移动响应速度, 整数型, , , 移动的快慢
.程序集变量 计算中, 逻辑型

.子程序 建立OPenGL组件, , , 建立可供显示OPenGL的设备场景,不使用的时候必须撤消
.参数 窗口句柄
.局部变量 像素格式, 像素格式
.局部变量 像素格式号, 整数型

设备句柄 = 取任意设备句柄 (窗口句柄)
像素格式.大小 = 40
像素格式.版本 = 1
像素格式.标志 = 位或 (#GL_画入窗口的像素格式, #GL_双缓存像素格式, #GL_支持OPENGL像素格式)
像素格式.色彩深度 = 24
像素格式.cDepthBits = 32
像素格式号 = 选择像素格式 (设备句柄, 像素格式)
置像素格式 (设备句柄, 像素格式号, 像素格式)
着色描述表号 = 创建着色描述表 (设备句柄)
置当前着色描述表 (设备句柄, 着色描述表号)
框架初始化 ()

.子程序 撤消OPenGL组件, , , 撤消已经建立的OPenGL设备场景
.参数 窗口句柄
.局部变量 循环变量, 整数型

循环变量 = 1
.判断循环首 (是否存在列表 (循环变量))
    删除列表列 (循环变量, 1)
    循环变量 = 循环变量 + 1
.判断循环尾 ()
' 删除所有已经创建的显示列表
置当前着色描述表 (设备句柄, 0)
删除着色描述表 (着色描述表号)
释放设备句柄 (窗口句柄, 设备句柄)

.子程序 框架初始化, , , 所有的OpenGL初始化都在这里

清除颜色缓存 (0, 0, 0, 0)  ' 在这里修改你的背景颜色
设置明暗模式 (#GL_平坦)
清除深度缓存 (1)
启用功能 (#GL_深度测试)
深度测试 (#GL_小于)
设置画面质量 (#GL_透视修正质量, #GL_最佳)
' ==========显示==========
坐标缩放 (0.1, 0.1, 0.1)
' ==========资源==========
创建纹理 ()
' ==========实体数据==========
' 设置材质 (#正面, #漫反射光, { 1, 1, 1, 1 })  ' xz
' 设置材质 (#正面, #镜面光, { 1, 1, 1, 1 })  ' xz
定义光源 ({ 0.7, 0.7, 0.7, 1 }, { 0.9, 0.8, 0.4, 1 }, { 0, #眼高, 0, 0 }, #GL_一号光源)  ' xz
设置光照模式 (#GL_双面光模式, 1)  ' xz
定义光源 ({ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 0, #眼高, 0, 0 }, #GL_二号光源)
定义雾 (#GL_线性, { 0.4, 0.4, 0.4, 1 }, 0.005, 1, 2)
创建地板列表 ()
画天空盒 (2, 1, 2)
画门 ()
定义迷宫数据 (#地板长, #地板宽, 迷宫)
创建墙壁列表 (迷宫)
画地图 (迷宫, 3, 地图中心 [1], 地图中心 [2])
画准星 (0.002)
画游戏标题文字 (0.02, 0.01)
画指南针 (0.01)
画箭头 (0.5, -0.5, #地板长 - 0.5, 0.5 - #地板长, #墙壁高 × 3, 0.1, 0.05)

.子程序 绘图, , , 修改

清除缓存 (位或 (#GL_颜色缓存位, #GL_深度缓存位))
矩阵复位 ()
.如果真 (取反 (光源开关))
    停用功能 (#GL_一号光源)
.如果真结束
停用功能 (#GL_光照)
停用功能 (#GL_二维纹理)
调用列表 (#准星列表号)
.如果真 (地图开关)
    矩阵入栈 ()
    坐标平移 (地图中心 [1], 地图中心 [2], #最近距离 × -1)
    调用列表 (#地图列表号)
    显示位置 (玩家.位置.x, -玩家.位置.z, 地图中心 [1], 地图中心 [2])
    矩阵出栈 ()
.如果真结束
坐标旋转 (玩家.绕x, 1, 0, 0)
坐标旋转 (玩家.绕y, 0, 1, 0)
坐标平移 (-玩家.位置.x, -玩家.位置.y - 玩家.移动跳跃频率 × 求正弦 (玩家.移动跳跃相位), -玩家.位置.z)
调用列表 (#箭头列表号)
设置材质 (#GL_正面, #GL_环境光, { 0.7, 0.7, 0.7, 1 })
.如果真 (光源开关)
    启用功能 (#GL_一号光源)
.如果真结束
.如果真 (雾开关)
    启用功能 (#GL_雾)
.如果真结束
启用功能 (#GL_光照)
启用功能 (#GL_二维纹理)
调用列表 (#门列表号)
' 调用列表 (#天空列表号)  ' xz
调用列表 (#地板列表号)
调用列表 (#墙壁列表号)
调用列表 (#准星列表号)
停用功能 (#GL_一号光源)
停用功能 (#GL_雾)
启用功能 (#GL_二号光源)
调用列表 (#天空列表号)  ' xz
设置材质 (#GL_正面, #GL_环境光, { 1, 1, 1, 1 })
矩阵入栈 ()
矩阵复位 ()
坐标平移 (-0.04, 0.03, #最近距离 × -1)
调用列表 (#文字列表号)
坐标平移 (0.02, 0, 0)
坐标旋转 (玩家.绕y, 0, 0, 1)
调用列表 (#指南针列表号)
矩阵出栈 ()
停用功能 (#GL_二号光源)
交换缓存 (设备句柄)

.子程序 尺寸被改变, , , 修改可视范围
.参数 左边
.参数 底边
.参数 宽度
.参数 高度

设置视口 (左边, 底边, 宽度, 高度)
选择矩阵模式 (#GL_投影矩阵)
矩阵复位 ()
创建对称透视投影 (45, 宽度 ÷ 高度, 0.1, 100)
选择矩阵模式 (#GL_观察矩阵)
矩阵复位 ()

.子程序 变量初始化

置随机数种子 ()
' ==========显示变量==========
全屏显示 = 真
光源开关 = 真
地图开关 = 假
' ==========操作变量==========
玩家.位置.x = 0.5
玩家.位置.y = #眼高
玩家.位置.z = -0.5
玩家.移动速度 = 0.1
玩家.绕x = 0
玩家.绕y = 0
玩家.移动跳跃频率 = 0.005
玩家.移动跳跃相位 = 0
玩家.频率叠加值 = 1
地图中心 [1] = 0
地图中心 [2] = 0
' ==========记录鼠标==========
鼠标超出 = { 0, 0 }
鼠标移动响应速度 = 10

.子程序 键盘操作, , , 记录键盘的状态
.参数 键代码, 整数型
.参数 功能键状态, 整数型
.参数 键状态, 逻辑型
.局部变量 临时, 双精度小数型, , "2"

.判断开始 (键代码 = 27 且 键状态)  ' Esc键
    窗口_游戏画面.销毁 ()
.判断 (键代码 = 113 且 键状态 = 假)  ' 全屏
    全屏显示 = 取反 (全屏显示)
    输出调试文本 (“全屏显示:” + 到文本 (全屏显示))
    .如果 (全屏显示)
        窗口_游戏画面.移动 (0, 0, 取屏幕宽度 (), 取屏幕高度 ())
    .否则
        窗口_游戏画面.移动 (0, 0, 800, 600)
    .如果结束
    窗口_游戏画面.位置 = 1
.判断 (键代码 = 87)  ' 向前移动
    键盘状态 [3] = 键状态
.判断 (键代码 = 83)  ' 向后移动
    键盘状态 [4] = 键状态
.判断 (键代码 = 65)  ' 向左移动
    键盘状态 [5] = 键状态
.判断 (键代码 = 68)  ' 向右移动
    键盘状态 [6] = 键状态
.判断 (键代码 = 76 且 键状态)  ' 光开关
    光源开关 = 取反 (光源开关)
    输出调试文本 (“光源开关:” + 到文本 (光源开关))
    绘图 ()
.判断 (键代码 = 37 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [1] > -0.03)
        地图中心 [1] = 地图中心 [1] - 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 39 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [1] < 0.03)
        地图中心 [1] = 地图中心 [1] + 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 40 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [2] > -0.02)
        地图中心 [2] = 地图中心 [2] - 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 38 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [2] < 0.02)
        地图中心 [2] = 地图中心 [2] + 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 70 且 键状态)  ' 雾开关
    雾开关 = 取反 (雾开关)
    绘图 ()
.判断 (键代码 = 77 且 键状态)
    地图开关 = 取反 (地图开关)
    输出调试文本 (“地图开关:” + 到文本 (地图开关))
.判断 (键代码 = 32 且 键状态 = 假)
    .如果真 (取整 (玩家.位置.x) = #地板长 - 1 且 取整 (取绝对值 (玩家.位置.z)) = #地板宽 - 1)  ' 走到出口
        临时 [1] = 取绝对值 (玩家.绕y) % 360
        .如果真 (临时 [1] < 20 或 临时 [1] > 340)
            ' 在此处添加通关事件的处理代码
            信息框 (“已经通关啦!”, 0, “恭喜!”)
            窗口_游戏画面.销毁 ()
        .如果真结束

    .如果真结束

.默认

.判断结束


.子程序 鼠标操作, , , 记录鼠标的状态
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型

鼠标位置 [1] = 横向位置
鼠标位置 [2] = 纵向位置

.子程序 可否继续移动, 逻辑型, , 防止超出可移动范围的界限
.参数 横, 双精度小数型
.参数 纵, 双精度小数型
.局部变量 横整, 整数型
.局部变量 纵整, 整数型
.局部变量 横临时, 小数型
.局部变量 纵临时, 小数型

' 是否在地图边界内
横整 = 取整 (横) + 1
纵整 = 取整 (纵) + 1
横临时 = 横整 - 横
纵临时 = 纵整 - 纵
.判断开始 (横 ≤ #碰撞距离)
    返回 (假)
.判断 (横 ≥ #地板宽 - #碰撞距离)
    返回 (假)
.判断 (纵 ≤ #碰撞距离)
    返回 (假)
.判断 (纵 ≥ #地板长 - #碰撞距离)
    返回 (假)
.判断 (横临时 ≤ #碰撞距离 且 纵临时 ≤ #碰撞距离)  ' 左下角
    返回 (假)
.判断 (1 - 横临时 ≤ #碰撞距离 且 纵临时 ≤ #碰撞距离)  ' 右下角
    返回 (假)
.判断 (1 - 横临时 ≤ #碰撞距离 且 1 - 纵临时 ≤ #碰撞距离)  ' 右上角
    返回 (假)
.判断 (横临时 ≤ #碰撞距离 且 1 - 纵临时 ≤ #碰撞距离)  ' 左上角
    返回 (假)
.判断 (迷宫 [横整] [纵整] [1] = 0 且 1 - 横临时 ≤ #碰撞距离)  ' 左
    返回 (假)
.判断 (迷宫 [横整] [纵整] [3] = 0 且 横临时 ≤ #碰撞距离)  ' 右
    返回 (假)
.判断 (迷宫 [横整] [纵整] [2] = 0 且 1 - 纵临时 ≤ #碰撞距离)  ' 下
    返回 (假)
.判断 (迷宫 [横整] [纵整] [4] = 0 且 纵临时 ≤ #碰撞距离)  ' 上
    返回 (假)
.默认

.判断结束
返回 (真)

.子程序 计算视点, , , 判断玩家的当前位置,也可以增加游戏过程的触发事件
.局部变量 临时, 双精度小数型, , "2"
.局部变量 显示中心, 双精度小数型, , "2"
.局部变量 频率叠加, 逻辑型

.如果真 (计算中 = 假)
    计算中 = 真
    显示中心 [1] = 窗口_游戏画面.宽度 ÷ 2
    显示中心 [2] = 窗口_游戏画面.高度 ÷ 2
    .如果真 (取绝对值 (鼠标位置 [2] - 显示中心 [2]) > 0)
        玩家.绕x = (鼠标位置 [2] - 显示中心 [2]) ÷
2..版本 2
.支持库 OPenGL

.程序集 框架程序集
.程序集变量 着色描述表号, 整数型
.程序集变量 设备句柄, 整数型, , , OPenGL组件的设备句柄
.程序集变量 全屏显示, 逻辑型
.程序集变量 光源开关, 逻辑型
.程序集变量 雾开关, 逻辑型
.程序集变量 地图开关, 逻辑型
.程序集变量 玩家, 观察者
.程序集变量 键盘状态, 逻辑型, , "256"
.程序集变量 地图中心, 双精度小数型, , "2"
.程序集变量 迷宫, 字节型, , "0"
.程序集变量 鼠标超出, 整数型, , "2"
.程序集变量 鼠标位置, 整数型, , "2"
.程序集变量 鼠标移动响应速度, 整数型, , , 移动的快慢
.程序集变量 计算中, 逻辑型

.子程序 建立OPenGL组件, , , 建立可供显示OPenGL的设备场景,不使用的时候必须撤消
.参数 窗口句柄
.局部变量 像素格式, 像素格式
.局部变量 像素格式号, 整数型

设备句柄 = 取任意设备句柄 (窗口句柄)
像素格式.大小 = 40
像素格式.版本 = 1
像素格式.标志 = 位或 (#GL_画入窗口的像素格式, #GL_双缓存像素格式, #GL_支持OPENGL像素格式)
像素格式.色彩深度 = 24
像素格式.cDepthBits = 32
像素格式号 = 选择像素格式 (设备句柄, 像素格式)
置像素格式 (设备句柄, 像素格式号, 像素格式)
着色描述表号 = 创建着色描述表 (设备句柄)
置当前着色描述表 (设备句柄, 着色描述表号)
框架初始化 ()

.子程序 撤消OPenGL组件, , , 撤消已经建立的OPenGL设备场景
.参数 窗口句柄
.局部变量 循环变量, 整数型

循环变量 = 1
.判断循环首 (是否存在列表 (循环变量))
    删除列表列 (循环变量, 1)
    循环变量 = 循环变量 + 1
.判断循环尾 ()
' 删除所有已经创建的显示列表
置当前着色描述表 (设备句柄, 0)
删除着色描述表 (着色描述表号)
释放设备句柄 (窗口句柄, 设备句柄)

.子程序 框架初始化, , , 所有的OpenGL初始化都在这里

清除颜色缓存 (0, 0, 0, 0)  ' 在这里修改你的背景颜色
设置明暗模式 (#GL_平坦)
清除深度缓存 (1)
启用功能 (#GL_深度测试)
深度测试 (#GL_小于)
设置画面质量 (#GL_透视修正质量, #GL_最佳)
' ==========显示==========
坐标缩放 (0.1, 0.1, 0.1)
' ==========资源==========
创建纹理 ()
' ==========实体数据==========
' 设置材质 (#正面, #漫反射光, { 1, 1, 1, 1 })  ' xz
' 设置材质 (#正面, #镜面光, { 1, 1, 1, 1 })  ' xz
定义光源 ({ 0.7, 0.7, 0.7, 1 }, { 0.9, 0.8, 0.4, 1 }, { 0, #眼高, 0, 0 }, #GL_一号光源)  ' xz
设置光照模式 (#GL_双面光模式, 1)  ' xz
定义光源 ({ 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 0, #眼高, 0, 0 }, #GL_二号光源)
定义雾 (#GL_线性, { 0.4, 0.4, 0.4, 1 }, 0.005, 1, 2)
创建地板列表 ()
画天空盒 (2, 1, 2)
画门 ()
定义迷宫数据 (#地板长, #地板宽, 迷宫)
创建墙壁列表 (迷宫)
画地图 (迷宫, 3, 地图中心 [1], 地图中心 [2])
画准星 (0.002)
画游戏标题文字 (0.02, 0.01)
画指南针 (0.01)
画箭头 (0.5, -0.5, #地板长 - 0.5, 0.5 - #地板长, #墙壁高 × 3, 0.1, 0.05)

.子程序 绘图, , , 修改

清除缓存 (位或 (#GL_颜色缓存位, #GL_深度缓存位))
矩阵复位 ()
.如果真 (取反 (光源开关))
    停用功能 (#GL_一号光源)
.如果真结束
停用功能 (#GL_光照)
停用功能 (#GL_二维纹理)
调用列表 (#准星列表号)
.如果真 (地图开关)
    矩阵入栈 ()
    坐标平移 (地图中心 [1], 地图中心 [2], #最近距离 × -1)
    调用列表 (#地图列表号)
    显示位置 (玩家.位置.x, -玩家.位置.z, 地图中心 [1], 地图中心 [2])
    矩阵出栈 ()
.如果真结束
坐标旋转 (玩家.绕x, 1, 0, 0)
坐标旋转 (玩家.绕y, 0, 1, 0)
坐标平移 (-玩家.位置.x, -玩家.位置.y - 玩家.移动跳跃频率 × 求正弦 (玩家.移动跳跃相位), -玩家.位置.z)
调用列表 (#箭头列表号)
设置材质 (#GL_正面, #GL_环境光, { 0.7, 0.7, 0.7, 1 })
.如果真 (光源开关)
    启用功能 (#GL_一号光源)
.如果真结束
.如果真 (雾开关)
    启用功能 (#GL_雾)
.如果真结束
启用功能 (#GL_光照)
启用功能 (#GL_二维纹理)
调用列表 (#门列表号)
' 调用列表 (#天空列表号)  ' xz
调用列表 (#地板列表号)
调用列表 (#墙壁列表号)
调用列表 (#准星列表号)
停用功能 (#GL_一号光源)
停用功能 (#GL_雾)
启用功能 (#GL_二号光源)
调用列表 (#天空列表号)  ' xz
设置材质 (#GL_正面, #GL_环境光, { 1, 1, 1, 1 })
矩阵入栈 ()
矩阵复位 ()
坐标平移 (-0.04, 0.03, #最近距离 × -1)
调用列表 (#文字列表号)
坐标平移 (0.02, 0, 0)
坐标旋转 (玩家.绕y, 0, 0, 1)
调用列表 (#指南针列表号)
矩阵出栈 ()
停用功能 (#GL_二号光源)
交换缓存 (设备句柄)

.子程序 尺寸被改变, , , 修改可视范围
.参数 左边
.参数 底边
.参数 宽度
.参数 高度

设置视口 (左边, 底边, 宽度, 高度)
选择矩阵模式 (#GL_投影矩阵)
矩阵复位 ()
创建对称透视投影 (45, 宽度 ÷ 高度, 0.1, 100)
选择矩阵模式 (#GL_观察矩阵)
矩阵复位 ()

.子程序 变量初始化

置随机数种子 ()
' ==========显示变量==========
全屏显示 = 真
光源开关 = 真
地图开关 = 假
' ==========操作变量==========
玩家.位置.x = 0.5
玩家.位置.y = #眼高
玩家.位置.z = -0.5
玩家.移动速度 = 0.1
玩家.绕x = 0
玩家.绕y = 0
玩家.移动跳跃频率 = 0.005
玩家.移动跳跃相位 = 0
玩家.频率叠加值 = 1
地图中心 [1] = 0
地图中心 [2] = 0
' ==========记录鼠标==========
鼠标超出 = { 0, 0 }
鼠标移动响应速度 = 10

.子程序 键盘操作, , , 记录键盘的状态
.参数 键代码, 整数型
.参数 功能键状态, 整数型
.参数 键状态, 逻辑型
.局部变量 临时, 双精度小数型, , "2"

.判断开始 (键代码 = 27 且 键状态)  ' Esc键
    窗口_游戏画面.销毁 ()
.判断 (键代码 = 113 且 键状态 = 假)  ' 全屏
    全屏显示 = 取反 (全屏显示)
    输出调试文本 (“全屏显示:” + 到文本 (全屏显示))
    .如果 (全屏显示)
        窗口_游戏画面.移动 (0, 0, 取屏幕宽度 (), 取屏幕高度 ())
    .否则
        窗口_游戏画面.移动 (0, 0, 800, 600)
    .如果结束
    窗口_游戏画面.位置 = 1
.判断 (键代码 = 87)  ' 向前移动
    键盘状态 [3] = 键状态
.判断 (键代码 = 83)  ' 向后移动
    键盘状态 [4] = 键状态
.判断 (键代码 = 65)  ' 向左移动
    键盘状态 [5] = 键状态
.判断 (键代码 = 68)  ' 向右移动
    键盘状态 [6] = 键状态
.判断 (键代码 = 76 且 键状态)  ' 光开关
    光源开关 = 取反 (光源开关)
    输出调试文本 (“光源开关:” + 到文本 (光源开关))
    绘图 ()
.判断 (键代码 = 37 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [1] > -0.03)
        地图中心 [1] = 地图中心 [1] - 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 39 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [1] < 0.03)
        地图中心 [1] = 地图中心 [1] + 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 40 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [2] > -0.02)
        地图中心 [2] = 地图中心 [2] - 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 38 且 键状态 且 地图开关)  ' 地图中心坐标
    .如果真 (地图中心 [2] < 0.02)
        地图中心 [2] = 地图中心 [2] + 0.01
    .如果真结束
    绘图 ()
.判断 (键代码 = 70 且 键状态)  ' 雾开关
    雾开关 = 取反 (雾开关)
    绘图 ()
.判断 (键代码 = 77 且 键状态)
    地图开关 = 取反 (地图开关)
    输出调试文本 (“地图开关:” + 到文本 (地图开关))
.判断 (键代码 = 32 且 键状态 = 假)
    .如果真 (取整 (玩家.位置.x) = #地板长 - 1 且 取整 (取绝对值 (玩家.位置.z)) = #地板宽 - 1)  ' 走到出口
        临时 [1] = 取绝对值 (玩家.绕y) % 360
        .如果真 (临时 [1] < 20 或 临时 [1] > 340)
            ' 在此处添加通关事件的处理代码
            信息框 (“已经通关啦!”, 0, “恭喜!”)
            窗口_游戏画面.销毁 ()
        .如果真结束

    .如果真结束

.默认

.判断结束


.子程序 鼠标操作, , , 记录鼠标的状态
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型

鼠标位置 [1] = 横向位置
鼠标位置 [2] = 纵向位置

.子程序 可否继续移动, 逻辑型, , 防止超出可移动范围的界限
.参数 横, 双精度小数型
.参数 纵, 双精度小数型
.局部变量 横整, 整数型
.局部变量 纵整, 整数型
.局部变量 横临时, 小数型
.局部变量 纵临时, 小数型

' 是否在地图边界内
横整 = 取整 (横) + 1
纵整 = 取整 (纵) + 1
横临时 = 横整 - 横
纵临时 = 纵整 - 纵
.判断开始 (横 ≤ #碰撞距离)
    返回 (假)
.判断 (横 ≥ #地板宽 - #碰撞距离)
    返回 (假)
.判断 (纵 ≤ #碰撞距离)
    返回 (假)
.判断 (纵 ≥ #地板长 - #碰撞距离)
    返回 (假)
.判断 (横临时 ≤ #碰撞距离 且 纵临时 ≤ #碰撞距离)  ' 左下角
    返回 (假)
.判断 (1 - 横临时 ≤ #碰撞距离 且 纵临时 ≤ #碰撞距离)  ' 右下角
    返回 (假)
.判断 (1 - 横临时 ≤ #碰撞距离 且 1 - 纵临时 ≤ #碰撞距离)  ' 右上角
    返回 (假)
.判断 (横临时 ≤ #碰撞距离 且 1 - 纵临时 ≤ #碰撞距离)  ' 左上角
    返回 (假)
.判断 (迷宫 [横整] [纵整] [1] = 0 且 1 - 横临时 ≤ #碰撞距离)  ' 左
    返回 (假)
.判断 (迷宫 [横整] [纵整] [3] = 0 且 横临时 ≤ #碰撞距离)  ' 右
    返回 (假)
.判断 (迷宫 [横整] [纵整] [2] = 0 且 1 - 纵临时 ≤ #碰撞距离)  ' 下
    返回 (假)
.判断 (迷宫 [横整] [纵整] [4] = 0 且 纵临时 ≤ #碰撞距离)  ' 上
    返回 (假)
.默认

.判断结束
返回 (真)

.子程序 计算视点, , , 判断玩家的当前位置,也可以增加游戏过程的触发事件
.局部变量 临时, 双精度小数型, , "2"
.局部变量 显示中心, 双精度小数型, , "2"
.局部变量 频率叠加, 逻辑型

.如果真 (计算中 = 假)
    计算中 = 真
    显示中心 [1] = 窗口_游戏画面.宽度 ÷ 2
    显示中心 [2] = 窗口_游戏画面.高度 ÷ 2
    .如果真 (取绝对值 (鼠标位置 [2] - 显示中心 [2]) > 0)
        玩家.绕x = (鼠标位置 [2] - 显示中心 [2]) ÷ 鼠标移动响应速度
        玩家.绕x = 玩家.绕x + 鼠标超出 [2] × #鼠标左边界 ÷ 鼠标移动响应速度
    .如果真结束
    .如果真 (取绝对值 (鼠标位置 [1] - 显示中心 [1]) > 0)
        玩家.绕y = (鼠标位置 [1] - 显示中心 [1]) ÷ 鼠标移动响应速度
        玩家.绕y = 玩家.绕y + 鼠标超出 [1] × #鼠标左边界 ÷ 鼠标移动响应速度
    .如果真结束
    .判断开始 (鼠标位置 [1] < 显示中心 [1] - #鼠标左边界)
        ' 左移
        置鼠标位置 (窗口_游戏画面.左边 + 窗口_游戏画面.左边 + 显示中心 [1], 鼠标位置 [2])
        鼠标超出 [1] = 鼠标超出 [1] - 1
    .判断 (鼠标位置 [1] > 显示中心 [1] + #鼠标右边界)
        置鼠标位置 (窗口_游戏画面.左边 + 窗口_游戏画面.左边 + 显示中心 [1], 鼠标位置 [2])
        ' 右移
        鼠标超出 [1] = 鼠标超出 [1] + 1
    .默认

    .判断结束
    .如果真