“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

117.HSPでゲーム&ウォッチのマンホールを作り直そう その6

前回の続き。
通行人のパターンは、前回作ったパターンシートを参考にした。
これを10か所分ごとに区切って、バッファに足す数をパターンを考えた。
通行人の人数ごとにパターンをいくつか出して、その内の1つを選んで、バッファに足すようにしてみた。

パターンは上下段ワンセットにして、カンマで区切った文字列にした。
例えば、上下段ともに1人を追加するなら、"512,512"。これが2人の時のパターン。

上下段で似たような出現パターンになるので、追加するたびに、反転するようにした。
両方とも同じ数字の時は意味がないが、上に1人、下に2人の追加パターンの場合、同じパターンでも上に2人、下に1人の時と1つのデータで済む。

こうして、1人~9人までの上下に出現するパターンを考えて、テストプレイしたが、すぐに具合が悪いことに気づいた…

このゲーム、上下段ともに、進行方向に向かって、4か所目と7か所目で通行人が穴の上に来るのだが、同時に落ちるようになってしまうと、どちらか一方が必ずミスになるので、まずい。
また、連続して通行人を出すときは、1コマ以上空ける。ただし、2コマ空けるのはNG。
この条件に従って、問題が無いように各パターンを考えてデータにしてみたが、連続するパターンによっては、同時に落ちるような問題パターンが発生してしまうのだった。

f:id:CORO3:20220129002409p:plain

問題パターンの組み合わせを人力で見つけていくのは時間がかかりすぎるので、今回考えた通行人追加ロジック部分のプログラムを抜き出して、パターン検証プログラムを作った。
問題のパターンを見つけるために、instr命令を使った。
instr命令は、文字列の中に、指定した文字列があったら、その位置を数字で返す。
無ければ、-1が返ってくる。これを利用した。
問題パターンを検出したら、logmes命令でログにNGの文字を出力するようにした。

buf=str(addpasser)+","+str(addpasser2)+": "
han=""
repeat 2
 j=cnt
 buf=buf+str(j)+": "
 han=""
 repeat 20
  if passline(j)&((512<<10)>>cnt) {
   buf=buf+"1"
   han=han+"1"
  } else : buf=buf+"0" : han=han+"0"
  if cnt=9 : buf=buf+"|"
 loop
 if instr(han,0,"1001")>0 or instr(han,0,"11")>0 {
  buf=buf+" NG!/ "
 } else : buf=buf+"    / "
loop
logmes buf

ログ出力したところ
f:id:CORO3:20220127010452p:plain

こうしてパターンを修正して、ランダムにパターンを繋げても、ゲームとして成り立つようにした。

あとは、スコアに応じて通行人の上限を上げていき、難易度が上がるようにした。
GAME Bでは、これに加えてスコアが増えると、ゲームスピードが速くなる調整も行った。

;スコアアップによる調整
;最大通行人数
maxpasser = 1+(score>10)+(score>45)+(score>150)+(score>230)+(score>350)+(score>450)+(score>600)+((gamemode=1)*(score>750))

;ゲームスピード(GAME Bだけスピードアップ)
if gamemode=1 {
  g_speed = g_speed_def-(score\100>10)*2-(score\100>30)*2-(score\100>50)*2-(score\100>80)*2
}