|
发表于 2017-8-22 09:08:57
|
显示全部楼层
本帖最后由 无敌吴刚 于 2017-8-22 09:16 编辑
何以见得不能用中文编程呢?况且你楼上所说的“中文在计算机中的应用无形中还比西文增加了计算机的运算量,因为西文充其量就是ASCII码中的字符,中文需要面对最少2000个汉字。只不过使用者并没有感觉出来而已。从讲究效率来讲是很不合算的。”,你所说的是VB这种解释语言的工作方式吧??其它那些流行的编译语言,哪一个需要用这种方式来工作的?不都是充当于一个翻译器,直接一次性将语言翻译成机器码的程序文件吗?中文与英文有何区别?顶多在编译程序那个时候,花多一点儿运算量而已(这个工作只有一次,以现在的机器的性能,当食生菜啊),生成EXE文件后,不都是一样的么?
如果想,就连关键字其实都可以用中文来代替的!只不过流行的编译工具大多数是外国人开发的,就用了英文而已,至于其它变量,函数命,结构定义什么的,现在都可以用中文(以前Ansi的时候,就比较麻烦,因为有一部分汉字的字码与英文字符的字码有重叠,这个解析起来有可能会有错误,现在则不再会了)。
最后让摘取部分我写的中英结合的不论不类的A*寻路算法,可以看到里面有很多中文,也有英文,编译成程序,一点问题都没有!也不见得会慢,因为最终运行的都是机器码。
procedure TAXMap.光标转换到地图坐标(X, Y: Integer; var MapX, MapY: Integer);
begin
MapX:=X div F显示比例;
MapY:=Y div F显示比例;
end;
function TAXMap.初始化开始寻路(): Boolean;
var
X, Y: Integer;
begin
for X:=0 to MapWidth-1 do
begin
for Y:=0 to MapHeight-1 do
begin
MapData[X, Y].TR:=0;
end;
end;
调试_1:=0;
开启节点记录列表大小:=0;
SetLength(开启节点记录列表, 开启节点记录列表大小);
MapData[F路径计算开始点X, F路径计算开始点Y].父节点X:=F路径计算开始点X;
MapData[F路径计算开始点X, F路径计算开始点Y].父节点Y:=F路径计算开始点Y;
MapData[F路径计算开始点X, F路径计算开始点Y].父节点方向:=3;
寻路_开启节点记录列表最大历吏记录:=0;
已寻路:=False;
if (F路径计算开始点X=F路径计算结束点X) and (F路径计算开始点Y=F路径计算结束点Y) then
begin
已寻路:=True;
Result:=False;
end
else
begin
Result:=True;
end;
end;
function TAXMap.坐标非法(X, Y: Integer): Boolean;
begin
Result:=True;
if X<0 then
Exit;
if Y<0 then
Exit;
if X>=MapWidth then
Exit;
if Y>=MapHeight then
Exit;
Result:=False;
end;
procedure TAXMap.添加到开启列表(X, Y: Integer);
begin
开启节点记录列表大小:=开启节点记录列表大小+1;
if 寻路_开启节点记录列表最大历吏记录<开启节点记录列表大小 then
begin
寻路_开启节点记录列表最大历吏记录:=开启节点记录列表大小;
end;
SetLength(开启节点记录列表, 开启节点记录列表大小);
开启节点记录列表[开启节点记录列表大小-1].X:=X;
开启节点记录列表[开启节点记录列表大小-1].Y:=Y;
end;
procedure TAXMap.从开启列表中删除(T: Integer);
var
N: Integer;
begin
for N:=T to 开启节点记录列表大小-2 do //事实证明这样子很多余,既然是无序数组,何需移动数据?直接将最后元素换到当前位置即可
begin
开启节点记录列表[N]:=开启节点记录列表[N+1];
end;
开启节点记录列表大小:=开启节点记录列表大小-1;
// 开启节点记录列表[T]:=开启节点记录列表[开启节点记录列表大小]; //这样应该会快多了吧
SetLength(开启节点记录列表, 开启节点记录列表大小);
end;
function TAXMap.开启列表中寻找最小(var X, Y, T: Integer): Boolean;
var
n: Integer;
MinF: Integer;
begin
if 开启节点记录列表大小<=0 then
begin
Result:=False;
Exit;
end;
Result:=True;
MinF:=MapData[开启节点记录列表[0].X, 开启节点记录列表[0].Y].F;
X:=开启节点记录列表[0].X;
Y:=开启节点记录列表[0].Y;
T:=0;
for n:=1 to 开启节点记录列表大小-1 do
begin
if MapData[开启节点记录列表[n].X, 开启节点记录列表[n].Y].F<MinF then
begin
MinF:=MapData[开启节点记录列表[n].X, 开启节点记录列表[n].Y].F;
X:=开启节点记录列表[n].X;
Y:=开启节点记录列表[n].Y;
T:=n;
end;
end;
end;
procedure TAXMap.开始寻路1;
var
X, Y, T, X1, Y1: Integer;
N, G: Integer;
label
L完成寻路;
begin
if 初始化开始寻路()=False then
Exit;
//开启第一个节点
MapData[F路径计算开始点X, F路径计算开始点Y].TR:=1; //标记开启
MapData[F路径计算开始点X, F路径计算开始点Y].G:=0; //起点到此点损耗 0
MapData[F路径计算开始点X, F路径计算开始点Y].H:=估算到终点距离(F路径计算开始点X, F路径计算开始点Y); //此点到终点损耗评估
MapData[F路径计算开始点X, F路径计算开始点Y].F:=MapData[F路径计算开始点X, F路径计算开始点Y].G+MapData[F路径计算开始点X, F路径计算开始点Y].H;
//添加第一个记录
开启节点记录列表大小:=1;
SetLength(开启节点记录列表, 开启节点记录列表大小);
开启节点记录列表[0].X:=F路径计算开始点X;
开启节点记录列表[0].Y:=F路径计算开始点Y;
//开始寻路
while 开启列表中寻找最小(X, Y, T) do
begin
for N:=0 to 7 do //开启周围7个方向的格子
begin
调试_1:=调试_1+1;
X1:=X+DirToDianX[N];
Y1:=Y+DirToDianY[N];
if 坐标非法(X1, Y1) then //该格子超出地图边界
Continue;
if 寻路_终点可以是个障碍物 then //非正常寻路,即终点是一个障碍点,但这个障碍点的周围是一个可到达的通路的,用这个,直接比较X1 Y1,速度慢少少
begin
if X1=F路径计算结束点X then //直接与终点比较
if Y1=F路径计算结束点Y then
begin
if N in [1, 3, 5, 7] then
MapData[X1, Y1].G:=MapData[X, Y].G+寻路_斜线耗损距离
else
MapData[X1, Y1].G:=MapData[X, Y].G+寻路_直线耗损距离;
MapData[X1, Y1].H:=估算到终点距离(X1, Y1);
MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H;
MapData[X1, Y1].父节点X:=X;
MapData[X1, Y1].父节点Y:=Y;
MapData[X1, Y1].父节点方向:=求反方向[N];
已寻路:=True;
goto L完成寻路;
end;
end;
case MapData[X1, Y1].TR of
0: //未被标记的节点
begin
if MapData[X1, Y1].Open=False then //障碍物
begin
MapData[X1, Y1].TR:=2; //直接设该格子为关闭的节点 不被访问
Continue;
end;
if N in [1, 3, 5, 7] then
MapData[X1, Y1].G:=MapData[X, Y].G+寻路_斜线耗损距离
else
MapData[X1, Y1].G:=MapData[X, Y].G+寻路_直线耗损距离;
MapData[X1, Y1].H:=估算到终点距离(X1, Y1);
MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H;
MapData[X1, Y1].父节点X:=X;
MapData[X1, Y1].父节点Y:=Y;
MapData[X1, Y1].父节点方向:=求反方向[N];
MapData[X1, Y1].TR:=1; //开启节点
添加到开启列表(X1, Y1);
if 寻路_终点可以是个障碍物=False then //正常的寻路,即终点为一个可到达的点,就可以用这个来判断,这样速度快少少 否则 则用上面比较X1 Y1后直接判断
begin
if MapData[X1, Y1].H=0 then //到终点估算距离为0,即到达终点
begin
已寻路:=True;
goto L完成寻路;
end;
end;
end;
1: //已标记为开启节点的格子
begin
if N in [1, 3, 5, 7] then //重新计算G值(开始点到此节点的损耗距离)
G:=MapData[X, Y].G+寻路_斜线耗损距离
else
G:=MapData[X, Y].G+寻路_直线耗损距离;
// H:=估算到终点距离(X1, Y1); 不需要重新计算H值
//F:=G+H; 不需要重新计算
if G<MapData[X1, Y1].G then //而是根据G判断 简化
begin
MapData[X1, Y1].G:=G; //重新获得更小的G值
MapData[X1, Y1].F:=MapData[X1, Y1].G+MapData[X1, Y1].H; //重新计算更小的F值
MapData[X1, Y1].父节点X:=X;
MapData[X1, Y1].父节点Y:=Y;
MapData[X1, Y1].父节点方向:=求反方向[N];
end;
end;
2: //该格子为已关闭节点
begin
Continue;
end;
end;
end;
MapData[X, Y].TR:=2; //已完成周边格子开启 关闭该节点
从开启列表中删除(T); //从开启列表中删除
end;
L完成寻路:
end;
|
|