ゲームを作りたい人のための ソースコード集

私がその日作った短めのソースを簡単な解説とともに載せていきます
ゲーム制作初心者にとって参考になるかもしれないソースが多いです


<< ヘックスマップ | main |



ダイクストラ法

ダイクストラアルゴリズムのソースコードです

任意の地点と始点の最短経路を求めます

 


#module
#deffunc dijkstra array rootflg,array invcost,int sourid
    sum=length(invcost)
    ddim rootcost,sum
    sid=0:eid=0
    dim confflg,sum
    dim stack,sum*sum
    repeat sum*sum
        stack(cnt)=-1
    loop
    stack(sid)=sourid
    repeat
        num=sid
        cost=990999.0
        repeat eid-sid,sid
            if cost>rootcost(stack(cnt)){
                cost=rootcost(stack(cnt))
                num=cnt
            }
        loop
        if num!=sid{
            tmp=stack(num)
            stack(num)=stack(sid)
            stack(sid)=tmp
        }
        chkid=stack(sid)
        confflg(chkid)=1
        dis=rootcost(chkid)
        repeat sum
            icost=invcost(cnt,chkid)
            if confflg(cnt)=0&icost>0{
                if (rootcost(cnt)<=0|rootcost(cnt)>dis+icost){
                    rootcost(cnt)=dis+icost
                    rootflg(cnt)=chkid
                    eid++
                    stack(eid)=cnt
                }
            }
        loop
        sid++
        if sid>eid{break}
    loop
    return
#global
;画像作成
csz=32
buffer 2,csz*2,csz:celdiv 2,csz,csz,csz/2,csz/2:x=0
color:boxf
color 255:circle x,0,x+csz-1,csz-1:x+csz
color 255,255:circle x,0,x+csz-1,csz-1:x+csz
;処理開始
randomize
gsel 0:gmode 2
sum=10
ddim unitinvcost,sum,sum    ;オブジェクト間の距離(最大:200)
dim unitrootflg,sum            ;接続情報
;オブジェクト配置
repeat sum:i=cnt
    unitrootflg(i)=-1
loop
dim unitdt,4,sum
repeat sum
    if cnt=0{
        unitdt(0,cnt)=1,ginfo_winx/2,ginfo_winy/2,0
    }else{
        unitdt(0,cnt)=1,rnd(ginfo_winx),rnd(ginfo_winy),1
    }
loop
;経路情報
repeat sum:ct0=cnt
    repeat sum:ct1=cnt
        if unitdt(0,ct1)&ct0!=ct1{
            cost=sqrt(powf(unitdt(1,ct0)-unitdt(1,ct1),2)+powf(unitdt(2,ct0)-unitdt(2,ct1),2))
            if cost<200{
                unitinvcost(ct0,ct1)=cost
                unitinvcost(ct1,ct0)=cost
            }
        }
    loop
loop
;ダイクストラ経路探索
dijkstra unitrootflg,unitinvcost,0
;表示
buf=""
repeat sum:i=cnt
    buf+", ["+cnt+"]="+unitrootflg(i)
loop
title""+buf
color:boxf
gosub *drawunitline
gosub *drawunitobj
redraw
stop
*drawunitobj
    color
    repeat sum
        if unitdt(0,cnt){
            pos unitdt(1,cnt),unitdt(2,cnt):celput 2,unitdt(3,cnt)
            pos unitdt(1,cnt)-5,unitdt(2,cnt)-10:mes""+cnt
        }
    loop
    return
*drawunitline
    color 255,255,255
    repeat sum:ct0=cnt
        repeat sum:ct1=cnt
            if unitinvcost(ct0,ct1)>0{
                line unitdt(1,ct0),unitdt(2,ct0),unitdt(1,ct1),unitdt(2,ct1)
            }
        loop
    loop
    return

 

0
    posted by higashijugem 08:44comments(0)|-|


    この記事に対するコメント