数当てゲームなどで、ランダムな数を生成したいときには、rand関数を使います。
今回は、3回勝負のじゃんけんゲームでの使用例を紹介します。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_WIN 3 enum janken { ROCK = 1, SCISSORS = 2, PAPER = 3 }; main() { int cmp, you, cmpw, youw; char *str[] = { "グー", "チョキ", "パー" }; srand( time( NULL ) ); cmpw = youw = 0; printf( "じゃんけん %d回勝負\n", MAX_WIN ); do { printf( "1:グー, 2:チョキ, 3:パー, (q):終了 > " ); if( scanf( "%d" , &you ) != 1 ) break; if( you <= 0 || 3 < you ) break; cmp = rand() % 3 + 1; printf( " You:%s, Cmp:%s", str[you-1], str[cmp-1] ); if( you == cmp ) { printf( " [あいこ!]\n" ); } else if( (you == ROCK && cmp == SCISSORS) || (you == PAPER && cmp == ROCK) || (you == SCISSORS && cmp == PAPER) ) { printf( " [勝ち!]\n" ); youw++; } else { printf( " [負け!]\n" ); cmpw++; } } while( youw < MAX_WIN && cmpw < MAX_WIN ); if( youw == MAX_WIN ) printf( "あなたの勝ちです\n" ); if( cmpw == MAX_WIN ) printf( "コンピュータの勝ちです\n" ); }実行結果例
じゃんけん 3回勝負 1:グー, 2:チョキ, 3:パー, (q):終了 > 1 You:グー, Cmp:チョキ [勝ち!] 1:グー, 2:チョキ, 3:パー, (q):終了 > 2 You:チョキ, Cmp:グー [負け!] 1:グー, 2:チョキ, 3:パー, (q):終了 > 3 You:パー, Cmp:パー [あいこ!] 1:グー, 2:チョキ, 3:パー, (q):終了 > 1 You:グー, Cmp:チョキ [勝ち!] 1:グー, 2:チョキ, 3:パー, (q):終了 > 2 You:チョキ, Cmp:パー [勝ち!] あなたの勝ちですyou と cmp の手が同じなら [あいこ!] です。
【 擬似乱数を生成する関数 】
int rand( void ) //0からRAND_MAXまでの範囲の擬似乱数整数を返す
cmp = rand() % 3 + 1; //randから返された値を1〜3の範囲にする
3 で割った余りは 0〜2 のいずれかです。1〜3の値が欲しければ、それに +1 して使います。
【 擬似乱数の系列の種を指定する関数 】
void srand( unsigned int seed ) //seedで指定した系列とする
プログラム実行の度に異なる乱数列を作りたい場合は、seed に現在時刻を指定します。
srand( time( NULL ) ); //毎回異なる時刻を種にする
毎回、同じ数字のセットを作りたい場合は定数を指定します。
srand の呼び出しを省略すると、seed = 1 としたのと同じです。
[ 関連記事 ] 数当てゲーム