0015. 野球のカウント(C言語)

戻る

baseball.cのソースコード】


/*
 * 野球のカウントを数えるゲームのプログラム
 * baseball.c
 */
#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE 256





/*
 * 自作のbool型の定義
 */
typedef enum {
    false, /* 0 */
    true   /* 1 */
} bool;





/*
 * ユーザー定義関数の関数原型宣言
 */
void print_title(void);
void play(void);
void print_result(void);
bool retry(void);





/*
 * グローバル変数
 */
int ball, strike;





/*
 * メイン関数
 */
int main(void)
{
    while (1) {
        
        /* 表題・説明 */
        print_title();
        
        /* プレー */
        play();
        
        /* 結果の表示 */
        print_result();
        
        /* 操作を続けるかどうかの選択 */
        if (!retry())
            break;
    }
    return EXIT_SUCCESS;
}





/*
 * 表題・説明を表示する関数
 */
void print_title(void)
{
    strike = ball = 0;
    printf("【野球のカウントを数えるゲーム】\n");
    printf("打者としてプレーしてください。\n");
    printf("ただし、ヒットにはなりません。\n\n");
}



/*
 * プレーをする関数
 */
void play(void)
{
    char buf[BUF_SIZE], ch, zz;
    
    while (ball < 4 && strike < 3) {
        while (1) {
            printf("ボール(b)ですか、ストライク(s)ですか、");
            printf("ファウル(f)ですか? ");
            
            fgets(buf, sizeof buf, stdin);
            sscanf(buf, "%c%c", &ch, &zz);
            
            if (ch == 'b' && zz == '\n') {
                ball++;
                printf("%dボール、%dストライク。\n\n", ball, strike);
                break;
            } else if (ch == 's' && zz == '\n') {
                strike++;
                printf("%dボール、%dストライク。\n\n", ball, strike);
                break;
            } else if (ch == 'f' && zz == '\n' && strike < 2) {
                strike++;
                printf("ファウル。\n");
                printf("%dボール、%dストライク。\n\n", ball, strike);
                break;
            } else if (ch == 'f' && zz == '\n' && strike == 2) {
                printf("ファウル。\n");
                printf("%dボール、%dストライク。\n\n", ball, strike);
                break;
            } else {
                printf("無効な入力です。\n");
                printf("b、s、fのいずれかを入力してください。\n\n");
                continue;
            }
        }
    }
}



/*
 * 結果を表示する関数
 */
void print_result(void)
{
    if (ball == 4)
        printf("フォアボール。\n\n");
    else if (strike == 3)
        printf("ストライクスリー、バッターアウト。\n\n");
}



/*
 * 操作を続けるかどうかを選択する関数
 * true: 繰り返す、false: 終了する
 */
bool retry(void)
{
    bool ret;
    char buf[BUF_SIZE], ch, zz;
    
    while (1) {
        
        printf("\n続けますか?(y/n) ");
        
        fgets(buf, sizeof buf, stdin);
        sscanf(buf, "%c%c", &ch, &zz);
        
        if ((ch == 'y' || ch == 'Y') && zz == '\n') {
            printf("\n+++++\n\n");
            ret = true;
            break;
        } else if ((ch == 'n' || ch == 'N') && zz == '\n') {
            ret = false;
            break;
        }
        
        printf("無効な入力です。\n");
        printf("yまたはnを入力してください。\n");
    }
    return ret;
}


baseballの実行時画面表示】赤字はキーボードからの入力を表す。

C:\Users\skonishi\Documents>baseball
【野球のカウントを数えるゲーム】
打者としてプレーしてください。
ただし、ヒットにはなりません。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
1ボール、0ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? s
1ボール、1ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
1ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
2ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
2ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
3ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? s
3ボール、3ストライク。

ストライクスリー、バッターアウト。


続けますか?(y/n) y

+++++

【野球のカウントを数えるゲーム】
打者としてプレーしてください。
ただし、ヒットにはなりません。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? s
0ボール、1ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
0ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
1ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
1ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
2ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
2ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
3ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? f
ファウル。
3ボール、2ストライク。

ボール(b)ですか、ストライク(s)ですか、ファウル(f)ですか? b
4ボール、2ストライク。

フォアボール。


続けますか?(y/n) n


【参考サイト】
・北ソフト工房、C言語練習問題集(https://kitako.tokyo/lib/CExercise.aspx)。

戻る