ここまで来たら後は、今まで作った関数を駆使して問題を作ってゆく。
ランダムでごちゃ混ぜにすればいいじゃん、って思う人もいるかもですが、実は解けない問題ってのがある。
なので、どうするかというと、話は簡単で。。。
移動できそうな数字をランダムで出して、一定回数空白タイルと入れ替えを行う。
(基本的に、そろった状態から入れ替えを行うと、その逆順の手順で操作すると元に戻せるよ)
したがって、手数がかかればかかるほど難しくなるはずなので、何回入れ替え操作をした問題化で何となくの難易度が設定できる。
(今回はその機能は搭載しない)
後は今までの例に従って、C言語の人は自分で関数作ってみよう!
//Cの人は void MakeProblem(Board* _board) void MakeProblem(Board& _board) { //50回ぐらいやっとけばそれなりに混ざるよね int level = 50; Position p; for (int i = 0; i < level; i++) { while (true)//動かせるタイル発見するまでランダムでタイルを選択(効率悪い) { int num = ランダムで1~15まで生成; if (numは動かせる) { break; } } numのタイルを移動; } }
関数ができたらInitBoardを以下のように書き換えてみよう。
//Cの人は void InitBoard(Board* _board) void InitBoard(Board& _board) { //初期化のごにょごにょが書いてある部分(省略) MakeProblem(_board); //Cの人は????(自分で考える) }
クリア判定は簡単だよね!考えてみよう。
(現在の配列がシャッフル前の初期状態(完成状態)と同じかどうか比べる)
クリアしたら、おめでとうのメッセージを表示してみよう。
デバッグしやすいように、MakeProblemの
//50回ぐらいやっとけばそれなりに混ざるよね int level = 50; => int level = 1;
にしておくと、1手で完成させられるよ。
(混ぜる回数を増やすとある程度までは難しくなるはずなので、それでレベル分け(難易度調整)できるよ)
これで一応コンソール版は完成させられると思う。
これで、パズルとしては動くけど、ゲームとしては不十分なところたくさんあるよね。
などなど、たくさんやることあると思うのでどうしたらいいか考えてみよう!