2

私は文字通り 1 日前に C++ を始めましたが、じゃんけんゲームを作成しようとして問題が発生しました。このコードは、完成したときの外観とはまったく異なりますが、私の問題を示すためにこれを作成しました。

私は brps を作成しました。これは、bot じゃんけん、つまり 1 から 3 までの乱数であり、対応する数字がボットが選択したアイテムを示す cout になります。

コードの rand 部分は、さまざまなフォーラムや以前の質問への回答を参照して作成されましたが、うまくいかないようです。プログラムを実行するたびに、何をしても「ボットが岩を選んだ」と表示されます。ただし、if ステートメントを削除して単純に brps を出力すると、毎回乱数が表示されます。したがって、ランドが選択する数によってその選択を定義する必要があるときに、プログラムが毎回岩を選択する理由を理解するのに助けが必要です。

コードの他の部分についても自由にコメントしてください。

編集: urps は、ユーザーが回答を入力する場所です。この例では使用しませんでした。

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

using namespace std;

int main()
{
    cout<<"Hi! Welcome to ROCK PAPER SCISSORS!\n";
    cout<<"To play, press enter.\n";
    cin.get();
    system("cls");

int game();
{
    srand(time(NULL));
    int brps = rand()>>4, urps;
    brps = brps % 3 + 1;


cout<<"Bot chose ";
if (brps = 1){
    cout<<"the rock.\n";}

else if (brps = 2){
    cout<<"the paper.\n"; }

else if (brps = 3){
    cout<<"the scissors.\n"; }

else{
    cout<<"invalid.\n.";}

cin.get(); 
}

}
4

5 に答える 5

1

値 1 を割り当てて値を返す=if ステートメントで代入演算子を使用します。brpstrue

==代わりに演算子を使用してください。

ところで:あなたはあなたのgame();.

編集:

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

using namespace std;

int game(); // This one declares the subroutine game()

int main()
{
    int exit; /* 0 to continue, something else to exit the game */
    cout<<"Hi! Welcome to ROCK PAPER SCISSORS!\n";
    cout<<"To play, press enter.\n";
    cin.get();
    system("cls");
    do { // This block will execute at least once
        exit = game(); // This one calls the subroutine game()
    } while (exit == 0); // ...and will execute again and again until exit != 0
    return 0; // Or something useful
}

int game() // This implements the subroutine game()
{
    srand(time(NULL));
    int brps = rand()>>4, urps;
    brps = brps % 3 + 1;


    cout<<"Bot chose ";
    if (brps == 1) {
        cout<<"the rock.\n";
    } else if (brps == 2) {
        cout<<"the paper.\n";
    } else if (brps == 3) {
        cout<<"the scissors.\n";
    } else{
        cout<<"invalid.\n.";
    }

    cin.get(); 
    if (some_kind_of_exit_condition) {
        return 1; // results in exit == 1
    }
    return 0; // results in exit == 0
}

あなたのコードで私が変更したこと:

コード内の行int game();は、関数呼び出し (構文が無効になるため) でも実装 ( のため) でもありません;。その行の後ろの中かっこは、コード内のブロックを開くだけです。このブロックは必須ではありません (ただし、禁止されているわけではありません)。私はあなたが書きたいと思うものにコードを変更しました:

  1. コンパイラが呼び出しを検証できるようにするint game();サブルーチンを定義する行を最初に追加しました(2.)。game()
  2. game();1で定義したサブルーチンを実際に呼び出す行を追加しました。
  3. 以下のブロックのサブルーチン実装を作成するために、;後を削除しました。int game();
  4. 末尾の を削除し}、 の末尾に移動しましたmain()
  5. とルーチンreturnの両方の最後にステートメントを追加しました。maingame
  6. に変更=しました==
  7. ループを追加しました

system("cls")また、はそのような呼び出しが存在するシステムでのみ機能することに注意してください。これは、プラットフォームに依存し、少なくとも 1 つの新しいプロセス (おそらくそれ以上) を生成するため、あまり良いコードではありません。出力ストリームの抽象モデルでは、出力がファイルまたはプリンターである可能性があるため (たとえば、出力リダイレクトを使用してプログラムを呼び出した場合)、明確な画面はありません。

画面をクリアしたい場合、これは標準出力メカニズムでは実行できません (改行の束を出力することを除いて - 画面をクリアするために何行書き込む必要があるかわからないため、これはあまり良くありません)。もっとうまくやりたい場合は、Win32 コンソール API または libncurses を使用できます。これらのライブラリを使用すると、標準ライブラリが提供する抽象的な行出力の代わりに、ビジュアル ターミナルを制御できます。標準出力は単純ですが、これらのライブラリは単純ではないため、引き続き使用することをお勧めしclsますが、後で c++ に慣れてきたら変更することを忘れないでください。

于 2013-07-10T05:56:28.767 に答える
0

このページでは、rand()、srand() などを使用したランダム化の基本について説明します。一見の価値があるかもしれません。

さらに、比較==では代入演算子 ( ) ではなく、=比較演算子 ( ) を使用する必要がありますif。using=は実際に値を設定および変更し、結果がゼロ以外の値に割り当てられるため、比較は毎回真になります。この理由により、最初の if-comparison チェックは毎回成功するため、他のテストは実行されず、毎回ロックがかかります。

于 2013-07-10T05:57:31.970 に答える
0

また、可能な限り真の乱数に近づけるには、乱数ジェネレーターに変化する数をシードする必要があることにも注意してください。srand(time(0)); これは、乱数の実際の呼び出しの前の任意の場所に配置できます。

また、#include <ctime>time(0) を呼び出せるようにする必要があります。

于 2014-09-20T19:25:35.717 に答える