第1回 スライドパズルを作ろう
スライドパズルを作ろう
これまでC言語を使って、Hit & Blowゲームを作ってきました。
Hit & Blowでは、変数や配列だけでなく、構造体や関数を使って処理を整理する方法や、ゲームを繰り返し動かすゲームループについても学習しました。
これまでに学習したC言語を使って、コンソールで動くスライドパズルを作ってみよう!
新しい文法を覚えることよりも、構造体・関数・ゲームループなど、学習済みの内容を組み合わせてゲームを作ることが目標です。
1.今回作るゲーム
スライドパズルは、数字の書かれたタイルを空いている場所へ動かして、数字を順番に並べるゲームです。
例えば、次のような盤面があったとします。
1 2 3 4
5 6 7 8
9 10 12
13 14 11 15
空いている場所の上下左右にあるタイルを動かすことができます。
この盤面では、「11」を空いている場所へ動かすことができます。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15
さらに「15」を動かすと、
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15
すべての数字が順番に並びました。
これでクリアです。
2.Hit & Blowと比べてみよう
今回作るスライドパズルは、Hit & Blowとはまったく違うゲームです。
しかし、プログラム全体の流れを比べてみると、よく似ています。
Hit & Blow
問題を作る
↓
数字を入力する
↓
Hit・Blowを調べる
↓
結果を表示する
↓
正解した?
↓
まだなら繰り返す
スライドパズル
問題を作る
↓
盤面を表示する
↓
動かすタイルを入力する
↓
タイルを動かす
↓
クリアした?
↓
まだなら繰り返す
ゲームのルールが変わっても、
入力する → ゲームの状態を変える → 結果を調べる → 繰り返す
という基本的な流れは同じです。
3.ゲームループを思い出そう
ゲーム中の処理を繰り返す部分をゲームループと呼びました。
Hit & Blowでも、正解するまで処理を繰り返していました。
今回のスライドパズルでも同じように、
while (ゲーム中)
{
盤面を表示する;
入力する;
タイルを動かす;
クリアしたか調べる;
}
という流れを作ります。
もちろん、このままではC言語のプログラムとして動きません。
これから、
- 盤面を表示する処理
- タイルを探す処理
- タイルが動かせるか調べる処理
- タイルを動かす処理
- クリアしたか調べる処理
を順番に作ります。
最後に、それらをゲームループの中で組み合わせます。
4.構造体を思い出そう!
Hit & Blowでも使った構造体は、関係のあるデータをひとまとめにして扱うためのものです。
例えば、プレイヤーなら、
HP
攻撃力
名前
のようなデータを、1つのまとまりとして扱えます。
スライドパズルでは、
盤面の情報 → Board
位置の情報 → Position
という2つの構造体を使います。
細かい書き方は、実際に作りながら確認していこう!
5.全部main()に書く?
スライドパズルには、いろいろな処理が必要です。
例えば、
盤面を用意する
盤面を表示する
タイルを探す
動かせるか調べる
タイルを動かす
クリアしたか調べる
問題を作る
などです。
これらを全部main()の中に書くこともできます。
しかし、すべてを1か所に書いてしまうと、プログラムが長くなり、
どこで何をしているのか分かりにくいプログラム
になってしまいます。
そこで、Hit & Blowでも使った関数を使います。
例えば、
盤面を初期化する
盤面を表示する
タイルを探す
動かせるか調べる
タイルを動かす
クリアしたか調べる
パズルの問題を作る
のように、仕事ごとに関数へ分けていきます。関数名は、実際に作るところで決めていこう!
最初から全部作る必要はありません。
1つ作る → 動かして確認する → 次の機能を作る
という順番で進めます。
6.作った関数を組み合わせる
一度作った関数は、別の処理から呼び出して利用できます。
例えば、「タイルを探す関数」を作ったあとで別の処理からタイルの位置が必要になったら、探索処理をもう一度書く必要はありません。作っておいた関数を呼び出して使えます。
7.今回使うC言語
このゲームでは、次のC言語の機能を使います。
- 変数
ifforwhile- 配列
- 構造体
- 関数
- 引数
- 戻り値
- ポインタ
- 乱数
scanf()printf()
全部を暗記している必要はありません。
分からない文法や書き方があれば、以前の教材や自分が作ったプログラムを確認してください。
8.制作スタート!
それでは、次の順番でゲームを作っていこう!
盤面を作る
↓
盤面を表示する
↓
タイルを探す
↓
動かせるか調べる
↓
タイルを動かす
↓
クリアを調べる
↓
ゲームループを作る
↓
パズルの問題を作る
↓
完成!
最初は、16個のマスを持つ盤面を構造体で表してみよう!
