このブログ内を検索可能

2024年6月26日水曜日

マジカルマインシミュレーション(2) HIT処理と落下処理

 先ほどグループ化の処理を行ったが、HIT処理と落下処理もマジカルマインを構成する重要な処理である。HIT処理についてはHITした番号と同じグループのブロックを消すだけなので実は非常に簡単。

これをグループ化して行列形式にしたものが以下。
1 2 2 2 3 3
1 2 2 2 3 3
1 4 4 5 3 6
1 7 4 5 3 6
1 7 4 5 6 6
1 7 4 6 6 8
7 7 9 10 8 8
7 9 9 10 8 8
9 9 10 10 10 10
確かにグループ分けができており、ここで例えば{13,14,1}にHITしたとするとどうなるか。
グループ7とグループ10のブロックが消えるのでプログラムを構築すると以下になる。
3 1 1 1 2 2
3 1 1 1 2 2
3 2 2 4 2 3
3 0 2 4 2 3
3 0 2 4 3 3
3 0 2 3 3 2
0 0 3 0 2 2
0 3 3 0 2 2
3 3 0 0 0 0
たしかにグループ7とグループ10が消えているのが分かる。

続いて落下処理であるが、これもチェーンボンバーと似たような方式。ただし各ブロックの下にマスがあるかの判定ではなく、各グループのすべてのマスの下にマスがないことが条件となる。
具体的な例を挙げるとすると
〇〇  △△〇
〇××    〇
〇〇×  〇〇
  ××   〇
      〇
ーーーーーーーー
このような状態のとき、一番右の〇グループは動かない。△は1マスだけ落ちる。×は1マス落ち、一番左の〇は1マス落ちる。これをどう処理するか。

まず、グループのいずれかのマスの下に地面があればそのグループは確実に動かない。
それ以外のものは動く「可能性のある」ものとする。
その後、各グループに関してそれらのマスの中に一つでも下に「絶対に動かない」マスがあれば当たり前だがそのグループに属するマスは動かない。
それ以外のマスは1マス分落ちることとなるので
      〇
〇〇  △△〇
〇××   〇〇
〇〇×   〇
  ××   〇
ーーーーーーーー
のようになる。そして再度同じ処理を行うと、今度は×が絶対に動かないマスになり、左の〇と△はともに絶対に動かないマスの上に位置するマスがあるため、動かないこととなる。これで処理は終了する。
以上の考え方をプログラムに適用する。
すると、
1 2 2 2 3 3
1 2 2 2 3 3
1 4 4 5 3 6
1 0 4 5 3 6
1 0 4 5 6 6
1 0 4 6 6 8
0 0 9 0 8 8
0 9 9 0 8 8
9 9 0 0 0 0
のグループに対して(7と10グループは13,14,1番HITにより消えている)
0 1 1 1 0 0
0 1 1 1 0 0
0 1 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 1 1 0 0 0
1 1 0 0 0 0
となり(1=停止、0=落ちる)、確かに落ちるor落ちない判定ができている。
そして落ちるブロックをすべて1段ずらしてまた同じ処理を繰り返し、状態が変わらなくなるまで繰り返せば落下処理は確定する。これをプログラムで構築すると
0 1 1 1 0 0
0 1 1 1 0 0
0 1 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 1 1 0 0 0
1 1 0 0 0 0
上:1回目落ちるものと落ちないものの区別
下:1マス分落ちた後の状態
0 2 2 2 0 0
1 2 2 2 3 3
1 4 4 0 3 3
1 0 4 5 3 6
1 0 4 5 3 6
1 0 4 5 6 6
1 0 9 6 6 8
0 9 9 0 8 8
9 9 0 0 8 8
そしてその次の操作で
0 1 1 1 0 0
0 1 1 1 1 1
0 1 1 0 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 0 1 1 1 1
0 1 1 0 1 1
1 1 0 0 1 1
上:2回目落ちるものと落ちないものの区別
下:1マス分落ちた後の状態
0 2 2 2 0 0
0 2 2 2 3 3
1 4 4 0 3 3
1 0 4 5 3 6
1 0 4 5 3 6
1 0 4 5 6 6
1 0 9 6 6 8
1 9 9 0 8 8
9 9 0 0 8 8
確かに右ブロック群は1マス落ち、左ブロック群は2マス落ちていることが分かる。
これにより落下処理は完了したので、いよいよ入賞番号が与えられれば最終的なブロックの配置が確定することになるので、実際に確かめてみる。
ちなみに入賞した番号の順によって結果は変わることに注意する。
具体例として
2 2 1
1 1 2
1 1 2
2 2 3
のカラーであった場合、12マス目→4マス目が消えた場合
2 2 0
1 1 1
1 1 2
2 2 2
からの
0 0 0
0 0 0
2 2 2
2 2 2
になるのに対して、
4マス目→12マス目が消えた場合
0 0 1
0 0 2
2 2 2
2 2 3
からの
0 0 0
0 0 1
2 2 2
2 2 2
になるので違う。

なので最初3球同時消え+2球同時消え+順に1球ずつ3回、に分けなければならない点に注意する。実際の消滅例をいくつか動画のもので試せばプログラムの正確性は保証されてくるのでさっそくやりたい。
すると以下の結果になった。

残っているブロックの位置およびグループ分け、そして番号配置も完全に一致。これを持って我のマジカルマインのブロック関係のプログラムは正しいことがおそらく証明された。

となれば次は宝箱GET判定とオッズアップ判定、そしてオッズ処理を行って期待値計算や全消し確率の計算にもっていく。ここまで来ればほぼ完成に近い状態で、まもなくマジカルマインのペイアウト率が計算できるであろう。