画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語 目次/おまけ ゲームテクニック集!

広告

[C言語 入門 小学生でもわかるC言語]
おまけ ゲームテクニック集!

広告

↓2016年02月29日発売↓

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

目次へ戻る

ゲームテクニック集

ひとまずの入門を終えた方に向けて簡単なゲーム制作に使えそうなテクニックをご紹介します。

こちらの内容と合わせれば、

[C言語 コンソール]ブロックパズルの作り方

にあるようなごくささやかなゲームであれば作れるようになるかと思いますのでもしよかったら挑戦してみてください。

目次

乱数(ランダムな数)

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

int main(){
	int ransu;
	int kazu;

	srand((unsigned)time(NULL));

	for(kazu=0;kazu<10;kazu++){
		ransu = (rand()%10);
		printf("%d ",ransu);
	}

	printf("\n");

	return 0;
}

■実行結果■

画像(cb_15_1)

■説明■

乱数(らんすう)

乱数(ランダムな数)を発生させます!

使い道

確率によって起こる事全てに使います。

使い方

「#include <stdio.h>」の他に

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

先頭にこの2つを加えてください!

srand((unsigned)time(NULL));

こちらで乱数の初期値を決めて

ransu = (rand()%10);

こちらで乱数を発生させております。

「rand()%10」この「%10」の部分が乱数の範囲になります。

「%10」だと「0〜9」まで

「%50」だと「0〜49」まで

のようになります。

初期値っていうのは乱数の最初の数でそこから決まった乱数が発生させられます。

なので「srand()」の部分を削除したり

srand(200);

こんな感じで決まった数をここに入れると同じように乱数が発生します。

そこで「(unsigned)time(NULL)」これは今の時間を調べる関数ですが、常に流れている時間をここに入れる事によって毎回違う結果になるようにしております。

詳しくは小学生でもわかるC言語2の時間と乱数の項目をご覧ください。

画面のクリア

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

int main(){
	system("cls");
	
	return 0;
}

■実行結果■

画像(cb_15_2)

■説明■

画面のクリア

画面をクリアします!

使い道

画像の表示、クリア、画像の表示、クリア・・・。をくり返してアニメーションのような事ができます。

使い方

「#include <stdio.h>」の他に

#include <stdlib.h>

先頭にこちらを加えてください!

system("cls");

本体はこちらです。関数「system」を使うとコマンドプロンプトの命令を使えるようになります。ここでは「cls」という画面をクリアする命令を使ってます。

矢印キーリアルタイム(いつでも)入力

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

int main(){
	int dummy;
	int key;
	int flag = 1;

	printf("無限ループになります。矢印キーを押してください。\n");

	while(flag){
		if(_kbhit()){
			dummy = _getch();
			if(dummy == 0 || dummy == 224){
				key = _getch();
				flag = 0;
			}
		}
	}

	switch(key){
	case 0x4b:
		printf("左");
		break;
	case 0x48:
		printf("上");
		break;
	case 0x4d:
		printf("右");
		break;
	case 0x50:
		printf("下");
		break;
	default:
		printf("エラー!");
		break;
	}

	printf("\n");

	return 0;
}

■実行結果■

画像(cb_15_3)

■説明■

矢印キーリアルタイム(いつでも)入力

矢印キー(←↑→↓)をリアルタイムで受け取ります。

使い道

リアルタイムに進行するゲームなど

使い方

「#include <stdio.h>」の他に

#include <conio.h>

先頭にこちらを加えてください!

int dummy;
int key;

そして変数を2つ用意してください!

if(_kbhit()){
	dummy = _getch();
	if(dummy == 0 || dummy == 224){
		key = _getch();
	}
}

本体はこちらです。

_kbhit()

これはキーボードが押された時に反応する関数です。

dummy = _getch();

キーボード入力があった時は一文字だけ入力を受け取る「_getch()」関数でその押されたキーを受け取ります。

ここで押されたキーが矢印キーや一部のキーの場合は、最初に「0」または「224」を受け取り(環境によって受け取る数が違うかもです)次に「矢印キーのコード番号」というように2段階に分けてキーコードが発生されるので、もう一つ変数を用意してそこに2つ目のキーコードを保存します。

dummy = _getch();
if(dummy == 0 || dummy == 224){
	key = _getch();
}

「||」がまたはという意味で条件を2つ以上使いたい時にこれで次の条件を書きます。

普通のキーはそのまま「コード番号」を受け取るのでこんな事をしなくて大丈夫です。

あとは関数「switch」などでそれぞれのキーコードに分ければ完了です。

矢印キーコードはそれぞれ「0x4b:左」「0x48:上」「0x4d:右」「0x50:下」になります。

一文字ずつ入力を受け取る

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

int main(){
	int moji;
	int count;

	printf("無限ループになります。何かキーを押してください。\n");

	for(count=0;count<5;count++){
		moji = _getch();
		if(moji == 0 || moji == 224){
			moji = _getch();
		}
		printf("%d ",moji);
	}

	printf("\n");

	return 0;
}

■実行結果■

画像(cb_15_4)

■説明■

一文字ずつ入力を受け取る

一文字ずつ受け取って、「文字コード」で表示します。

使い道

タイピングゲームなど

使い方

「#include <stdio.h>」の他に

#include <conio.h>

先頭にこちらを加えてください!

int moji;

そして文字を受け取るための変数を「int」で1つ用意してください!

moji = _getch();

こちらの関数「_getch()」で一文字だけ入力を受け取ります。

ここで受け取った文字が矢印など少し特別な文字の場合、2回に分けて最初に「0」または「224」を受け取り、次に文字コードを受け取るので、受け取った文字が「0」や「224」だったらもう一度「_getch()」関数を使います。

moji = _getch();
if(moji == 0 || moji == 224){
	moji = _getch();
}

入力待ちになりますが、一文字入れればEnterキーを押さなくてもすぐに文字を受け取り表示します。

Enterキーの文字コード「13」なども表示されますのでいろいろ試してみてください!

広告

セットで一つ(構造体)

#include <stdio.h>

struct ADDRESSBOOK{
	char *name;
	char *tel;
	int age;
};

struct ADDRESSBOOK tarou;
struct ADDRESSBOOK hanako;
struct ADDRESSBOOK kumi6_3[10];

int main(){
	tarou.name = "山田太郎";
	tarou.tel = "09011112222";
	tarou.age = 18;

	hanako.name = "山田花子";
	hanako.tel = "09033334444";
	hanako.age = 20;

	kumi6_3[0].name = "鈴木一郎";
	kumi6_3[0].tel = "09012344321";
	kumi6_3[0].age = 12;

	kumi6_3[1].name = "田中二郎";
	kumi6_3[1].tel = "09022334455";
	kumi6_3[1].age = 12;

	printf("%s %s %d才\n",tarou.name,
		tarou.tel,tarou.age);
	printf("%s %s %d才\n",hanako.name,
		hanako.tel,hanako.age);
	printf("%s %s %d才\n",kumi6_3[0].name,
		kumi6_3[0].tel,kumi6_3[0].age);

	return 0;
}

■実行結果■

画像(cb_15_5)

■説明■

セットで一つ(構造体)

名前+電話番号=電話帳

ハンバーガー+ポテト+飲み物=ハンバーガーセット

などのようにいくつかのデータをまとめて一つのセットとして使う事ができます!

使い道

電話帳などなど

使い方

1・セットの内容を決める

まずはセットの内容を決めます。

・名前

・電話番号

・年令

これを元に「構造体変数」を作ります。

struct ADDRESSBOOK{
	char *name;
	char *tel;
	int age;
};

こちらが今決めた内容の構造体変数になります。

「struct」の後にその「セットの名前」

電話帳→「ADDRESSBOOK」

セットの名前は大文字でつけて、そして内容を中に書きます。

文章を使う時は「char *name・char *tel」と先頭に「*」をつけます。これはポインタといいます。難しい事は考えずこの通りに書けば普通に文章が使えます。詳しくはポインタをご覧ください!

これを「int main()」の前に書いておきます。

2・変数として宣言する

あとは普通の変数のように名前を付けて使います。

struct ADDRESSBOOK tarou;
struct ADDRESSBOOK hanako;
struct ADDRESSBOOK kumi6_3[10];

「struct」「セットの名前」の後に使う時の「変数名」をつけます。

配列にしてたくさんのデータをいっきに管理する事もできます。

そして一つ一つの内容を入れていきます。

例えば「tarou」だったら

tarou.name = "山田太郎";
tarou.tel = "09011112222";
tarou.age = 18;

変数名の間を「.」コンマで区切ってその内容を書きます。

ちなみにこの数字の部分は変更できますが、「*」を使った文章の場合の変更は基本的には一度決めたら変更できないのでご注意ください。

配列の場合は

kumi6_3[0].name = "鈴木一郎";
kumi6_3[0].tel = "09012344321";
kumi6_3[0].age = 12;

配列番号をくっつけて後は同じように内容を書きます。

そして使う時も同じように「tarou.name」のように「.」で区切って使います。

割った余り法

#include <stdio.h>

int main(){
	int i;
	for(i=0;i<20;i++){
		printf("%d ÷ 3 = %d 余り %d\n",i,i/3,i%3);
	}
	return 0;
}

■実行結果■

画像(cb_15_6)

■説明■

割った余りがぐるぐる回ります

変数なんかで同じトコロをぐるぐる回したい場合ってあると思います。

123401234012340123401234...

みたいな感じでぐるぐる回したような結果が得られます。

使い道

いろいろ使えます。

使い方

とりあえずの変数とそれを割る数を決めて、その余りを使います。

割る数が「3」だと「012012012...」「4」だと「012301230123...」みたいに回ります。

printf("%d ÷ 3 = %d 余り %d\n",i,i/3,i%3);

この計算はわかりやすいように割った結果もだしてますが、

実際に使う時は

余り = i % 3

これだけで大丈夫です。

あとはこれをインクリメントするなりしていけば「0123012...」のように同じトコロをぐるぐる回る結果が得られます。

ただインクリメントしすぎてもとの変数がマイナスになったりすると少しおかしな結果になる事があるので、ある限界で元に戻すなどエラー対策が必要です。

反対方向にぐるぐる

#include <stdio.h>

int main(){
	int i;
	for(i=0;i<50;i+=3){
		printf("%d ÷ 4 = %d 余り %d\n",i,i/4,i%4);
	}
	return 0;
}

■実行結果■

画像(cb_15_7)

反対方向のループにしたい場合は

「割る数 - 1」

の数を足していきます。

定まった数(定数)

#include <stdio.h>

#define MAX 100

int main(){
	int ans = 0;
	int count;

	for(count = 0;count <= MAX;count++){
		ans += count;
	}

	printf("ans = %d\n",ans);

	return 0;
}

■実行結果■

画像(cb_15_8)

■説明■

定数に名前をつけます

プログラム中であまり変更しない数字、例えばゲームでいうなら敵の最大数とかステージの最大数とかに名前をつける事ができます。

使い道

上手に使えばわかりやすく変更しやすいプログラムにする事ができます。

使い方

プログラムの先頭あたりに

#define MAX 100

のように書きます。

#define 名前 数字

みたいな感じですね。

「#include」などと同じようにお尻に「;」セミコロンはつかないので注意です。

名前は大文字で書くのがなんとなくのルールになってます。

そして使う時はそのまま

for(count = 0;count <= MAX;count++){
	ans += count;
}

プログラムに書くだけです。

こうしておけばプログラムの先頭を見ただけで大事な数字の内容がある程度わかるし、変数とも区別がつけられるし、変更する時もこの先頭部分だけ変えれば済んでしまうというワケです。

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)