C言語 入門 ミニゲーム集

その3 数字並べ替えゲーム 説明

ゲームプログラミングの入門に

HOME/ミニゲーム集 目次/その3 数字並べ替えゲーム 説明/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

数字並べ替えゲーム 説明

画像(m-3-1)

数字を並べ替えるゲームです。

ヘッダファイル

今回必要なヘッダファイルです。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

<stdio.h>以外を説明します。

<stdlib.h>

乱数を発生させる「srand()」、「rand()」、画面を消去する「system("cls")」などで使います。

<conio.h>

キー入力の「_getch()」などで使います。

<time.h>

時間を調べる「time()」で使います。今回は乱数の命令と一緒に使ってます。

もう少し詳しくという方はわからなそうな用語集のヘッダファイルを見てください。

変数

int key;
int count;
int count2;
int rnd1,rnd2;
int w = 0;
int ary_x = 0;
int ary_y = 0;
int i,j;
int index = 0;
int success_flag = 0;
int break_flag = 1;

int number[9] = {1,2,3,4,5,6,7,8,9};

int numbers[5][5] = {
	{0,0,0,0,0},
	{0,1,2,3,0},
	{0,4,5,6,0},
	{0,7,8,9,0},
	{0,0,0,0,0}
};

大事な役割を持つ変数が

int key = 0;入力されたキーを保存
int w = 0;配列を入れ替える時に一時的に値を保存する変数
int ary_x = 0;入力された数字の配列におけるx座標を保存
int ary_y = 0;入力された数字の配列におけるy座標を保存

この4つと、

int number[9] = {1,2,3,4,5,6,7,8,9};

こちらは並べ替えられた数字が正しい位置にあるかどうかを判定する配列、

int numbers[5][5] = {
	{0,0,0,0,0},
	{0,1,2,3,0},
	{0,4,5,6,0},
	{0,7,8,9,0},
	{0,0,0,0,0}
};

そしてゲームの土台となる2次元配列になります。

この2次元配列がなぜ「3×3」ではなく「5×5」になっているかというのは、数字を動かす時に必要になるので後ほど説明いたします。

その他はゲームのループ用や問題の数字を最初に並べ替える為の乱数用変数などになります。

問題となる2次元配列を並べ替える

まずは2次元配列を並べ替えます。

int numbers[5][5] = {
	{0,0,0,0,0},
	{0,1,2,3,0},
	{0,4,5,6,0},
	{0,7,8,9,0},
	{0,0,0,0,0}
};

こちらですね。

この中の回りを囲っている「0」に触れずに中身の「1〜9」だけをランダムに入れ替えます。

先に乱数の使い方ですが、

srand((unsigned)time(NULL));
rnd1 = rand() % 100;

一行目「srand()」というのは、乱数を使う時に必要な関数になるので深い事は気にせずそのままにしましょう。

基本的には「srand()」は最初に一回行えば大丈夫です。

そして2行目の後ろの「100」この数字を変える事によって必要な範囲の乱数を発生させる事ができます。

ここを「10」にすると「0〜9」まで、「50」にすると「0〜49」までという具合に乱数の範囲を決める事ができます。

ではソースをあらためてみてみると

srand((unsigned)time(NULL));
for (count = 0; count < 10; count++){
	rnd1 = rand() % 3 + 1;
	rnd2 = rand() % 3 + 1;
	w = numbers[1][1];
	numbers[1][1] = numbers[rnd1][rnd2];
	numbers[rnd1][rnd2] = w;
}

「for」ループの中に注目です。

rnd1 = rand() % 3 + 1;
rnd2 = rand() % 3 + 1;

このようになっておりますね。

「rand() % 3」なので発生する乱数は「0,1,2」そこに「+1」するので「1,2,3」の値がランダムに得られます。

なのでこの値を使って並べ替えをすれば回りを囲っている「0」には触れずに並べ替えられるというワケです。

2次元配列を表示

次に最初の状態を画面に出力します。

for(i=0;i<5;i++){
	for(j=0;j<5;j++){
		if(numbers[i][j] == 0)printf("■");
	}
	printf("\n");
}

2次元配列を画面に表示する時には2重の「for」ループが便利です。

慣れないとわかりずらいとは思いますが簡単なイメージとしては、まず内側の「for」ループによって2次元配列の横一列を調べて、そしてそれが終わったら外側の「for」ループを一つ進めるみたいなイメージになります。

そしてそれぞれ中身の要素を調べて置き換えて表示します。

if(numbers[i][j] == 0)printf("■");

内側のループ終わりに「printf("\n");」と改行するとこにも注意です。

キー入力

key = _getch();
if(key == 0 || key == 224)key = _getch();

まず「key = _getch()」こちらで一文字だけ入力を受け取り変数「key」に保存します。

その次の「if(key == 0 || key == 224)」これは矢印など一部の特別なキーは入力をなぜか2回受け取るので、その余分な一回を受け流す処理になります。

「_getch()」の場合はキーが押された瞬間(Enterキーを押さなくても)に入力を受け取ります。

1〜9の文字コード

この後に受け取ったキーの文字コードを調べて処理をしていきます。

なのでまずは文字コードについてみてみましょう。

#include <stdio.h>

int main(){
	printf("1 = %d\n",'1');
	printf("2 = %d\n",'2');
	printf("3 = %d\n",'3');

	return 0;
}

■実行結果■

画像(m-3-2)

1・2・3の文字コードを表示するプログラムです。

後ろの数字を「'a'」にすれば「a」の文字コードが調べられます。

結果は見たままですが

「1」→「49」

「2」→「50」

「3」→「51」

となります。

つまりは数字の「1〜9」は文字コードでいうトコロの「49〜57」になります。

では「1〜9」の文字コードがわかった所でソースを見てみましょう。

if((key >= 49 && key <= 56) || key == 122){
	break_flag = 0;
	if(key == 122){
		count2 = 50;
	}
}
else{
	printf("無効なキーです!\n");
}

前半の部分に注目です。

if(key >= 49 && key <= 56)

文字コードが49以上56以内ならって事ですね。

数字に直すと1以上8以下になりますね。

これで入力されたキーが「1〜8」以外だったら入力をやり直させるというワケです。

あとその後ろの「key == 122」は終了条件の「z」を押された時のキーコードです。

押された場所を調べる

キー入力された数字が2次元配列のどの位置にあるかを調べます。

for(i=0;i<5;i++){
	for(j=0;j<5;j++){
		if(numbers[i][j] == key - 48){
			ary_y = i;
			ary_x = j;
		}
	}
}

2次元配列を調べる時は2重の「for」ループでしたね。

2次元配列の中の数字は文字コードではなく普通の数字なので先ほどのキーコードを「key - 48」と「48」引いてあげる事によって普通の数字に戻す事ができます。

そして目当ての数字が見つかった時点で場所を変数「ary_y,ary_x」に保存します。

並べ替え

では変数「ary_y,ary_x」に保存された位置情報を使って並べ替えをします。

if(numbers[ary_y + 1][ary_x] == 9){
	w = numbers[ary_y + 1][ary_x];
	numbers[ary_y + 1][ary_x] = numbers[ary_y][ary_x];
	numbers[ary_y][ary_x] = w;
}

調べる場所は上下左右の四か所ですね。

調べる条件は2次元配列の要素「9」が空白の役わりをしているので調べた位置が「9」だったらそこと入れ替えて場所を移動します。

if(numbers[ary_y + 1][ary_x] == 9)

こちらが「ary_y + 1」と一つ上の場所を調べている場合ですね。

この調べる時に配列をはみ出して調べたりしてしまういわゆる「バッファオーバーフロー」を避けるために2次元配列を一回り大きく「5×5」にしたというワケです。

同じように他の場所も調べてあげます。

完成

あとは正解判定などを入れてゲーム全体のカタチを整えれば完成です。

ソースになります。

数字並べ替えゲーム ソース

□ページの先頭へ□

□HOME□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本

□ページの先頭へ□

□HOME□