开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 106|回复: 1
收起左侧

[讨论] 易语言源码复制进来结构分支错误怎么办

[复制链接]
结帖率:100% (1/1)
发表于 昨天 20:43 | 显示全部楼层 |阅读模式   江苏省淮安市
  
' ============================================================================
' 精灵村地图 A* 寻路 — 纯易语言实现
' 地图文件: "精灵村" (12字节头 + 宽×高字节网格, 0=障碍, 非0=可行走)
' 六边形蜂巢 8方向移动, 不贴地形, 少转向, 远离障碍物
' ============================================================================
' ===== 数据类型定义 =====
数据类型名公开备 注
堆节点型 
成员名类 型传址数组备 注
index整数型    ' 格子索引 (y*宽+x+1)  
f整数型  
g整数型  
数据类型名公开备 注
路径段型 
成员名类 型传址数组备 注
起点X整数型  
起点Y整数型  
终点X整数型  
终点Y整数型  
方向整数型    ' 原始方向 1-8  
输出方向整数型  ' DIR_NUM 映射后的方向数  
距离整数型  
步数整数型  
窗口程序集名保 留  保 留备 注
程序集1   
' ===== 全局变量 =====
窗口程序集名保 留  保 留备 注
(未填写程序集名)   
变量名类 型数组备 注
变量名类 型数组备 注
地图_宽整数型  
地图_高整数型  
地图_数据字节型0"    ' 一维字节0=障碍
地图_已加载逻辑型  
清除度场字节型0"    ' 障碍物0=障碍, 1=紧邻...
清除度场_开启逻辑型  
DX_偶数整数型8 
DY_偶数整数型8 
DX_奇数整数型8 
DY_奇数整数型8 
MOVE_COST整数型8 
DIR_NUM整数型8 
寻路结果文本文本型  
压缩结果文本文本型  
' ---- 最小堆 ----
窗口程序集名保 留  保 留备 注
(未填写程序集名)   
变量名类 型数组备 注
变量名类 型数组备 注
堆_数据堆节点型0 
堆_大小整数型  
' ---- A* 节点数组 (每个格子一份) ----
窗口程序集名保 留  保 留备 注
(未填写程序集名)   
变量名类 型数组备 注
变量名类 型数组备 注
节点_g整数型0 
节点_f整数型0 
节点_parent整数型0 
节点_pdir字节型0 
节点_state字节型0"    ' 0=未1=Open, 2=Closed
' ============================================================================
' 1. 初始化 (程序启动时调用一次)
' ============================================================================
子程序名返回值类型公开备 注
寻路_初始化 
' 方向常量 (1-based, 共8个方向)
' X偶数时的偏移
DX_偶数 = { 0, 1, 2, 1, 0, -1, -2, -1 }
DY_偶数 = { -1, -1, 0, 0, 1, 0, 0, -1 }
' X奇数时的偏移
DX_奇数 = { 0, 1, 2, 1, 0, -1, -2, -1 }
DY_奇数 = { -1, 0, 0, 1, 1, 1, 0, 0 }
' 移动代价: 直走20, 斜走14
MOVE_COST = { 20, 14, 20, 14, 20, 14, 20, 14 }
' 方向数字映射: ↑=8 ↗=9 →=6 ↘=3 ↓=2 ↙=1 ←=4 ↖=7
DIR_NUM = { 8, 9, 6, 3, 2, 1, 4, 7 }
地图_已加载 = 假
清除度场_开启 = 真
' ============================================================================
' 2. 辅助函数
' ============================================================================
子程序名返回值类型公开备 注
取格子索引整数型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x整数型
y整数型
返回 (y × 地图_宽 + x + 1)
子程序名返回值类型公开备 注
坐标合法逻辑型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x整数型
y整数型
返回 (x ≥ 0 x < 地图_宽 y ≥ 0 y < 地图_高)
子程序名返回值类型公开备 注
坐标可行走逻辑型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x整数型
y整数型
.局部变量 idx, 整数型
如果真 (取反 (坐标合法 (x, y)))
返回 ()
如果真结束
idx = 取格子索引 (x, y)
返回 (地图_数据 [idx] ≠ 0)
' 对角移动安全检查 (防止穿墙角)
子程序名返回值类型公开备 注
对角安全逻辑型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x整数型
y整数型
dx整数型
dy整数型
如果真 (dx = 0 dy = 0)
返回 ()  ' 非真对角,安全
如果真结束
返回 (坐标可行走 (x + dx, y) 坐标可行走 (x, y + dy))
' 启发式: 可采纳下界
子程序名返回值类型公开备 注
启发式整数型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x1整数型
y1整数型
x2整数型
y2整数型
.局部变量 dx, 整数型
.局部变量 dy, 整数型
.局部变量 pairs, 整数型
.局部变量 rx, 整数型
.局部变量 ry, 整数型
.局部变量 h, 整数型
dx = 取绝对值 (x1 - x2)
dy = 取绝对值 (y1 - y2)
pairs = 选择 (dx \ 2 < dy, dx \ 2, dy)  ' min(dx/2, dy)
rx = dx - 2 × pairs
ry = dy - pairs
h = 28 × pairs
如果 (rx = 1 ry > 0)
h = h + 14 + 20 (ry - 1)
否则
h = h + 14 × rx + 20 × ry
如果结束
返回 (h)
' 障碍物清除度惩罚
子程序名返回值类型公开备 注
清除度惩罚整数型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
x整数型
y整数型
.局部变量 idx, 整数型
.局部变量 c, 整数型
如果真 (取反 (清除度场_开启) 取数组成员数 (清除度场) = 0)
返回 (0)
如果真结束
idx = 取格子索引 (x, y)
如果真 (idx < 1 idx > 取数组成员数 (清除度场))
返回 (0)
如果真结束
c = 清除度场 [idx]
如果真 (c = 0 c ≥ 3)  ' OBSTACLE_CLEARANCE = 2, 所以 ≥3 的不惩罚
返回 (0)
如果真结束
返回 ( (3 - c) × 23)    ' (3-c) * OBSTACLE_PENALTY(23)
' ============================================================================
' 3. 最小堆操作
' ============================================================================
子程序名返回值类型公开备 注
堆_初始化  
重定义数组 (堆_数据, 假, 0)
堆_大小 = 0
子程序名返回值类型公开备 注
堆_上浮  
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
i整数型
.局部变量 p, 整数型
.局部变量 temp, 堆节点型
判断循环首 (i > 1)
p = i \ 2
如果 (堆_数据 [i].f < 堆_数据 [p].f)
temp = 堆_数据 [i]
堆_数据 [i] = 堆_数据 [p]
堆_数据 [p] = temp
i = p
否则
跳出循环 ()
如果结束
判断循环尾 ()
子程序名返回值类型公开备 注
堆_下沉  
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
i整数型
.局部变量 左, 整数型
.局部变量 右, 整数型
.局部变量 best, 整数型
.局部变量 temp, 堆节点型
判断循环首 ()
左 = i × 2
右 = 左 + 1
best = i
如果 (左 ≤ 堆_大小 堆_数据 [].f < 堆_数据 [best].f)
best = 左
如果结束
如果 (右 ≤ 堆_大小 堆_数据 [].f < 堆_数据 [best].f)
best = 右
如果结束
如果 (best = i)
跳出循环 ()
如果结束
temp = 堆_数据 [i]
堆_数据 [i] = 堆_数据 [best]
堆_数据 [best] = temp
i = best
判断循环尾 ()
子程序名返回值类型公开备 注
堆_压入  
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
idx整数型
f整数型
g整数型
.局部变量 node, 堆节点型
node.index = idx
node.f = f
node.g = g
加入成员 (堆_数据, node)
堆_大小 = 取数组成员数 (堆_数据)
堆_上浮 (堆_大小)
子程序名返回值类型公开备 注
堆_弹出堆节点型 
.局部变量 result, 堆节点型
如果真 (堆_大小 = 0)
result.index = -1
result.f = 0
result.g = 0
返回 (result)
如果真结束
result = 堆_数据 [1]
堆_数据 [1] = 堆_数据 [堆_大小]
删除成员 (堆_数据, 堆_大小, 1)
堆_大小 = 堆_大小 - 1
如果 (堆_大小 > 0)
堆_下沉 (1)
如果结束
返回 (result)
子程序名返回值类型公开备 注
堆_是否空逻辑型 
返回 (堆_大小 = 0)
' ============================================================================
' 4. 地图加载 / 释放
' ============================================================================
子程序名返回值类型公开备 注
地图_加载逻辑型 
DLL命令名返回值类型公开备 注
(暂未填写DLL命令名)   
DLL库文件名:
(未填写库文件名)
在DLL库中对应命令名:
(未填写命令名)
参数名类 型传址数组备 注
文件路径文本型
.局部变量 文件号, 整数型
.局部变量 文件长度, 整数型
.局部变量 文件内容, 字节集
.局部变量 头1, 整数型
.局部变量 总格数, 整数型
.局部变量 i, 整数型
.局部变量 数据长度, 整数型
' 先释放旧地图
地图_释放 ()
' 打开文件
文件号 = 打开文件 (文件路径, #读入, #无限制 )
如果真 (文件号 = 0)
输出调试文本 ("[!] 无法打开地图文件: " + 文件路径)
返回 ()
如果真结束
移动读写位置 (文件号, #文件首, 0)
文件长度 = 取文件长度 (文件号)
文件内容 = 读入字节集 (文件号, 文件长度)
关闭文件 (文件号)
如果真 (文件长度 < 13)
输出调试文本 ("[!] 地图文件太小")
返回 ()
如果真结束
' 解析: 第1-4字节=头, 第5-8=宽, 第9-12=高 (小端序)
头1 = 取字节集数据 (取字节集中间 (文件内容, 1, 4), #整数型, )
地图_宽 = 取字节集数据 (取字节集中间 (文件内容, 5, 4), #整数型, )
地图_高 = 取字节集数据 (取字节集中间 (文件内容, 9, 4), #整数型, )
输出调试文本 ("[+] 地图: " + 到文本 (地图_宽) + " x " + 到文本 (地图_高) + " = " + 到文本 (地图_宽 × 地图_高) + " 格")
总格数 = 地图_宽 × 地图_高
数据长度 = 文件长度 - 12
如果真 (数据长度 < 总格数)
输出调试文本 ("[!] 地图数据不完整")
地图_宽 = 0
地图_高 = 0
返回 ()
如果真结束
' 读入网格数据
重定义数组 (地图_数据, 假, 总格数)
变量循环首 (1, 总格数, 1, i)
地图_数据 [i] = 文件内容 [i + 12]
变量循环尾 ()
地图_已加载 = 真
' 预计算障碍物清除度场
清除度场_计算 ()
返回 ()
子程序名返回值类型公开备 注
地图_释放 
地图_宽 = 0
地图_高 = 0
重定义数组 (地图_数据, 假, 0)
重定义数组 (清除度场, 假, 0)
地图_已加载 = 假
' ============================================================================
' 5. 障碍物清除度场 (BFS 从所有障碍物扩散距离)
' ============================================================================
子程序名返回值类型公开备 注
清除度场_计算  
.局部变量 总格数, 整数型
.局部变量 i, 整数型
.局部变量 队列, 整数型, , "0"
.局部变量 队头, 整数型
.局部变量 队尾, 整数型
.局部变量 ci, 整数型
.局部变量 cx, 整数型
.局部变量 cy, 整数型
.局部变量 nd, 整数型
.局部变量 d, 整数型
.局部变量 nx, 整数型
.局部变量 ny, 整数型
.局部变量 ni, 整数型
.局部变量 pDX, 整数型, , "0"
.局部变量 pDY, 整数型, , "0"
如果真 (取反 (地图_已加载))
返回 ()
如果真结束
总格数 = 地图_宽 × 地图_高
重定义数组 (清除度场, 假, 总格数)
' 初始化: 障碍物=0, 可行走=255
变量循环首 (1, 总格数, 1, i)
如果 (地图_数据 [i] = 0)
清除度场 [i] = 0
加入成员 (队列, i)  ' 障碍物入队
否则
清除度场 [i] = 255
如果结束
变量循环尾 ()
' BFS 扩散
队头 = 1
队尾 = 取数组成员数 (队列)
判断循环首 (队头 ≤ 队尾)
ci = 队列 [队头]
队头 = 队头 + 1
cx (ci - 1) % 地图_宽
cy (ci - 1) \ 地图_宽
nd = 清除度场 [ci] + 1
' 选择偏移表
如果 (位与 (cx, 1) = 1)  ' X奇数
pDX = DX_奇数
pDY = DY_奇数
否则
pDX = DX_偶数
pDY = DY_偶数
如果结束
变量循环首 (1, 8, 1, d

结帖率:94% (204/217)

签到天数: 14 天

发表于 2 小时前 | 显示全部楼层   安徽省芜湖市
你从哪复制的 从AI吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表