授業/C言語基礎/計算ゲーム
をテンプレートにして作成
開始行:
*計算問題 [#z18be2f4]
これまでに勉強したことを使って、次のような簡単な計算ゲー...
+コンピューターが足し算の問題を出題する
+ユーザーがそれに答える
+正解か不正解かをコンピューターが判定する
次のプログラムは、変数iと変数jの足し算の式を問題として出...
#geshi(c){{
#include <stdio.h>
int main(void) {
int i = 45, j = 76, a;
printf("%d + %d = ", i, j);
scanf("%d", &a);
if (a == i + j) {
printf("正解!\n");
} else {
printf("間違い!\n");
}
return 0;
}
}}
**演習1 [#s2f421a4]
プログラム1を作成し、実行結果を確認せよ。
また、何回か問題を変えて実行せよ。
*rand関数 [#hce57cfb]
上のプログラムは、問題がプログラムで決められているため、...
これでは、ゲームとしては面白くありません。
そこで、''乱数''を使って、問題を自動的に生成します。
''乱数''とは、無秩序に、かつ、すべて同じ確率で出現するよ...
ゲームを作るときには、乱数を良く使います。
乱数を生成するには、''rand関数''を使います。
rand関数は、標準ライブラリーのヘッダー・ファイル ''stdlib...
rand関数は、int型の乱数を生成します(プログラム2)。
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int r;
r = rand();
printf("%d\n", r);
return 0;
}
}}
**演習2 [#w3f1e725]
プログラム2を作成し、何回か実行して結果を確認せよ。
*srand関数 [#rdffca73]
上のプログラムを実行すると、毎回、同じ結果になります。
rand関数は、毎回同じやり方で擬似乱数を生成するので、スタ...
そこで、''srand関数''を使って擬似乱数を生成するスタート地...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int r;
srand(2);
r = rand();
printf("%d\n", r);
return 0;
}
}}
srand関数の ( ) の中の数は、擬似乱数を生成するスタート地...
**演習3 [#k4236dbc]
プログラム2をプログラム3に変更し、何回か実行して結果を確...
また、srand関数の ( ) の中の数を変えてコンパイルし直し、...
*time関数 [#n824096f]
乱数のシードが同じだと生成される乱数の系列が毎回同じにな...
現在の時刻を取得するには、''time''関数を使います。
time関数を使うには、''time.h''という標準のライブラリーを...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = rand();
printf("%d\n", r);
return 0;
}
}}
time関数の結果をunsigned int型にキャストしてsrand関数に渡...
ちょっとややこしいですが、今はこういうものだと思って進め...
**演習4 [#z9f637d8]
プログラム3をプログラム4に変更し、何回か実行して結果を確...
*サイコロ [#r207a8e2]
サイコロは、1から6までの整数が同じ確率で出ます。
サイコロを、乱数で作るには、次のようにします。
+rand関数で乱数を生成する
+生成された値を6で割ったときの余りを求める(0から5)
+最後に、1を加える(1から6)
したがって、サイコロを振るプログラムは、次のようになりま...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = rand() % 6 + 1;
printf("%d\n", r);
return 0;
}
}}
なお、この作り方で作った乱数は、ゲームで使うくらいならあ...
**演習5 [#s93893b5]
プログラム4をプログラム5に変更し、何回か実行して結果を確...
*計算ゲーム [#rb9308ee]
いよいよ、計算ゲームを作ります。
計算ゲームの流れは以下のようになります。
+コンピューターが足し算の問題を作り、出題する
+ユーザーがそれに答える
+正解か不正解かをコンピューターが判定する
これをもう少しC言語風にします。
+rand関数を使って整数同士の足し算の問題を乱数を使って作成...
+scanf関数を使ってキーボードから入力された整数を読み取る
+if文を使って入力された答えが正しいかどうかを判定し、prin...
したがって、計算ゲームのプログラムは、次のようになります...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, j, a;
srand((unsigned int) time(NULL));
i = rand() % 99 + 1;
j = rand() % 99 + 1;
printf("%d + %d = \n", i, j);
scanf("%d", &a);
if (a == i + j) {
printf("正解!\n");
} else {
printf("間違い!\n");
}
return 0;
}
}}
**演習6 [#a4cd4fbc]
プログラム6を作成し、何回か実行して結果を確認せよ。
----
*もうすこしマシなサイコロ(おまけ) [#n9c27942]
上の、剰余を使ったサイコロでは、生成された(2進数の)擬似...
(10進数の擬似乱数に対して0から9までのサイコロを作るため...
ところが、rand関数が生成する擬似乱数の下位ビットは乱数と...
そこで、生成された擬似乱数の上位ビットを使って乱数を作り...
rand関数が生成する最も小さな数は0、最も大きな数はstdlib.h...
これを使って1から6までの乱数を生成するには、次のようにし...
+生成した乱数を RAND_MAX + 1.0 で割って0以上1未満の実数(...
+これを6倍して0以上6未満の実数(0から5.999999999...)にする
+その整数部分(0から5)を取り出す
+最後に、1を加える(1から6)
したがって、剰余を用いて取り出した乱数の下位ビットによる...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = (int) (rand() / (RAND_MAX + 1.0) * 6) + 1;
printf("%d\n", r);
return 0;
}
}}
ちなみに、この作り方でもまだ問題があることがわかっていま...
また、rand関数そのものにも問題があるので、きちんとした乱...
(メルセンヌ・ツイスターという方法を使います。)
**演習7 [#g74c924d]
プログラム5をプログラム7に変更し、何回か実行して結果を確...
----
*まとめ [#tda5150b]
これまでに勉強した[[if文>授業/C言語基礎/if文]]、[[画面へ...
今回は、これを利用して計算ゲームを作りました。
ただし、毎回同じ問題ではゲームとしてつまらないので、乱数...
乱数の生成に使われるrand関数、srand関数、time関数、unsign...
終了行:
*計算問題 [#z18be2f4]
これまでに勉強したことを使って、次のような簡単な計算ゲー...
+コンピューターが足し算の問題を出題する
+ユーザーがそれに答える
+正解か不正解かをコンピューターが判定する
次のプログラムは、変数iと変数jの足し算の式を問題として出...
#geshi(c){{
#include <stdio.h>
int main(void) {
int i = 45, j = 76, a;
printf("%d + %d = ", i, j);
scanf("%d", &a);
if (a == i + j) {
printf("正解!\n");
} else {
printf("間違い!\n");
}
return 0;
}
}}
**演習1 [#s2f421a4]
プログラム1を作成し、実行結果を確認せよ。
また、何回か問題を変えて実行せよ。
*rand関数 [#hce57cfb]
上のプログラムは、問題がプログラムで決められているため、...
これでは、ゲームとしては面白くありません。
そこで、''乱数''を使って、問題を自動的に生成します。
''乱数''とは、無秩序に、かつ、すべて同じ確率で出現するよ...
ゲームを作るときには、乱数を良く使います。
乱数を生成するには、''rand関数''を使います。
rand関数は、標準ライブラリーのヘッダー・ファイル ''stdlib...
rand関数は、int型の乱数を生成します(プログラム2)。
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int r;
r = rand();
printf("%d\n", r);
return 0;
}
}}
**演習2 [#w3f1e725]
プログラム2を作成し、何回か実行して結果を確認せよ。
*srand関数 [#rdffca73]
上のプログラムを実行すると、毎回、同じ結果になります。
rand関数は、毎回同じやり方で擬似乱数を生成するので、スタ...
そこで、''srand関数''を使って擬似乱数を生成するスタート地...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int r;
srand(2);
r = rand();
printf("%d\n", r);
return 0;
}
}}
srand関数の ( ) の中の数は、擬似乱数を生成するスタート地...
**演習3 [#k4236dbc]
プログラム2をプログラム3に変更し、何回か実行して結果を確...
また、srand関数の ( ) の中の数を変えてコンパイルし直し、...
*time関数 [#n824096f]
乱数のシードが同じだと生成される乱数の系列が毎回同じにな...
現在の時刻を取得するには、''time''関数を使います。
time関数を使うには、''time.h''という標準のライブラリーを...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = rand();
printf("%d\n", r);
return 0;
}
}}
time関数の結果をunsigned int型にキャストしてsrand関数に渡...
ちょっとややこしいですが、今はこういうものだと思って進め...
**演習4 [#z9f637d8]
プログラム3をプログラム4に変更し、何回か実行して結果を確...
*サイコロ [#r207a8e2]
サイコロは、1から6までの整数が同じ確率で出ます。
サイコロを、乱数で作るには、次のようにします。
+rand関数で乱数を生成する
+生成された値を6で割ったときの余りを求める(0から5)
+最後に、1を加える(1から6)
したがって、サイコロを振るプログラムは、次のようになりま...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = rand() % 6 + 1;
printf("%d\n", r);
return 0;
}
}}
なお、この作り方で作った乱数は、ゲームで使うくらいならあ...
**演習5 [#s93893b5]
プログラム4をプログラム5に変更し、何回か実行して結果を確...
*計算ゲーム [#rb9308ee]
いよいよ、計算ゲームを作ります。
計算ゲームの流れは以下のようになります。
+コンピューターが足し算の問題を作り、出題する
+ユーザーがそれに答える
+正解か不正解かをコンピューターが判定する
これをもう少しC言語風にします。
+rand関数を使って整数同士の足し算の問題を乱数を使って作成...
+scanf関数を使ってキーボードから入力された整数を読み取る
+if文を使って入力された答えが正しいかどうかを判定し、prin...
したがって、計算ゲームのプログラムは、次のようになります...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, j, a;
srand((unsigned int) time(NULL));
i = rand() % 99 + 1;
j = rand() % 99 + 1;
printf("%d + %d = \n", i, j);
scanf("%d", &a);
if (a == i + j) {
printf("正解!\n");
} else {
printf("間違い!\n");
}
return 0;
}
}}
**演習6 [#a4cd4fbc]
プログラム6を作成し、何回か実行して結果を確認せよ。
----
*もうすこしマシなサイコロ(おまけ) [#n9c27942]
上の、剰余を使ったサイコロでは、生成された(2進数の)擬似...
(10進数の擬似乱数に対して0から9までのサイコロを作るため...
ところが、rand関数が生成する擬似乱数の下位ビットは乱数と...
そこで、生成された擬似乱数の上位ビットを使って乱数を作り...
rand関数が生成する最も小さな数は0、最も大きな数はstdlib.h...
これを使って1から6までの乱数を生成するには、次のようにし...
+生成した乱数を RAND_MAX + 1.0 で割って0以上1未満の実数(...
+これを6倍して0以上6未満の実数(0から5.999999999...)にする
+その整数部分(0から5)を取り出す
+最後に、1を加える(1から6)
したがって、剰余を用いて取り出した乱数の下位ビットによる...
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = (int) (rand() / (RAND_MAX + 1.0) * 6) + 1;
printf("%d\n", r);
return 0;
}
}}
ちなみに、この作り方でもまだ問題があることがわかっていま...
また、rand関数そのものにも問題があるので、きちんとした乱...
(メルセンヌ・ツイスターという方法を使います。)
**演習7 [#g74c924d]
プログラム5をプログラム7に変更し、何回か実行して結果を確...
----
*まとめ [#tda5150b]
これまでに勉強した[[if文>授業/C言語基礎/if文]]、[[画面へ...
今回は、これを利用して計算ゲームを作りました。
ただし、毎回同じ問題ではゲームとしてつまらないので、乱数...
乱数の生成に使われるrand関数、srand関数、time関数、unsign...
ページ名: