铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3181|回复: 15

[通用] 对原复刻移动功能的修正~~

[复制链接]
发表于 2009-7-20 17:00 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本来我是想改AI的,但当我真正意义上看完相关代码之后,我第一次有了骂人的冲动~~

我总算知道为什么AI难改了,因为在复刻版中,人物是不会走路的,无论是AI人物,还是玩家角色,都不会~~~~~~~~~~~~~~

举个例子吧

口口口口口
口我障目口
障障障障障

以上,口是空地,我是角色所在障是障碍物,目是目的地

我们知道,移动范围是用递推算法算出来的,也就是说,角色达到目的地需要4步,显示出来的移动范围也是如此

然而!在实际的执行中,角色会直接穿过面前的障碍,走到目的地,而消耗的步数,也是两步

那刚才递推一大轮为的是什么????????????????????

看出问题所在了吗?

还不止这样,除了这些看得到的效果,内部算法还很“聪明”地把刚才递推的痕迹给抹去了,找不回来了

话说我被这样的严重误导,改正这移动的功能足足花了3倍的时间啊~~~~~

好了,废话不多说,我改动的功能有3个
procedure CalCanSelect(bnum, mode: integer);
procedure MoveAmination(bnum:integer);
procedure SeekPath(x, y, step: integer);
新增一个功能
function SeekPath2(x, y, step: integer): integer;

也就是说,所有关于移动的功能都改了

源码在2楼,应该适用于所有复刻版游戏,不过要编译就对了

PS:这种严重的错误,一直以来都没有人发现的吗???

PPS:lua版的AI确实好很多~

[发帖际遇]: winson7891扮成吴天德,骗得银两4。


[ 本帖最后由 winson7891 于 2009-7-20 17:08 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-20 17:03 | 显示全部楼层

源码在此

procedure CalCanSelect(bnum, mode: integer);
var
  i1, i2 : integer;
begin
  for i1 := 0 to 63 do
  begin
    for i2 := 0 to 63 do
    begin
      Bfield[3, i1, i2] := 0;
      //mode为0表示移动, 这时建筑和有人物(不包括自己)的位置不可选
      if mode = 0 then
      begin
        Bfield[5, i1, i2] := -1;                      //对范围内移动标记设置为-1
        if Bfield[1, i1, i2] > 0 then Bfield[3, i1, i2] := -1;
        if Bfield[2, i1, i2] >= 0 then Bfield[3, i1, i2] := -1;
        if Bfield[2, i1, i2] = bnum then Bfield[3, i1, i2] := 0;
      end;
    end;
  end;
  if mode = 0 then
  begin
    //递归算法的问题, 步数+1参与计算
    //移动标记的处理
    SeekPath(Brole[bnum].X, Brole[bnum].Y, Brole[bnum].Step+1);
    for i1 := 0 to 63 do
    begin
      for i2 := 0 to 63 do
      begin
        if Bfield[5, i1, i2] = -1 then
          Bfield[3, i1, i2] := 1;
      end;
    end;
  end;

end;



//对原复刻移动弱智判断的修正,反向智能寻路,绕路,最短距离
procedure MoveAmination(bnum:integer);
var
        s, i, tempx, tempy, index, totalstep: integer;
begin
        tempx := Ax;
        tempy := Ay;
  totalstep := brole[bnum].Step;
  index := Bfield[5, tempx, tempy];
  Setlength(movetable, totalstep-index+1);
  SeekPath2(tempx, tempy, totalstep-index+1);

        for i:=0 to totalstep-index-1 do
        begin
    if (movetable[i].x>Bx) and (movetable[i].y=By) then
      Brole[bnum].Face := 3
    else if (movetable[i].x<Bx) and (movetable[i].y=By) then
      Brole[bnum].Face := 0
    else if (movetable[i].x=Bx) and (movetable[i].y>By) then
      Brole[bnum].Face := 1
    else if (movetable[i].x=Bx) and (movetable[i].y<By) then
      Brole[bnum].Face := 2;

                if Bfield[2, Bx, By] = bnum then Bfield[2, Bx, By] := -1;
                Bx := movetable[i].x;
                By := movetable[i].y;
                if Bfield[2, Bx, By] = -1 then Bfield[2, Bx, By] := bnum;
    Redraw;
    SDL_updaterect(screen, 0, 0, screen.w, screen.h);
                SDL_delay(100);
        end;
  Brole[bnum].X := Bx;
  Brole[bnum].Y := By;
  Bfield[2, Bx, By] := bnum;
  brole[bnum].Step := index;
end;


procedure SeekPath(x, y, step: integer);
begin
  if step > 0 then
  begin
    step := step - 1;
    if Bfield[3, x, y] = 0 then
    begin
      if Bfield[5, x, y] < step then
        Bfield[5, x, y] := step;
      if Bfield[3, x + 1, y] = 0 then
      begin
        SeekPath(x + 1, y, step);
      end;
      if Bfield[3, x, y + 1] = 0 then
      begin
        SeekPath(x, y + 1, step);
      end;
      if Bfield[3, x - 1, y] = 0 then
      begin
        SeekPath(x - 1, y, step);
      end;
      if Bfield[3, x, y - 1] = 0 then
      begin
        SeekPath(x, y - 1, step);
      end;
    end;
  end;

end;


/寻找某一地点坐标是否在移动范围之内,递归算法
function SeekPath2(x, y, step: integer): integer;
var
  i: integer;
begin
  i := 0;
  if step > 0 then
  begin
    step := step - 1;
    if Bfield[5, x, y] >= 0 then
    begin
      if (x = Bx) and (y = By) then
      begin
              i:=1;
      end
      else
      begin
        if (Bfield[5, x + 1, y] = Bfield[5, x , y ]+1) and (i = 0) then
        begin
          i := SeekPath2(x + 1, y, step);
          if i = 1 then
          begin
             movetable[step-1].x := x;
             movetable[step-1].y := y;
          end;
              end;
        if (Bfield[5, x , y + 1] = Bfield[5, x , y ]+1) and (i = 0) then
        begin
          i := SeekPath2(x, y + 1, step);
          if i = 1 then
          begin
             movetable[step-1].x := x;
             movetable[step-1].y := y;
          end;
        end;
        if (Bfield[5, x - 1, y] = Bfield[5, x , y ]+1) and (i = 0) then
        begin
          i := SeekPath2(x - 1, y, step);
          if i = 1 then
          begin
             movetable[step-1].x := x;
             movetable[step-1].y := y;
          end;
        end;
        if (Bfield[5, x, y - 1] = Bfield[5, x , y ]+1) and (i = 0) then
        begin
          i := SeekPath2(x, y - 1, step);
          if i = 1 then
          begin
             movetable[step-1].x := x;
             movetable[step-1].y := y;
          end;
        end;
      end;
    end;
  end;
  if i = 1 then
    result := 1
  else
    result := 0;
end;

[table=100%,#cbb48a][tr][td][size=9pt][发帖际遇]: [url=http://www.txdx.net/event.php]winson7891跑去泰国取经,回来后出版《葵花宝典--2008奥运免自宫限量特别珍藏版》,获利银两12.
[/url][/font][/td][/tr][/table]

[[i] 本帖最后由 winson7891 于 2009-7-20 17:06 编辑 [/i]]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-20 17:58 | 显示全部楼层
楼主这个问题我也发现了,但是我不会改。楼主果然强大。谢谢楼主!

[发帖际遇]: 枕头好痕拜岳老三为师,得到见面礼银两10.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-20 20:28 | 显示全部楼层
其實我一直想改,但是因為種種原因,都沒有動,樓主不愧是“玉”啊。。hoho

[发帖际遇]: waxyzwa去长白山捉火蟾,送给韦一笑,得感谢费银两24.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 12:59 | 显示全部楼层
今天試了一下哈,有兩個小問題問下
一個movetable是不是TBattleRole型的數據?我有無弄錯。。。
然后我的電腦移動有時候會跳幀,甚至會移動到版邊,是不是我的ai的原因,我還沒在原版試一下,馬上又要出去,哎。
還有一個,會不會覺得移動比較卡,要不要把速度稍微提一下。。。

[发帖际遇]: waxyzwa去客栈吃饭,碰到郭靖,郭靖请你吃饭,并赠送银两27.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 13:49 | 显示全部楼层
递归算法是后面才使用的,为了兼容以前的才把递归痕迹抹去。
当然我并没想到这个可以用来描绘路径
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 14:54 | 显示全部楼层
要不重写吧,不用递归了。用递归好像有很多的点都会计算多次吧,不过似乎因为步数少也没太大影响……

to五楼
好像是这样:
type
   Tmovetable = record
   x, y: integer;
var
  movetable : array of Tmovetable;

[发帖际遇]: 真正的强强参与红花会陈家洛的计划:成功绑架乾隆,得到奖励银两11.


[ 本帖最后由 真正的强强 于 2009-7-21 14:56 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 15:24 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-21 16:36 | 显示全部楼层
to 五,七楼
不小心漏了,movetable应该是TPosition,也就是含有x,y两个子项

to 六楼
现在已经把递推的轨迹给运用上了,有了轨迹的记录,也就避免了以后再次调用时的重复运算,我以为已经是比较高效的了,当然,如果有更好的改进方法,那是多多益善的~呵呵

PS:看来当时复刻制作的时候条件真的很局限啊~~开荒的难度果然不是我可以想象的~不过不要紧,以后Mod会越来越完美的~呵呵
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-23 21:06 | 显示全部楼层
哎。兩天沒網。老黃沒替我說,有一個bug,不知道是不是你這個算法引起的
-1,-1的坐標。人物不是-1的話,會算一遍人物,但是無法移動,應該是你的算法里沒有排除0到63之外的數字的緣故吧

[发帖际遇]: waxyzwa买通太监进宫偷葵花,转手挣到银两16.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-24 01:54 | 显示全部楼层
哪里来的-1,-1坐标?
有人能站到那格子吗?

或者你在说群芳的bug?

[发帖际遇]: winson7891带小龙女去蒙地卡罗吃西餐喝红酒,被赵志敬撞见,破财消灾,花费银两10.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-24 16:39 | 显示全部楼层
原帖由 waxyzwa 于 2009-7-23 21:06 发表
哎。兩天沒網。老黃沒替我說,有一個bug,不知道是不是你這個算法引起的
-1,-1的坐標。人物不是-1的話,會算一遍人物,但是無法移動,應該是你的算法里沒有排除0到63之外的數字的緣故吧

[发帖际遇]: waxyzwa买通太 ...

囧+。。说我吗?我记性很差0 0.。。

[发帖际遇]: 黄顺坤冒充青木堂主向反清份子征收活动经费,结果:被陈近南发现,赔偿名誉损失费银两50.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-24 20:33 | 显示全部楼层
不小心寫了人,沒寫坐標就會有-1,-1啊。。。我在測的那一戰就不小心成為了這個樣子
哈哈
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-7-24 21:08 | 显示全部楼层
...............

正常游戏中不会出现的错误不叫bug吧?

战斗前所有人物都会有相应坐标,没坐标的根本不会出现在游戏中啊~

如果说战斗中人物走到0到63之外,这更不需要担心:

1,选不到那个格子,就如人物在大地图上走不到地图外一般

2,战场的障碍物会把战场围起来,不可能有0到63外的格子~~


PS:黄大放心,不是你

[发帖际遇]: winson7891在福州找到唐诗三百首一本,当成辟邪剑谱送给左冷蝉,得到打赏银两26
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-24 21:41 | 显示全部楼层
我說的便是他,哈哈
只是隨口那么一說
最近在研究路由,話說dv算法已經看不太見了啊,哎。。。
看看有沒有什么可以拿來用的
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-2-28 00:14 | 显示全部楼层
MARK,,,,,,,,,,,,,
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-6 04:02

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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