Skip to main content

第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言語の機能を使います。

  • 変数
  • if
  • for
  • while
  • 配列
  • 構造体
  • 関数
  • 引数
  • 戻り値
  • ポインタ
  • 乱数
  • scanf()
  • printf()

全部を暗記している必要はありません。

分からない文法や書き方があれば、以前の教材や自分が作ったプログラムを確認してください。


8.制作スタート!

それでは、次の順番でゲームを作っていこう!

盤面を作る
    ↓
盤面を表示する
    ↓
タイルを探す
    ↓
動かせるか調べる
    ↓
タイルを動かす
    ↓
クリアを調べる
    ↓
ゲームループを作る
    ↓
パズルの問題を作る
    ↓
完成!

最初は、16個のマスを持つ盤面を構造体で表してみよう!