/**********************************************************************/ /* インクルードファイル */ /**********************************************************************/ #include #include #include #include /**********************************************************************/ /* プロトタイプ宣言 */ /**********************************************************************/ void main( int, char** ); /* メイン */ void title( void ); /* タイトル表示 */ int ran( int ); /* 乱数発生 */ void wait_for( int ); /* 指定秒間時間待ち */ /**********************************************************************/ /* 定数宣言 */ /**********************************************************************/ /**********************************************************************/ /* グローバル変数 */ /**********************************************************************/ /**********************************************************************/ /* 関数名: void main( argc, argv ) */ /* 機能: メイン関数 */ /* 外部参照: */ /* 入力: int argc : パラメータの数 */ /* char *argv[] : パラメータの文字列の配列 */ /* 戻り値: */ /*--------------------------------------------------------------------*/ /* 備考: */ /**********************************************************************/ void main( argc, argv ) int argc; char *argv[]; { short f; /* デバッグフラグ */ long i, j; /* ループ変数 */ long k; /* 答え */ long l; /* ユーザ入力用 */ long m; /* 桁数 */ long n; /* 回数 */ long ihit, iblo; /* 変数 */ char a[80]; /* 答え */ char b[80]; /* ユーザ入力用 */ title(); ran( -1 ); if( argc < 2 ) { printf("パラメータを指定してください\n"); exit(1); } m = atoi( argv[1] ); if( (m < 2) || (m > 8) ) { printf("パラメータは2〜8の範囲で入力してください\n"); exit(1); } f = 0; if( argc >= 3 ) { if( strcmp( argv[2], "-d" ) == 0 ) f = 1; if( strcmp( argv[2], "-D" ) == 0 ) f = 1; if( strcmp( argv[2], "/d" ) == 0 ) f = 1; if( strcmp( argv[2], "/D" ) == 0 ) f = 1; } /* 数を初期化 */ for( i = 1; i < 10; i++ ) a[i] = i; /* 1〜9をランダムに並べる */ for( i = 1; i < 10; i++ ) { j = ran( 9 ) + 1; k = a[i]; a[i] = a[j]; a[j] = k; } /* ランダムなm桁の数を生成 */ k = 0; for( i = 1; i <= m; i++ ) k = 10 * k + a[i]; if( f == 1 ) printf("Number = %ld \n", k ); ihit = 0; n = 0; l = 1; while( !( (ihit == m) || ((5*m-n) <= 0) || (l <= 0) ) ) { printf(" Numbers = ? "); gets( b ); l = atol( b ); j = l; for( i = 1; i <= m; i++ ) { b[m-i+1] = (char) (j % 10); j = j / 10; } if( l == k ) { ihit = m; iblo = 0; } else { ihit = 0; iblo = 0; for( i = 1; i <= m; i++ ) { if( a[i] == b[i] ) { ihit++; } else { for( j = 1; j <= m; j++ ) { if( a[i] == b[j] ) { iblo++; } } } } } printf(" hit = %ld, blo = %ld \n", ihit, iblo ); n++; if( l <= 0 ) n = 5*m+1; } printf("\nScore = %ld", (5*m-n) ); if( (5*m-n) == 0 ) printf(" 修行が足りませんねぇ 本当は %ld でした\n", k); else if( l <= 0 ) printf(" ギブアップ! 答えは %ld です\n", k); else printf(" 終わりです\n"); } /**********************************************************************/ /* 関数名: void title( void ) */ /* 機能: タイトルを表示する */ /* 外部参照: */ /* 入力: */ /* 戻り値: */ /*--------------------------------------------------------------------*/ /* 備考: */ /**********************************************************************/ void title( void ) { printf("マスターマインド風数当てゲーム"); printf(" Version 0.40 (C) 1997 K.Ueno \n\n"); printf("$ kazuate [最大桁数2〜8] \n"); printf(" 指定された桁数を数を当てるゲーム。\n"); printf(" 少ない回数で当てるとOK!"); printf(" 数字は1〜9の数値が1回ずつしか出現しません\n"); printf(" 位置と数値の両方が当たったらHIT!"); printf(" 位置が間違っていて数字はあっている場合はBLO!"); printf(" と表示されます\n"); printf(" さぁれっつとらい!\n\n"); } /**********************************************************************/ /* 関数名: int ran( max ) */ /* 機能: 一様乱数を発生させる */ /* (max > 0) の場合の乱数発生範囲は 0〜(max-1) まで */ /* (max <= 0) の場合には内部変数を初期化する */ /* 外部参照: */ /* 入力: int max : 乱数発生範囲 */ /* 戻り値: int : 乱数 */ /*--------------------------------------------------------------------*/ /* 備考: 乱数の計算式は次の通り */ /* 16bit : R(n+1) = 12869 * R(n) + 6925 */ /* 32bit : R(n+1) = 843314861 * R(n) + 453816693 */ /**********************************************************************/ int ran( max ) int max; { static long r; if( max < 0 ) { time( &r ); r = r & 0x7fff; max = -max; } else if( max == 0 ) { r = 0; } r = (12869 * r + 6925) & 0x7fff; return( (int)((max * r) >> 15) ); } /**********************************************************************/ /* 関数名: void wait_for( isec ) */ /* 機能: 指定された秒数分だけウェイトする */ /* 外部参照: */ /* 入力: int isec : 指定時間 */ /* 戻り値: */ /*--------------------------------------------------------------------*/ /* 備考: */ /**********************************************************************/ void wait_for( isec ) int isec; { long v, t1, t2; time( &t2 ); for( v = 1; v <= isec; v++ ) { t1 = t2; while( t1 == t2 ) time( &t2 ); } } /* ========================== END OF FILE =========================== */