game-engineer:classes:2023:something-else:summertime-special-cource:slidepuzle-console-3

問題の作成

ここまで来たら後は、今まで作った関数を駆使して問題を作ってゆく。
ランダムでごちゃ混ぜにすればいいじゃん、って思う人もいるかもですが、実は解けない問題ってのがある。
なので、どうするかというと、話は簡単で。。。
移動できそうな数字をランダムで出して、一定回数空白タイルと入れ替えを行う。
(基本的に、そろった状態から入れ替えを行うと、その逆順の手順で操作すると元に戻せるよ)
したがって、手数がかかればかかるほど難しくなるはずなので、何回入れ替え操作をした問題化で何となくの難易度が設定できる。
(今回はその機能は搭載しない)

  • 問題作成のアルゴリズム
    • 以下の処理を一定回数繰り返す
      1. タイルの数字をランダムで選択
      2. そのタイルは動かせますか?
        1. YES:タイルを移動
        2. 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手で完成させられるよ。
(そもそもレベルを引数でとって、ごちゃまぜる回数を。。。おっと誰か来たようだ。ここまでにしようか)
これで一応コンソール版は完成させられると思う。

  • game-engineer/classes/2023/something-else/summertime-special-cource/slidepuzle-console-3.txt
  • 最終更新: 3年前
  • by root