-1

誰かが間違えるまで、1 から 9 までの数字を使った掛け算の質問を繰り返すゲームを作成しようとしています。それらが間違っている場合、プログラムは「oops」を表示するはずです。

私のコード:

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main ()
{

srand (time(NULL));
int a= rand()%9+1;
int b= rand()%9+1;
int c;


while (c == a*b)

{


cout<<a<<" * "<<b<<"= ";
cin>>c;

}


    cout<<"oops";

return 0;
}

私は2つの困難を抱えています。まず、同じ「乱数」がプログラムで生成されます。第二に、誰かがミスをした場合、「おっと」は表示されません。

助けてくれてありがとう。

4

2 に答える 2

1

ループの前にそれらを初期化し、ユーザーが応答したときにそれらを変更しないため、毎回同じ数値が表示されます。これを行うには、ループに (再) 入るたびに新しいランダム値を生成します。プログラムが即座に終了するため、おそらく「oops」は表示されません。これを修正するには、getch()終了する前にいくつかの入力を待つために使用できます。

私はあなたのコードを修正したので、それを調べて変更から学びましょう:

#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
    srand (time(NULL));
    int a = 0;
    int b = 0;
    int c = 0;
    while (c == a*b)
    {
        a= rand()%9+1;
        b= rand()%9+1;

        cout<<a<<" * "<<b<<"= ";
        cin>>c;

    }
    cout<<"oops";
    getch();//Get some input so program does not terminate instantly
    return 0;
}

ご不明な点がございましたら、お気軽にコメントを残してください。

于 2013-10-21T00:19:26.160 に答える
0

乱数ジェネレーターをシードする必要があります。そうしないと、毎回同じ乱数が得られます。一般的な方法は、次のように、プログラムの開始時に現在の時刻を乱数ジェネレーターにシードすることです。

srand(time(NULL));

あなたのプログラムは、行の直後に終了していcout << "oops"ます。デバッグ環境によっては、コンソールに配置しても最終的な出力が表示されない場合があります。最終的な出力もキャッシュされる可能性があります (すぐにコンソールに表示されません)。次のような新しい行を追加してみてください。

cout << "oops" << endl;

または、明示的な呼び出しを追加して、プログラムがすぐに終了しないようにします。(たとえば) Windows の Visual Studio では、次のようなコマンドを追加できます。

system("PAUSE");

return 0デバッグコンソールがすぐに消えないようにする前に。while (true) { /* do nothing */ }他の環境では「一時停止」は利用できませんが、デバッグ用のように最後に無限ループを置くことができます。

最後に、randは非常に優れた疑似乱数ジェネレーターとは見なされておらず、最近ではほとんどの人がrandom(およびsrandom(time(NULL))) もっと好きです。

于 2013-10-21T00:13:31.800 に答える