====== 問題の作成 ======
ここまで来たら後は、今まで作った関数を駆使して問題を作ってゆく。\\
ランダムでごちゃ混ぜにすればいいじゃん、って思う人もいるかもですが、実は解けない問題ってのがある。\\
なので、どうするかというと、話は簡単で。。。\\
移動できそうな数字をランダムで出して、一定回数空白タイルと入れ替えを行う。\\
(基本的に、そろった状態から入れ替えを行うと、その逆順の手順で操作すると元に戻せるよ)\\
したがって、手数がかかればかかるほど難しくなるはずなので、何回入れ替え操作をした問題化で何となくの難易度が設定できる。\\
(今回はその機能は搭載しない)\\
* 問題作成のアルゴリズム
* 以下の処理を一定回数繰り返す
- タイルの数字をランダムで選択
- そのタイルは動かせますか?
- YES:タイルを移動
- NO:数字の選択に戻る
=== 問題作成関数 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を以下のように書き換えてみよう。\\
void InitBoard(Board& _board)
{
//初期化のごにょごにょが書いてある部分(省略)
MakeProblem(_board);
}
==== クリア判定 ====
クリア判定は簡単だよね!考えてみよう。\\
クリアしたら、おめでとうのメッセージを表示してみよう。\\
デバッグしやすいように、MakeProblemの\\
//50回ぐらいやっとけばそれなりに混ざるよね
int level = 50;
=> int level = 1;
にしておくと、1手で完成させられるよ。\\
(そもそもレベルを引数でとって、ごちゃまぜる回数を。。。おっと誰か来たようだ。ここまでにしようか)\\
これで一応コンソール版は完成させられると思う。\\