こんな方法もある(扱う個数が少ないと利点を生かせないけど・・・)
#const SPMIN 1 ;スピードの範囲(SPMIN〜SPMAX)
#const SPMAX 3
randomize
max=10 ;キャラの数
dim sortcnt,SPMAX+1 ;同じ速度に何キャラあるかの保存用
sortcntsiz=length(sortcnt)
dim sort,max,sortcntsiz ;ソート結果が入るバッファ(左側の要素にキャラIDが入るので全て同じ速度だった時の為にmax分確保)
dim char,max ;キャラのスピード設定用
button gosub "初期化",*sub_reset
button gosub "ソート",*sub_sort
gosub *sub_reset
stop
*sub_reset
color 255,255,255:boxf:color:pos 100,50:mes "ソート前"
repeat max:char(cnt)=rnd(SPMAX)+SPMIN:mes "キャラID["+cnt+"] スピード["+char(cnt)+"]":loop ;適当にスピード割り当て
return
*sub_sort
memset sortcnt,0,sortcntsiz*4 ;前回のキャラ数データを初期化
repeat max
speed=char(cnt) ;スピードを取り出す
sort(sortcnt(speed),speed)=cnt ;sort(同じスピードのキャラ数,スピード)=キャラID
sortcnt(speed)++ ;同じスピードのキャラ数を+1
loop
pos 320,50:mes "ソート後"
//ソート後の取り出し方
speed=SPMAX ;今回は大きい方が優先度高いので配列sortcntの終わりから逆方向に取り出してる
repeat SPMAX
repeat sortcnt(speed) ;同じスピードのキャラ数をループ回数に使用
mes "キャラID["+sort(cnt,speed)+"] スピード["+speed+"]"
loop
speed--
loop
return
>この3,2,1を変数名に直して、b,a,cとするにはどのようにすればよいのでしょうか。
このサンプルで言うと キャラID[0] が a で キャラID[1] が b を指してる感じになります。
同じ速度を扱わないならもっと簡単になります
n="a","b","c"
a=2
b=3
c=1
sort(a)=0
sort(b)=1
sort(c)=2
speed=3 ;最高速度
repeat speed
mes n(sort(speed))
speed-- ;0でループが終わるので速度0のキャラが居ても無視される
loop