• 締切済み

c++によるジャンケンプログラム

c++でジャンケンゲームを作ろうと考えています。 参考書やサイトを参考に、ジャンケンするだけのプログラムは作れたのですが、 (1)コンピュータの第1手は乱数 (rand()といったものです) (2)2手目以降は、それまでに出した手を記憶し、各手の確率を計算してもっとも勝率の高い手を出す といった条件での作製方法が分かりません。 条件に合うプログラムか、ヒントを頂きたく思います。

noname#137787
noname#137787

みんなの回答

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

>(1)コンピュータの第1手は乱数 srandとrandで乱数が得られます。 http://www2.ocn.ne.jp/~mochi/menu/c/c14.html それを(int)(rand()%3)すれば0-2の数字が得られます。 あとはグー、チョキ、パーに割り当てれば完了です。 >(2)2手目以降は、それまでに出した手を記憶し、 グー、チョキ、パーを配列の添字0,1,2だとして、配列の値をインクリメント(+1)していけば良いです。 あとはif文を使って、もっとも多く出された手を計算してください。

関連するQ&A

  • 多人数のじゃんけんプログラム

    多人数でのじゃんけんプログラムを作成しています。 設定としては、 自分とコンピュータのじゃんけん大会 コンピュータの参加人数は最大で10人、 コンピュータの参加人数は自分で任意選択(1~10人)、誰か参加するかはランダム 出す手は、(自分の手→任意に選択)(コンピュータの手→参加者ごとにランダムで設定) 自分・コンピュータ(1~10)に固有の名前を与えてそれぞれの勝ち数をカウントする じゃんけん終了後、買った回数順に順位をつけて、1位から順に表示する。 ↑のようなプログラムを作成したいと思っております。 私が悩んでいる点は、じゃんけんの結果判定の方法と勝ち数ごとの順位付け・並び替えの方法です。(全部ですね・・・) 結果の判定方法は、 場に出ている手が2種類なら(勝ちか負け)、1種類・3種類なら(あいこ)とし、 2種類の場合には、出ている手と比較し勝敗判定を行う、 という形がいいのかなと思ってます(javaでどう書けばいいのかはわかりません--;) 並べ替えは、配列をうまく使えばいけるでしょうか? ネットやテキストなどで学習中ですが全体的にわからない点が多く、 考え方(結果判定・順位付け&並び替え)やソースサンプルなどお教えいただけると嬉しいです。 どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Java
  • Cプログラミング

    授業で次のような課題が出されたのですが、うまく結果表示が出来なくて困っています。自分が1で相手が2なのに自分の負け。と出てしまったり・・・ そのようなプログラムを書けばよいのでしょうか? お答えよろしくお願いします。 乱数を使って計算機とジャンケンをするゲームを作成せよ。グーは“0”、チョキは“1”、パーは“2”として、人間の出す手はキーボードからの数値(0か1か2)入力を、計算機の出す手は乱数(0〜2の整数)を用いることとする。その勝敗を判定し、結果を表示させるようにすること。

  • Aさん、Bさんがじゃんけんした時にAさんが負けない

    Aさん、Bさんがじゃんけんした時にAさんが負けない確率は?という問題の解説に 「Aさんが負けない確率を計算してみると、6/9=2/3となります。あいこも考えるとふたりでじゃんけんをした時に1回手を出しただけで負ける確率は3分の1」 という風に書いていたんですが、なんであいこも考えると1回手を出しただけで負ける確率は3分の1になるんでしょうか? あいこが出ることによって負けるってよくわからないんですが・・

  • ジャンケンのプログラムについて

    ジャンケンのプログラムについて #include <stdio.h> #include <stdlib.h> int main(void) { int a; int b; int i; srand((unsigned)time(NULL)); ////////////human printf("gu=1,cho=2,pa=3"); scanf("%d",&b); ///////////computer a=rand() % 3 + 1; if(a==1) {printf("gu");} if(a==2) {printf("cho");} if(a==3) {printf("pa");} /////////// if(a==b){printf("aiko");} /////////// if(b==1 && a==3) {printf("win! pc");} if(b==2 && a==1) {printf("win! pc");} if(b==3 && a==2) {printf("win! pc");} /////////// if(a==1 && b==3) {printf("win! human");} if(a==2 && b==1) {printf("win! human");} if(a==3 && b==2) {printf("win! human");} } このプログラムを実行したんですが、できませんでした。 どこか間違ってますか? また、なんで、printfの中身は("gu=%d,",a)というふうにしないんでしょうか? また、srand((unsigned)time(NULL))は何をしてるんですか? また、scanf("%d",&b)はなんですか? あと、a=rand() % 3 + 1はなんですか? すべて意味が分りません。 なんでこういう順でプログラムしないといけないんでしょうか? printf("gu=1,cho=2,pa=3")は出力されるときどのようになるんでしょうか? なんでprintf("gu=1,cho=2,pa=3")が必要なんですか? 実効がどのように行われているのか全過程をお願いします。

    • ベストアンサー
    • Mac
  • 確率の問題(じゃんけん)

    確率の問題で困っています。 3人でじゃんけんをして、ちょうど2回目で1人の勝者が 決まる確率はいくらか。ただし、1度負けた者はその後 のじゃんけんはしないものとし、3人がグー、チョキ、 パーを出す確率はいずれも1/3である。 私の考え 2回目で1人の勝者が決まるケースは、△をあいことし、 △○、×○、××の3パターン。×○と××は表裏一体 なので、計算する必要があるのは△○と×○。 △○の計算は、△が9/27。○が3/3×2/3×2/3=4/9。 ×○の計算は、×が2/3×3/3×3/3。○が3/3×2/3。 ○や×の場合、勝者(敗者)の出す手が決まれば、 同時に残り者の出す手は限られるので、このよう な式をたてました。 テキストの解説 △○の計算は、△が9/27=1/3。○が9/27=1/3。 ×○の計算は、9/27=1/3。6/9=2/3。 いつものことですが、こう解けばいいのかもしれ ない、ああ解けばいいのかもしれないと考え、ピ ピーンとくるものがありません。勉強しても勉強 しても解けるようになりません…。

  • C言語 じゃんけんゲーム 急いでいます

    じゃんけんゲームを作成しましたが 以下のプログラムに ・コンピュータ(CP)の手を記録し一つ前と同じ手を出さずにランダムで手を出す (例:前回CPがパーなら、今回CPはチョキかグーをだす) ・あいこの場合次のじゃんけんで同じ手を再び出す (例:今回CPもプレイヤーもグーの場合は次のじゃんけんでCPはグーを出す) という2つを追加したいのですが恐縮ですが 私ならこう、という模範解答をお願いします… #include <stdio.h> int main() { int i,n; int player; int computer; //勝敗数変数 int p_kati, p_make,p_draw; int q_kati=0, q_make=0,q_draw=0; //繰り返し条件 do { //変数の初期化 p_kati=0; p_make=0; p_draw = 0; //タイトル printf("あなたが出した手は・・・\n"); //乱数の初期化 srand(time(NULL)); //最低5回繰り返す for(i=1; i<=5; i++){ //コンピュータの手 computer = rand() %3; //プレイヤーの手を表記 printf("(グー: 0 チョキ: 1 パー: 2)→ "); do{ scanf("%d", &player); //プレイヤーの手 if(player<0 || 2<player){ //0、1、2以外を入力すると printf("もう一度入力してください");//これを表示 } }while(player<0 || 2<player);//0、1、2を入力で下記を実行 //勝ち負けの判定 if(player==0 && computer==0){ printf("playerも私もグーでした…引き分けです\n"); p_draw++; } else if(player==0 && computer==1){ printf("playerはグーで、私はチョキです…あなたの勝利です\n"); p_kati++; } else if(player==0 && computer==2){ printf("playerはグーで、私はパーです…あなたの負けです\n"); p_make++; } else if(player==1 && computer==0){ printf("playerはチョキで、私はグーです…あなたの負けです\n"); p_make++; (全パターン長いので省略) else if(player==2 && computer==2){ printf("playerも私もパーでした…引き分けです\n"); p_draw++; } } //結果表示 printf("%d 勝 %d 敗 %d 引き分けでした。\n",p_kati,p_make,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、続けない場合は -1 を入力してください > "); scanf("%d", &n); //トータル点数を計算 q_kati += p_kati; q_make += p_make; q_draw += p_draw; //n(入力された数字)が-1以外なら続ける }while(n != -1); printf("トータルで %d 勝 %d 敗 %d 引き分けでした。\n",q_kati,q_make,q_draw); return 0; }

  • 3人でじゃんけんをするときの確率

     3人でじゃんけんをするとき、2人が勝つ確率がよくわかりません・。 (参考書の解説~) 3人の手の出し方はグーチョキパーのいずれかなので3*3*3=27通り じゃんけんは、誰がどの手で、と考えるため(この解説の部分がよくわかりません)勝つ2人を選んで、3C2=3通り この2人が、どの手で勝つかを考えると、2人が グーで、一人がチョキ、2人がチョキで、1人がパー、2人がパーで、1人がグーより、3通り。 よって、3*3/3*3*3=1/3

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • じゃんけんゲームについてお願いします。

    #include <stdio.h> #include <stdlib.h> int main() { int n; int player; // プレイヤーの手の保存 int computer; // コンピュータの手を保存 srand(0); // 乱数列を初期化 do { printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > "); scanf("%d", &player); computer = rand() % 3 + 1; if(computer == player){ printf("あいこです\n"); }else if(player == 1 && computer == 2){ printf("プレイヤーの勝ちです\n"); }else if(player == 2 && computer == 3){ printf("プレイヤーの勝ちです\n"); }else if(player == 3 && computer == 1){ printf("プレイヤーの勝ちです\n"); }else{ printf("コンピュータの勝ちです\n"); } printf("このまま続けますか?続けない場合は 0 を入力してください > "); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このじゃんけんプログラムで一番最初に何回勝負するか指定出来るようにしたいのですが。 指定しただけ勝負して、最後に勝ち、負け、引き分けの結果を。 お願いいたします。

  • エクセルで0超1未満の乱数を発生する方法

    タイトルの通りです。 EXCELのRAND関数は0以上1未満の乱数を発生しますが、0超1未満の乱数を作る方法を教えて下さい。 確率の検証用に乱数を作りたいのですが、0や1(0%や100%)は除きたいのです。もちろん非常に小さい数でも0でなければ採用したいのですが0だけはダメです。 実用上、RANDでも0は殆ど出ないとは思いますが…あるいは乱数を発生させておいて0になった時だけ再計算させれば良いのかもしれませんが、出来れば再計算無しで最初からそうしたいのです。

専門家に質問してみよう