広告
↓発売日:2018年09月22日↓
新品価格 |
今回は入門プログラムの定番、タイピングゲームを作ります。
アルファベット小文字を打つタイピングゲームになります。
連続して表示されるアルファベット一文字が画面の端に到達する前に小文字でタイピングしていきます。
今回必要なヘッダファイルです。
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h>
<stdio.h>以外を説明します。
画面をクリアする「system("cls")」・乱数を発生させる「rand()」で使います。
キー入力の「_getch()」などで使います。
時間を調べる「time()」で使います。今回は乱数の命令と一緒に使ってます。
ヘッダファイルの意味についてはわからなそうな用語集のヘッダファイルを見てください。
int key = 0; int i = 0; int rnd = 0; int count = 0; int score = 0; int mistake = 0;
大事な役割を持つ変数が
/*入力されたキーを保存*/ int key = 0; /*乱数を保存*/ int rnd = 0;
こちらの2つの変数になります。あとはゲーム全体のループ用や得点用などになります。
乱数はよく使われるのでカタチで覚えてしまいましょう。
srand((unsigned)time(NULL)); rnd = (rand() % 26);
まず一行目「srand()」というのは、乱数を使う時に初期値を設定するという関数になります。
初期値?と思われるかもしれませんが、これ以上の詳しい説明はゲームテクニック集の乱数をご覧ください。
そして2行目の後ろの「26」この数字を変える事によって必要な範囲の乱数を発生させる事ができます。
ここを「10」にすると「0~9」まで、「50」にすると「0~49」までという具合に乱数の範囲を決める事ができます。
今回はアルファベット26文字なので「26」ですね。
今回のプログラムの一番大事な部分です。
#include <stdio.h> int main(){ printf("a = %d\n",'a'); printf("97 = %c\n",97); printf("98 = %c\n",98); return 0; }
最初に「a」の文字コードを表示して、次にその逆の文字コードから文字を表示するプログラムになります。
文字コードを知りたい時は「%d」、逆に文字コードから文字を表示させたい時は「%c」を使います。
実行結果から「a」の文字コードは「97」番、そしてその次の「98」番は「b」になる事がわかります。
つまり文字コード「97番~122番」がアルファベット小文字の「a~z」という事になります。
なのでこれを利用して最初の「97」番に乱数で発生させた「0~25」の値を加えてやればアルファベットをランダムに発生させてあげる事ができるワケです。
printf("%c",(97 + rnd));
文字コード「97」番にさきほど発生させた乱数「rnd」を加えてます。
こちらもカタチで覚えましょう。
if(_kbhit()){ key = _getch(); if(key == 0 || key == 224)key = _getch(); }
まず「if(_kbhit())」こちらはキー入力が合った時に反応する関数になります。
そして次に「key = _getch()」こちらで一文字だけ入力を受け取ります。
その次の「if(key == 0 || key == 224)」これは矢印など一部の特別なキーは入力をなぜか2回受け取るので、その余分な一回を受け流す処理になります。
もう少し詳しく知りたい方はこちらもゲームテクニック集の矢印キーリアルタイム入力をご覧ください。
あとはゲーム内容ですね。
まず画面の端まで80文字分アルファベットを表示させます。
for(i=0;i<80;i++){ printf("%c",(97 + rnd)); }
そしてその間にキー入力があれば途中で表示をやめます。
for(i=0;i<80;i++){ printf("%c",(97 + rnd)); timer(); if(_kbhit()){ key = _getch(); if(key == 0 || key == 224)key = _getch(); break; } }
「timer()」は時間稼ぎ用に意味のない「for」ループを重ねているだけです。入門用のお遊びプログラムなのでこのような手法をとっておりますが、きちんと作る時は他の方法でゲーム内の時間をカウントするか、「sleep()」みたいな名前でスレッドを止める命令があるのでそちらをご使用ください。
あとは入力されたキーが合っているかどうかの判定をします。
if(key == (rnd + 97)){ score++; } else{ mistake++; }
判定も難しく考えずにそのまま入力されたキーが乱数の値と同じかどうかを比べるだけです。「score」は得点、「mistake」はミスをカウントする変数です。
そしてゲーム全体のカタチを整えれば完成です。
変数「count」でゲーム全体の回数、「timer()」の「for」ループで表示速度を変えられます。
乱数の範囲を変えればアルファベット以外のキーボード入力判定も加えられるのでいろいろと試してみてください。
ソースになります。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |