こんにちは、きうちです。
今回は前回の一筆書きのパズル(前編)の続きをお届けします。
前回までで、自機を動かすとその足跡が残り、何もないところを足跡で埋め尽くすとクリア、というところまでできました。
しかし前回はステージが1つだけでしたので、今回はステージを増やしてみたいと思います!
あとすいません、前編、ちょっと抜けがありました。
フォームの背景色を黒にするのと、再描画のちらつきを抑えるためにフォームの DoubleBuffered を true にします、というのが抜けていました。
ここで補足させていただきます。
★ ★ ★
ステージを増やすために、ステージ定義用のクラスを用意します。
名前はMapとします。
その中にstaticなフィールドを用意して、そこに定義します。
こんな感じです。
internal class Map
{
internal static string[][] Stages =
{
new string[]
{
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22222000000000022222",
"22222000000000022222",
"22222000000000022222",
"22222000000000022222",
"222220000M0000022222",
"22222000000000022222",
"22222000000000022222",
"22222000000000022222",
"22222000000000022222",
"22222000000000022222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
},
new string[]
{
"22222222222222222222",
"22222222222222222222",
"22M00222222222222222",
"22220002222222222222",
"22222200022222222222",
"22222222000222222222",
"22222222220002222222",
"22222222222200022222",
"22222222222222000222",
"22222222222222220002",
"22222222222222220002",
"22222222222222000222",
"22222222222200022222",
"22222222220002222222",
"22222222000222222222",
"22222200022222222222",
"22220002222222222222",
"22000222222222222222",
"22222222222222222222",
"22222222222222222222",
},
new string[]
{
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
"22200000000000000222",
"22200000000000000222",
"22200000000000000222",
"22200000000000000222",
"222000000000M0000222",
"22200022222222000222",
"22200022222222000222",
"22200022222222000222",
"22200022222222000222",
"22200022222222000222",
"22200022222222000222",
"22200000000000000222",
"22200000000000000222",
"22200000000000000222",
"22222222222222222222",
"22222222222222222222",
"22222222222222222222",
},
};
}
全3ステージ用意してみました。
本当はもっと用意できたら…と思うんですけど、意外と大変なんですよねこれ。
つくるの。
あと、この記事が縦に長くなってしまってダレそうなので3ステージでご勘弁を^^;
なお、この定義の中で0が何もない場所、2が壁、Mが自機の最初の位置です。
そしたら、今度は ステージ番号を示すフィールドを追加するのと、Init メソッドをこんな風に変えます。
前に書いていたInitメソッドはコメントアウトするか、別な名前に変えてしまいましょう。
private int stage = 0; // ステージ番号
private void Init() // セル初期化
{
// マップデータ
for (int y = 0; y < Map.Stages[stage].Length; y++)
{
for (int x = 0; x < Map.Stages[stage][y].Length; x++)
{
var s = Map.Stages[stage][y].Substring(x, 1);
if (s == "M")
{
mx = x;
my = y;
}
else
{
cells[x, y] = int.Parse(s);
}
}
}
// 最初に自機がいる箇所に軌跡を置く
cells[mx, my] = 1;
}
「判定とおめでとうメッセージ」のところをこんな風に変えます。
if (IsOver()) // 判定とおめでとうメッセージの追加
{
MessageBox.Show("おめでとう!");
stage++;
if (stage >= Map.Stages.Length)
{
stage = 0;
}
Init();
Refresh();
}
private bool IsOver() // クリアしたか判定する
{
bool result = true;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
if (cells[x, y] == 0) // 何もないセルが存在したら
{
result = false; // まだ終わっていないものとする
break;
}
}
}
return result;
}
これで実行してみると…

前回と同じステージが表示されます。
クリアすると…

別なステージが表示されます。

3面をクリアすると…

1面に戻ります。

もし、2面からやってみたい、という場合は
private int stage = 0; // ステージ番号
となっているところを1にすればいいです。
ステージを追加したい場合はMapクラスのStagesに追加してあげてください。
★ ★ ★
…しかしまあ、ステージを作り足すのめんどくさいですね!
自動化できないかな!?
…この「面倒くさいから自動化したい」っての、ITエンジニアリングのコアですよね(笑)
次回は自動的にステージを作る方法を考えてみたいと思います。
ではまた!