| 『楽しく!』『できる!!』C講座のページ |
2002.12.5
講座内容で、この色で示している <stdio.h> <stdlib.h> の部分がタグと誤認されて消えてしまっていました。'<' '>' を用いていた場所を '<' '>' に修正しました。
第6回:乱数をつかって本当のゲームを作ろう!
・乱数
さて、前回は条件分岐の別の形switch文をつかってソースを改良(?)してみました。
今回はいよいよお待ちかね乱数を使います。
・乱数
乱数という言葉を聞いたことがあるでしょうか?最近はゲームをやっている人、コンピュータを触っている人なら聞いたことがあるかもしれません。
乱数(random number)
とは,何の規則性もなくデタラメに発生する数のことです。
-----以下、なんとなく書いてみました。読み飛ばしてください(笑)-----
この乱数を計算によって発生させるためのアルゴリズム(方法)も色々と研究されています。ただし,計算によって乱数を発生させようとすると、最初のうちはいいのですが、やがて同じ数が現れて繰り返しが生じてしまうという宿命があります。そのため、研究のポイントは繰り返し周期の長い乱数列の生み出し方にあるようです。
とはいえ、繰り返しのサイクルが十分に大きければ、実用上乱数とみなすことができます。計算によって求められる乱数は、本当は乱数もどきなので、擬似乱数(pseudo-random number)と呼ばれます。
乱数を用いて行う数学的な計算の技法はしばしば「モンテカルロ法」と呼ばれます。この名前はカジノで有名な街・モンテカルロに由来しています。モンテカルロ法では、大量の乱数を発生させて計算機の中で繰り返し実験を行い、多数回の実験結果から何らかの普遍的な共通因子を抽出します。
コンピュータの応用分野であるシミュレーション問題のうち、ランダムな要素を含むものは全てモンテカルロ法の対象となります。確率とは本来無関係な問題であっても、問題となる方程式などの構造を調べることにより、それがある確率事象を表していることを見いだせば、モンテカルロ法で数値的に解くことができます。
急に専門的な説明を始めたのでびっくりしましたか?
-----以上、なんとなく詳しい説明です。-----
まぁ、上のことは独学で勉強しようとすると、出てくるかもしれない用語だったので説明したまでです。「へぇ、そうなんだ。」ぐらいに頭の隅に置いておいてくれればOKです。
難しいことを並べましたが、なんといってもゲームでお世話になっている人が一番多いのではないでしょうか?
今回は乱数を利用してじゃんけんゲームにゲーム的な要素を与えたいと思います。
・ 乱数
今回使う乱数の書式は
|
#include<stdlib.h> n = rand(); |
|
#include <stdio.h> #include <stdlib.h> void main() { double n; srand(3); n = rand(); printf("%f\n",n); } |
|
#include <stdio.h> #include <stdlib.h> #include <time.h> //時間を求める関数timeを使うために必要 void main() { double n,m; m=(unsigned)time(NULL); srand(m); n = rand(); printf("%f\n",n); } |
|
srand((unsigned)time(NULL)) |
|
/*Janken ようやく普通のじゃんけんゲームになった */ #include <stdio.h> #include <stdlib.h> /* 乱数関数 srand(), rand() を使うために必要 */ #include <time.h> /* 時間を求めるtime()を使うために必要 */ void main(void) { char selected; /* プレイヤーが選択したものを入れておく */ int com; /* コンピュータの出す手を入れておく */ printf("************************************** \n"); printf("* じゃんけんゲーム * \n"); printf("************************************** \n"); printf("\n"); printf("#### 説明 ########\n"); printf("# g : グー #\n"); printf("# t : チョキ #\n"); printf("# p : パー #\n"); printf("#################\n"); printf("\n"); printf("\n"); printf("ジャンケンしよう!\n"); printf("ジャンケン……\n"); scanf("%c",&selected); /* プレイヤーが選択したキャラを selected に格納 */ printf("ほいっ!!\n"); srand((unsigned)time(NULL)); /* 乱数ジェネレーターの初期化 */ com = rand()%3+1; /* コンピュータの出す手を 1から3で決める */ /* com の値を出すキャラクターに置き換える */ switch(com){ case 1: com = 'g'; break; case 2: com = 't'; break; case 3: com = 'p'; break; } switch(selected){ case 'g': if(selected == com){ printf("++++++++++++++\n"); printf(" あなた:グー\n"); printf(" わたし:グー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あいこ! #\n"); printf("\n"); } else if(com=='t'){ printf("++++++++++++++\n"); printf(" あなた:グー\n"); printf(" わたし:チョキ\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あなたの勝ち #\n"); printf("\n"); } else if(com=='p'){ printf("++++++++++++++\n"); printf(" あなた:グー\n"); printf(" わたし:パー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# わたしの勝ち #\n"); printf("\n"); } break; case 't': if(selected == com){ printf("++++++++++++++\n"); printf(" あなた:チョキ\n"); printf(" わたし:チョキ\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あいこ! #\n"); printf("\n"); } else if(com=='g'){ printf("++++++++++++++\n"); printf(" あなた:チョキ\n"); printf(" わたし:グー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# わたしの勝ち #\n"); printf("\n"); } else if(com=='p'){ printf("++++++++++++++\n"); printf(" あなた:チョキ\n"); printf(" わたし:パー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あなたの勝ち #\n"); printf("\n"); } break; case 'p': if(selected == com){ printf("++++++++++++++\n"); printf(" あなた:パー\n"); printf(" わたし:パー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あいこ! #\n"); printf("\n"); } else if(com=='t'){ printf("++++++++++++++\n"); printf(" あなた:パー\n"); printf(" わたし:チョキ\n"); printf("++++++++++++++\n"); printf("\n"); printf("# わたしの勝ち #\n"); printf("\n"); } else if(com=='g'){ printf("++++++++++++++\n"); printf(" あなた:パー\n"); printf(" わたし:グー\n"); printf("++++++++++++++\n"); printf("\n"); printf("# あなたの勝ち #\n"); printf("\n"); } break; default: printf("エラー!!"); printf("g,t,p の中から選択してください!!\n"); break; } } |