はじめに
今回が初投稿になります!
これはプログラム初心者の自分が分からないなりに作ったプログラムであることを
ご了承ください!
らせん状に消すって?
自分が作っているゲームで9x9のタイルの上で戦う多人数対戦ゲームを作っていたんですが、一定時間たったら徐々に周りのタイルがらせん状に消えていって、足場が狭くなっちゃった…!?
みたいな処理をさせたいと思い、作ってみることにしました。
雰囲気的には
これを、
こうして
こういう感じに動かしたい!!
プログラムとして起こすには?
まず消えているかの判定を格納しておく9x9の二次元配列を持って置く
bool型で true,false で判断できるようにしておく
今回は視覚的にわかりやすい 0,1 で記させていただきます
※1がtrue, 0がfalse
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
これを
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
こう動かしたい。
そのために必要なものは、
①タイルを消していく方向
②現在何個目のタイルを消すかを計測するカウンタ
③次のタイルがもう消えてしまっている又はそもそも配列外かどうかの判定
④何週で消すのを止めるかの範囲
①タイルを消していく方向
らせん状に操作するにあたって方向がわかっていないとそもそも消していけない!!
消していく方向用に列挙型を作ってもいいと思います。自分はそう作りました。
もっと良い作り方が絶対あると思います…
enum class DIR
{
UP,
RIGHT,
LEFT,
DOWN
};
②現在何個目のタイルを消すかを計測するカウンタ
だんだん消すということでカウンタを上昇下降させて対応した配列番号に処理をさせる必要があります。
二次元配列なのでx,yそれぞれのカウンタを持って置きましょう。
③次のタイルがもう消えてしまっている又はそもそも配列外かどうかの判定
最初の一周で、カウンタを上昇下降させるのはいいのですが次に入る番号が配列外の値だった場合、致命的なエラーを引き起こしてしまいます…
そのため配列の上限下限を超えたら、その時点で方向を変えるようにします。
次に、次の配列番号がすでにfalse,又は0になっているならその時点で方向を変えましょう。
これでらせん状に消していく処理は完了です。
④何週で消すのを止めるかの範囲
このまま処理させては最終的にすべての足場が消えてしまい狭くなったどころではありません。
そのため何週で消すのをやめるかの範囲を決めておきます。
一周したらカウンタを増やす用の変数と何週消すのかの定数を持っておきます。
その定数以上になったら処理をこれ以上しないようにします。
これで消えるのが止まるはず。
最後に
ここまで見ていただき本当にありがとうございます。
この処理は決して最善の処理ではありません。
むしろ、改良の余地がいくつも残されていると思います。
そして、初投稿なのもあり、読みにくかった点や説明不足も多くあると思います。
これからも初心者なりにもっと処理を考えて組んでいきたいと思いますので、
よろしくお願いします。