じゃんけんゲームをいろいろな言語で作っていると、乱数の奥深さを知ることができた、ユゲタです。
乱数って、バラバラの数値を返してくれるものだということは、多くのプログラマーが知っていると思いますが、そのアルゴリズムの基本は、何回繰り返し実行しても、同じ並びで同じ値の乱数が返ってくるというのが基本仕様です。
これを回避させるために、実行時間を数値に加えて値をスライドさせることで、まるで違った数字が実行するたびに発生するという、この処理を言語の乱数処理のデフォルトにしているものもありますが、オプションで時間ライブラリと繋げなければいけないものもあります。
その言語の特性にもなりそうですが、以前ブログで乱数を出力する関数を作ってみるっていうのをやったんですが、難しさを思い出しました。
以前のブログ :
[JavaScript] 独自に乱数を作成する
そして、今回は、C言語でじゃんけんゲームを、作ってみます。
本日のIT謎掛け
「乱数」と、かけまして・・・
「何の種を植えたか忘れた家庭菜園」と、ときます。
そのココロは・・・
出る目(値の目と芽)は想像できません。
C言語でじゃんけんゲームのソース
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int get_com_spr(void){
srand((unsigned int)time(NULL)); // 現在時刻の情報で初期化
return rand() % 3;
}
char * spr_match(int my_spr , int com_spr){
if(my_spr == com_spr){
return "draw";
}
else if(my_spr == 0 && com_spr == 1){
return "win";
}
else if(my_spr == 1 && com_spr == 2){
return "win";
}
else if(my_spr == 2 && com_spr == 0){
return "win";
}
else {
return "lose";
}
}
void result_view(char * res){
if(strcmp(res,"win") == 0){
printf("あなたの勝ちです。\n");
}
else if(strcmp(res,"lose") == 0){
printf("あなたの負けです。\n");
}
else{
printf("引き分けです。\n");
}
}
int main(void){
char * str_spc[3] = {"グー" , "チョキ" , "パー"};
int my_spr;
printf("じゃんけん : [0:グー 1:チョキ 2:パー] : ");
scanf("%d" , &my_spr);
printf("あなたの出した手は、%sです。\n", str_spc[my_spr]);
int com_spr;
com_spr = get_com_spr();
printf("コンピュータの出した手は、%sです。\n", str_spc[com_spr]);
char * res = spr_match(my_spr ,com_spr);
result_view(res);
main();
return 0;
}
実行と解説
コンパイルは、以下でサクっと行います。
エラーが出なければ、コンパイル成功です。
$ gcc janken.c -o janken
そして、実行。
$ ./janken
じゃんけん : [0:グー 1:チョキ 2:パー] : 1
あなたの出した手は、チョキです。
コンピュータの出した手は、パーです。
あなたの勝ちです。
じゃんけん : [0:グー 1:チョキ 2:パー] : 1
あなたの出した手は、チョキです。
コンピュータの出した手は、グーです。
あなたの負けです。
じゃんけん : [0:グー 1:チョキ 2:パー] : 1
あなたの出した手は、チョキです。
コンピュータの出した手は、チョキです。
引き分けです。
無事にプログラムは成功です。
このプログラムは、ジャンケンが終わったらすぐに次のジャンケンがはじまる無限ループ状態になるので、終了する時は、CTL+Cキーで強制終了させてください。
そして、このプログラムで一番苦労した点は、c言語の配列ですね。
メモリを考えながら配列を考えなければいけないC言語は、通常のインタプリタのような感覚で配列を扱うと、すぐにエラーが出ます。
そして、関数は、実行するより以前に書いていなければ、エラーになるので、気をつけましょう!
プログラム構成は、他の言語とほぼ同じにしているんですが、いろいろな言語を扱うことで、コーディングルールの共通化する時に気をつけるポイントなどが見えてきた感じがします。
今回のプログラミング作業時間は約30分程度でした。
0 件のコメント:
コメントを投稿