Dripです。
とおりすがりさん、こんにちは。
コマンド入力は感覚的に少しややこしい感じがするので初心者のうちは戸惑うことも
あると思います。cbirdさんのやりかたは配列変数を使用した、履歴を取るための
最も典型的なアルゴリズムだと思います。
リアルタイムコンバット等のコマンド入力処理は、メモリ操作命令を使用すると、
とても簡単に作ることができ、動作も軽快です。
配列変数やループ等の使用頻度が極めて少ないので理解に苦しむこともないと思います。
コマンド入力による必殺技の発動サンプルを以下に示します。
#define maxcmd 8 //キーの最大組み合わせ数
#define keydst 20 //入力履歴が破棄される時間
//必殺技一覧と対応するコマンド
cmdName(0)="新感覚癒し系": cmdCmd(0)="ASD"
cmdName(1)="ベホイミ": cmdCmd(1)="ZXC"
cmdName(2)="マホー": cmdCmd(2)="AZSXDC"
cmdName(3)="スティンガーミサイル": cmdCmd(3)="ZAXSCDAA"
cmdName(4)="ベルカ飛行隊": cmdCmd(4)="ZZSX"
cmdName(5)="機体は消耗品": cmdCmd(5)="SSSSSSSS"
cmdName(6)="巨像でかすぎ": cmdCmd(6)="DDDDAAAA"
cmdName(7)="MGOやりませんか。": cmdCmd(7)="ASASAS"
keys='Z','X','C','A','S','D' //使用するキー一覧
sdim log,maxcmd:memset log,1,maxcmd //履歴初期化
font "MS ゴシック",24,2
repeat //メインループ
redraw 0
//■キーの入力関係
repeat length(keys) //キーの入力を確認
getkey tmp,keys(cnt):if tmp=1:ky(cnt)++:else:ky(cnt)=0 //キーが入力されているか?
if ky(cnt)=1:{ //もしもキーが入力されていたら、履歴をとる
inTime=0 //履歴を破棄する時間リセット
tmp=cnt //押されたキーのIDを確保
repeat maxcmd-1 //履歴をシフトする
poke log,cnt,peek(log,cnt+1)
loop
poke log,maxcmd-1,keys(cnt) //ログに今入力したキーを記録する
}
loop
//■コマンドの判定関係
repeat length(cmdName) //コマンドの成立判定
if instr(log,0,cmdCmd(cnt))>-1:{ //もしも入力履歴にコマンドが発見されたら
skilID=cnt //コマンドID確保
skilTime=50 //技発動時間
memset log,1,maxcmd //キー履歴クリア
}
loop
inTime++ //履歴を破棄する時間が徐々に上昇
if inTime>keydst:memset log,1,maxcmd //履歴を破棄する時間までキーが入力されていなければ履歴破棄
//■描画関係
color 255,255,255:boxf:color:pos 0,0:mes log //背景をクリアしてキー履歴状態を表示してみる
if skilTime>0 & (cnt\2=0 | skilTime<40):{ //技が発動していた場合技名描画
color
pos 100,100:mes "必殺・"+cmdName(skilID)+" !!"
skilTime--
}
redraw 1
await 30
loop
格闘ゲームを作っていらっしゃるのでしょうか。敵のAIやエフェクトなど、
苦労する場面も多いと思いますが、がんばってください。
こうしたアルゴリズムのノウハウはプログラムの経験によって養われるものなので、
質問の回答だけを注視せず、非効率的でも自分なりのプログラムを書けるようにしていくと
技術は確実に磨かれていきますよ。