トップ

C言語とJava のプログラミング講座 cClip  【プログラミングTips

数字当てゲーム ヒント追加、scanf 改善版プログラム例

  ( クイズ出題ページ へ)
#include <stdio.h>
#define DIGITS 4   /* けた数 */
#define TRUE  1
#define FALSE 0

void createRandomNumber(char[]);
int isValidNumber(char[]);
void GuessNumber();
int isMatch(char[], char[]);
void HighOrLow( char[], int );

void GuessNumber(){
    char target[DIGITS + 1];   /* 目標数の保存領域 */
    char num[DIGITS + 1];      /* 推測数の保存領域 */
    int count = 0;             /* 推測回数 */
    int n;
    char fmt[8];

    sprintf( fmt, "%%%ds", DIGITS );
    createRandomNumber(target);   /* 目標数の生成 */
    do{
        if( count >= DIGITS && count%DIGITS == 0 ) {
            printf( "1桁だけHigh(5〜9)かLow(0〜4)か教えます。どの桁(1〜%d)?:", DIGITS );
            scanf( "%d", &n );
            HighOrLow( target, n );
        }
        printf("[%d回目] 各けたが異なる%dけたの数を入力してください:",
                                                    ++count, DIGITS);
        scanf(fmt, num);
        while( isValidNumber(num) == FALSE ){
            printf("入力が正しくありません。再度入力してください:");
            scanf(fmt, num);
        }
    }while( isMatch(target, num) == FALSE );
}

int isMatch(char target[], char num[]){
    int i, j, numHit = 0, numBlow = 0;

    for(i = 0; i < DIGITS; i++){
        for(j = 0; j < DIGITS; j++){
            if(target[i] == num[j]){
                if(i == j){
                    numHit++;
                } else {
                    numBlow++;
                }
            }
        }
    }
    if(numHit == DIGITS){
        printf("正解です。\n");
        return TRUE;
    }
    printf("%sは%dHit,%dBlowです。\n\n", num, numHit, numBlow);
    return FALSE;
}

/* ------ 以下は当社が追加したコード ------ */
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
int isValidNumber(char num[]) {
    int i, j;

    for( i = 0; isdigit(num[i]); i++ );
    if( i != DIGITS ) return FALSE;

    for( i = 0; i < DIGITS - 1; i++ ) {
        for( j = i + 1; j < DIGITS; j++ ) {
            if( num[i] == num[j] ) return FALSE;
        }
    }
    return TRUE;
}

void createRandomNumber(char num[]) {
    int i;

    num[DIGITS] = '\0';
    do {
        for( i = 0; i < DIGITS; i++ ) {
            num[i] = '0' + rand()%10;
        }
    } while( isValidNumber( num ) == FALSE );
}

void HighOrLow( char target[], int digit ) {
    if( digit < 1 || digit > DIGITS ) {
        printf( "桁数指定が間違っています\n" );
        return;
    }
    if( target[digit-1] >= '5' ) printf( "Highです\n" );
    else printf( "Lowです\n" );
}

main()
{
    srand( time(NULL) );
    GuessNumber();
}

 青文字が追加変更部分です。
 HighOrLow のヒントは、DIGITS 回ごとに表示されるようにしています。

[ 閉じる ]