Dripです。
猫素敵さん、こんにちは。
「目的地点まで上下左右のみの移動で、もっとも合理的に移動しているように見える」移動は、
目的地までのX,Y位置が半端だったりすると、フレーム毎の移動量が変化してしまい、計算式が複雑そうに思えますね。
しかし難しく考えることはありません。
三角関数を応用し、スタート地点から目的地まで“直線移動”するまでに行われた移動を
整数で取得し、その結果から1フレーム毎の移動方向のログを収集することで実現可能です。
このプログラムを理解するためには三角関数とpeek,pokeによるメモリ操作の知識が必要になります。
以下に目的地点まで上下左右のみの移動で、もっとも合理的に移動しているように見えるサンプルを示します。
#define size 16
px=30 //プレイヤーの位置
py=18
ex=3 //移動先の座標
ey=8
sdim log,6400 //この変数に移動方向のログを1byte単位で取る。
mtan=atan(ex-px,ey-py) //向かうべき直線角度を求める
ax=double(px) //ロボットの位置X
ay=double(py) //ロボットの位置Y
repeat 3200 //ロボットを一直線に目的地へ向かわせ、その移動履歴を収集する。
tmpx=int(ax+0.5)
tmpy=int(ay+0.5)
if tmpx=ex & tmpy=ey:break //目的地に到着したのでログ収集を終了する。
ax+=sin(mtan)
ay+=cos(mtan)
if tmpx-(ax+0.5)=-1:poke log,strlen(log),3 //履歴を書き込む
if tmpx-(ax+0.5)=1:poke log,strlen(log),1
if tmpy-(ay+0.5)=-1:poke log,strlen(log),4
if tmpy-(ay+0.5)=1:poke log,strlen(log),2
loop
repeat //移動履歴を参考にプレイヤーを目的地まで移動させる。
redraw 0
color 255,255,255:boxf
color 200,200,200
repeat ginfo_winx/size:tmpx=cnt
line cnt*size,0,cnt*size,ginfo_winy
loop
repeat ginfo_winy/size:tmpy=cnt
line 0,cnt*size,ginfo_winx,cnt*size
loop
pos px*size,py*size:color 255:mes "●"
pos ex*size,ey*size:color ,255:mes "●"
if cnt<strlen(log):{
switch peek(log,cnt) //ここで履歴情報を参考に移動させている。
case 1:px--:swbreak
case 2:py--:swbreak
case 3:px++:swbreak
case 4:py++:swbreak
swend
}
redraw 1
await 100
loop
多少複雑ですが、わからない部分も焦らずじっくり考えて理解していってください。
googleやHSP掲示板過去ログもかなり役に立つと思います。