0

だから、これは私が書いたコードです。私はcで始まる大麦なので、我慢してください。私のコードは私には理にかなっていますが、正しく機能していません。再生を停止して平均を表示することにノーと言おうとすると、再生機能が繰り返されます。

基本的に、私のプログラムは、ユーザーが思いついた番号が何であれ、1 から 100 までのユーザー番号を推測します。アイデアを提供するために、間違った出力をいくつか示します。ゲームプレイ機能は正常に動作していますが、メインではありません。

Playing guess my number game 

is your number 50 ?=
Great!
Play again? (y for yes n for no): is your number 50 ?=
Great!
Play again? (y for yes n for no): is your number 50 ?n

など、私が間違った場所を見つけることができません。アドバイスはありますか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int playgame(void);
main() {
   int numberofplays = 0;
   float average = 0;
   int numberguesses = 0;

   printf("Playing guess my number game\n");
   printf("-------------------------------\n");
   bool play = true;
   int xtry = 0;
   int totaltries = 0;
   char answer;
   do {
       xtry = playgame();
       numberofplays++;
       totaltries = totaltries + xtry;
       printf("Play again? (y for yes n for no): ");
       answer = getchar();
       if(answer =='n')
                play = false;

    } while(play==true);

    average = (float)(totaltries/numberofplays);
    printf("average is %f tries per game\n",average);
    return 0;
} 
int playgame(void) {
    int guessnumber = 50;
    int xnumber = 25;
    int count=0;
    char x;
    bool stillguessing = true;

    while(stillguessing == true) {
        printf("is your number %d ?", guessnumber);
        x = getchar();

        if(x=='=') {
            count++;
            printf("Great!\n");
            stillguessing=false;
            return count;
        }
        else if(x == '<') {
            guessnumber = guessnumber - xnumber;
            xnumber = xnumber/2;
            if(xnumber<1) xnumber = 1;
            count++;
        }
        else if (x == '>') {
             guessnumber = guessnumber +xnumber;
             xnumber = xnumber/2;
             if(xnumber<1) xnumber = 1;
             count++;
        }
    }
}
4

2 に答える 2

2

この関数getcharは、ストリームから文字を取り出しますstdin

ストリームstdinには、標準入力デバイスに入力したすべてが含まれます。あなたの場合、これはキーボードです。

コンピューターの推測に応答するときは、2 つのキーを押します。を押し=てから を押しEnterます。

のコードは をplaygame処理しますが、 on=のままにします ... したがって、次の呼び出しはそれを引き出します。Enterstdingetchar

あなたがする必要があるのは、stdinストリームをフラッシュすることです。出力ストリームのfflush(stdin)場合と同様に、これには使用できません。fflush

代わりに、次のようなものを使用できます

void flushSTDIN() {
    while ((ch = getchar()) != '\n' && ch != EOF);
}

質問をする前に、バッファ内の古い改行を消去します。

これは、プログラム内のすべての呼び出しの前に行う必要がありgetcharます。

そう:

flushSTDIN();
printf("is your number %d ?", guessnumber);
x = getchar();
于 2013-02-06T00:36:54.777 に答える
1

あなたの問題はgetchar()、入力から1文字を消費していることです。ただし、応答を入力するとき、入力ストリームには常に少なくとも 2 つの文字が含まれます。入力する文字 ( など'=') と、それに続く改行 (または入力) 文字です。

これは関数ではそれほど重要ではありませんplaygame()(ただし、プロンプトはすべて 2 回出力されます)。

answer = getchar();

この呼び出しgetchar()は、入力した前の文字から残った改行を取得します。

これをどのように修正するかは、ユーザー入力をどのように処理するか (検証するかどうか、より長い文字列を入力できるようにするかどうかなど) の問題です。

あなたの場合、最も簡単な解決策は、への呼び出しをgetchar()空白を破棄するループに置き換えることです。

次のことをお勧めします。

プログラムの先頭 (またはその近く) に次の行を追加します。

#include <ctype.h>

これにより、isspace()文字が空白かどうかをクリーンかつ移植可能にチェックする関数が提供されます。

次の行を置き換えます。

answer = getchar();

と:

while (isspace(answer = getchar()))
    ;

同様に、

x = getchar();

と:

while (isspace(x = getchar()))
    ;

単一のセミコロンはnull ステートメントです。何か(この場合は何も) をループの本体に入れる必要があります。

x条件に/を代入するanswerことはしばしば嫌われますが、この特定のケースでは、これが最も慣用的な書き方です。

の不適切なマクロ実装はisspace()、呼び出しをgetchar() 複数回評価することによって問題を引き起こす可能性があることに注意してください。

于 2013-02-06T00:40:17.093 に答える