• ベストアンサー

C言語について

C言語のじゃんけんゲームを作成したいのですが、 仕様は 1.利用者とコンピュータによる対戦形式とします。 2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。 3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。 4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。 5.連勝中の場合は「5連勝中!」などと表示させるようにしなさい。 6.あいこである限りは自動的にじゃんけんを反復しなさい。 7.勝敗がついた場合、利用者にまだ継続するか質問した上で、じゃんけんを反復させなさい。 8.じゃんけんを終了した場合、これまでの通算成績として、累積勝利数・引き分け数・敗北数のほか、勝利=累積勝利数÷(累積勝利数+累積敗北数)×100、および、最大勝利数を計算して表示しなさい。 という仕様のじゃんけんゲームを作成したいのですが、下記に書いているまでしかできません。誰か教えていただけないでしょうか。分からなくて困っています。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a,c; srand(time(NULL)); c = rand()%3+1; printf("手を入力してください [1:グー 2:チョキ 3:パー] "); scanf("%d",&a); if(a==1 && c==1) printf("あなたはグーで、私もグーでした。アイコです。\n"); else if(a==1 && c==2) printf("あなたはグーで、私はチョキでした。あなたの勝ちです。\n"); else if(a==1 && c==3) printf("あなたはグーで、私はパーでした。あなたの負けです。\n"); else if(a==2 && c==1) printf("あなたはチョキで、私はグーでした。あなたの負けです。\n"); else if(a==2 && c==2) printf("あなたはチョキで、私もチョキでした。アイコです。\n"); else if(a==2 && c==3) printf("あなたはチョキで、私はパーでした。あなたの勝ちです。\n"); else if(a==3 && c==1) printf("あなたはパーで、私はグーでした。あなたの勝ちです。\n"); else if(a==3 && c==2) printf("あなたはパーで、私はチョキでした。あなたの負けです。\n"); else if(a==3 && c==3) printf("あなたはパーで、私もパーでした。アイコです。\n"); else printf("正しい手を入れてください。\n"); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
noname#48699
noname#48699
回答No.3

>本当にC言語がさっぱりで、まったくわかんないんです。 ・そのような方には、ちょっとレベルの高い課題ですね。 ・なぞなぞを解くつもりで★楽しく課題に取り組んで。そしてなんといっても、数をこなすことです。 ★たしか、課題の締め切りは「過ぎて」いますよね。以降、参考になれば・・。 ・質問者様のソースには、ジャンケンの全ての組み合わせが書かれていますが、ちょっと工夫しました。 ・下のソースの★部分、考えて! ・参考URLに文字コード。 (趣味の問題:cgTe[]の c は char型、 g はグローバルのつもり) char cgTe[4][16] = { "0:未使用", "1:グー", "2:チョキ", "3:パー" }; void main() {  int a, c, user_win = 0, user_draw = 0, user_lose = 0, iRensyou = 0;  char cStr[256];  srand( time( NULL ) );  while( 1 ){   c = rand() % 3 + 1;   printf( "手を入力してください [1:グー 2:チョキ 3:パー] 4:おわり\n" );   scanf( "%s", &cStr );   if( 0x34 == cStr[0] ) break; // ★なぜ、()内が cStr[0] == 0x34 でないか   if( ( 0x31 > cStr[0] ) || ( 0x33 < cStr[0] ) ){    printf( "正しい手を入れてください。[%s]\n", cStr );    continue;   }   a = cStr[0] - 0x30; // ★文字列の先頭文字を数字へ   if( a == c ){ // アイコ    user_draw++;    printf( "あなたは %s で、私も %s でした。アイコです。\n", cgTe[a], cgTe[c] );    continue;   }   if( ( ( a + 1 ) == c ) || ( ( a - 2 ) == c ) ){ // 勝ち    printf( "あなたは %s で、私は %s でした。あなたの勝ちです。\n", cgTe[a], cgTe[c] );    user_win++;    iRensyou++;    if( 5 <= iRensyou ) printf( "%d連勝中です\n", iRensyou );    continue;   }   if( ( ( a - 1 ) == c ) || ( ( a + 2 ) == c ) ){ // 負け    user_lose++;    iRensyou = 0; // 連勝ストップ    printf( "あなたは %s で、私は %s でした。あなたの負けです。\n", cgTe[a], cgTe[c] );   }  }  printf( "あなたの勝ち %d 負け %d アイコ %d\n", user_win, user_lose, user_draw ); } (タブの代わりに全角空白を用いています。一括変換願います)

参考URL:
http://e-words.jp/p/r-ascii.html

その他の回答 (3)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.4
  • techa
  • ベストアンサー率60% (41/68)
回答No.2

プログラムをいきなりかきすぎているようですね。 仕様をまず検証して、構造を想定する方がよいですよ。 このプログラムでは、総当たりで判定するところまでできている といえますが、それでは話が複雑になるようです。 1.乱数の発生(1~3) 2.人間の入力 3.判定 4.繰り返し+脱出条件 5.勝率判定 ぐらいでしょうか。 このうち1~3の一部は思想はどうあれかんせいしていますから あとは繰り返しの構造と脱出条件を考えれば、なんとかなりますね。 「あいこである限りは自動的にじゃんけんを反復しなさい。」 と問題があるわけですから、繰り返し回数は不定回であると想定できる ので、必然的に、while文をつかうことになりそうです。 ね!かんたんでしょ? がんばってください

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

まずは、仕様に応じて機能を分割するところから始めて下さい。 「コンピュータがジャンケンの手をランダムに返す機能」とか 「コンピュータとユーザーの手を比較して勝敗を返す機能」とか 「累計勝利数などを保存する機能」とか その他いろいろ関数プロトタイプだけ作って、main()関数を書き直しましょう。 main()関数が質問文に書いたよりも長くなったら機能分割が足りないと思いましょう。

naoya1988
質問者

お礼

回答ありがとうございます。正直、本当にC言語がさっぱりで、まったくわかんないんです。明日までの課題で、どうしても分からないのでよろしければ、教えてはいただけないでしょうか?すいません。

関連するQ&A

  • C言語でのじゃんけん

    こんちには。 C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、 エラーメッセージが出てしまいうまくいきません。 どこがおかしいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k; printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n"); for(k=k; k<=10; k++) { srand(time(NULL)); j=rand()%3+1; scanf("%d",&i); if(i==1&&j==1) printf("私はグーなので、あいこです¥n"); else if(i==1&&j==2) printf("私はチョキなので、あなたの勝ちです¥n"); else if(i==1&&j==3) printf("私はパーなので、あなたの負けです¥n"); else if(i==2&&j==1) printf("私はグーなので、あなたの負けです¥n"); else if(i=2&&j==2) printf("私はチョキなので、あいこです¥n"); else if(i==2&&j==3) printf("私はパーなので、あなたの勝ちです¥n"); else if(i==3&&j==1) printf("私はグーなので、あなたの勝ちです¥n"); else if(i==3&&j==2) printf("私はチョキなので、あなたの負けです¥n"); else if(i==3&&j==3) printf("私はパーなので、あいこです¥n"); else printf("1か2か3を入力してください¥n"); } } OS mountain lionで利用中ですが、 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」 と表示されたまま、うまく動作しません。 教えてください。

    • ベストアンサー
    • Mac
  • プログラミング(じゃんけんゲーム)

    C言語をしています。 そこでわからない所がありのですが、解説お願いします。 作りたいのは、乱数を使ったジャンケン5回戦で、 一番最後に、何勝何敗何引き分けかを表示させ、 2人のうちどちらが勝ったかです。 最後の何勝何敗何引き分けかを どう書いたらいいかがわかりません。 関数のひきわたしみたいな感じでするというのはわかります。 できたところまでのプログラムが、以下のようなコードです。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a,c,i; printf("じゃんけんをしましょう。 (グー=1 チョキ=2 パー=3)\n"); for(i=i; i<=5; i++) { srand(time(NULL)); c = rand()%3+1; scanf("%d",&a); if(a==1 && c==1) printf("私もグー=1なので、あいこです。\n"); else if(a==1 && c==2) printf("私はチョキ=2なので、あなたの勝ちです。\n"); else if(a==1 && c==3) printf("私はパー=3なので、あなたの負けです。\n"); else if(a==2 && c==1) printf("私はグー=1なので、あなたの負けです。\n"); else if(a==2 && c==2) printf("私もチョキ=2なので、あいこです。\n"); else if(a==2 && c==3) printf("私はパー=3なので、あなたの勝ちです。\n"); else if(a==3 && c==1) printf("私はグー=1なので、あなたの勝ちです。\n"); else if(a==3 && c==2) printf("私はチョキ=2なので、あなたの負けです。\n"); else if(a==3 && c==3) printf("私もパー=3なので、あいこです。\n"); else printf("正しい手を入れてください。\n"); } return 0; }

  • 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; }

  • C言語初心者です。 ジャンケンゲーム

    今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。 // main.c #include <stdio.h> #include <time.h> //#include <time.h> #include "my.h" main(int argc, char* argv[]){ int i; char s[7]; printf("これはジャンケンゲームです。\n"); printf("手を入力します(グー:1 チョキ:2 パー:3)\n"); scanf("%s",&s[7]); srand((unsigned)time(NULL)); printf("%s\n",jyan(dice(3))); if(s == jyan){ printf("あいこです。\n"); }else if(s == 1 && jyan ==2){ printf("あなたの勝ちです。\n"); }else if(s == 2 && jyan == 3){ printf("あなたの勝ちです。\n"); }else if(s == 3 && jyan ==1){ printf("あなたの勝ちです。\n"); }else{ printf("コンピュターの勝ちです。\n"); } } // dice.c #include <time.h> int dice(int n){ srand((unsigned)time(NULL)); return(rand()%n+1); } // jyan.c char *jyan(int n){ static char s[][7]={"グー","チョキ","パー"}; return s[--n]; } // my.h #include <stdio.h> char *jyan(int hand); //int dice(int n); 見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。 長文になってしまい申し訳ありません。

  • 何かおかしい?

    ソース何かおかしいですか? #include <stdio.h> #include <time.h> #include <stblib.h> //ジャンケンゲーム実行 (繰り返しなし) main () { int player = 0, computer; //乱数の種をまく srand(time(NULL)); printf("【ジャンケンゲーム】\n"); //プレイヤーの入力 printf("ジャンケン・・・(グー:1チョキ:2パー:3を入力) > "); scanf("%d", &player); //コンピュウターの手の入力 computer = rand()%3 + 1; printf("コンピュータは"); if(computer == 1) {printf("グー"); } else if(computer == 2) { printf("チョキ");} else if(computer == 3) { printf("パー");} printf("! "); //勝敗の判断と結果表示 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"); } return 0; }

  • C++ scanfで止まらない

    いつもお世話になっております。 最近C++を勉強し始めたばかりで、初心者丸出しの質問になってしまうと思うのですがひとつよろしくお願いします。 本を見ながらじゃんけんゲームを作っていて、サンプルとは別に自分で考えて作ってみたのですが、scanfの挙動がどうも思い通りにいきません。 以下がソースです。 int testJanken() {     int player=0;     int computer;     printf("【じゃんけんゲーム】\n");     printf("じゃんけん・・・(グー:1 チョキ:2 パー:3 終了:9)>");     scanf("%d",&player);    //入力受付     while(player!=9)     {         if(0<player&&player<=3)         {             printf("\nあなたは:");             showTe(player);                          srand(time(NULL));             computer=rand()%3+1;             printf("コンピューターは:");             showTe(computer);             showShouhai(player,computer);         }         else         {             printf("\n----------1~3,または9の値を入れてください!---------\n");         }         printf("\nじゃんけん・・・(グー:1 チョキ:2 パー:3 終了:0)>");         player=0;         scanf("%d",&player);    //入力受付     }     printf("\nバイバイー!!");     return 0; } //勝敗決定表示 int showShouhai(int player, int computer) {     if(player==computer)     {         printf("あいこ!\n");         return 0;     }     else if((player+1==computer)||(player-2==computer))     {         printf("あなたの勝ち!\n");         return 1;     }     else     {         printf("コンピューターの勝ち・・・\n");         return 2;     } } //入力値からグーチョキパーを文字列で表示させる int showTe(int su) {     switch(su)     {         case 1:             printf("グー!\n");             break;         case 2:             printf("チョキ!\n");             break;         case 3:             printf("パー!\n");             break;         default:             printf("???\n");             break;     }     return 0; } 【実現したい仕様はこちら】 1)じゃんけんの手(1,2,3のどれか)を入れれば通常通りじゃんけんが行われ、結果が表示される。 2)9が入力されたら終了 3)1,2,3,9以外が入力されたらメッセージの表示 この3がうまくいきません。 制御できないのは文字を入力した場合なのですが、例えばaと入力するとそれ以降永久ループとなり抜け出せなくなってしまいます・・・ ネットであちこち原因を調べてみたのですが、探し方が悪いのか解決策がわかりません・・・ 今後の勉強のためにも原因と解決策を詳しく教えて頂けると嬉しいです。 よろしくお願いします。

  • 10回じゃんけんの確率計算

    モバゲーにて、10回じゃんけんを同時にして合計6勝以上したら、景品がもらえるという遊びがはやっています。 そこで6勝以上する確率の計算法もしくは、6勝以上する確立を教えていただけないでしょうか? 相手「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」 自分「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「パー」「グー」 このように10回じゃんけんを一度に出し、合計の勝利数で決まります。二人同時に手をだします。 この例だと、自分が6勝です。 あいこは、勝ちには入りませんので、負けと同じ扱いです。 説明不十分かと思いますので、対戦例を2点かきます。 相手「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「チョキ」 自分「グー」「チョキ」「チョキ」「グー」「チョキ」「グー」「チョキ」「グー」「パー」「グー」 ↑これは、自分が、5勝です。 相手「グー」「グー」「グー」「グー」「グー」「グー」「グー」「グー」「グー」「グー」 自分「パー」「パー」「パー」「パー」「パー」「パー」「パー」「パー」「パー」「パー」 ↑これは自分が10勝です。 じゃんけんの手は、二人とも、同時に10手だします。6連勝じゃなく、負けても、何度目で勝ってもいいので、6回以上かてた時の確率を知りたいです。

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • じゃんけんゲームをつくったのですが・・・。

    自分でじゃんけんゲームを作ってみたのですが、他の人のソースで どういう風に組んでいるのか研究したいのでソースお願いします。 後、もっとこういう風にした方がいいとおもう所があればおねがいします。 <ソース> #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; int n; srand(time(NULL)); n=rand()%3; printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n"); printf("じゃんけんぽい!"); scanf("%d",&i); if(i==0&&n==0){ printf("あいこです\n"); } else if(i==0&&n==1){ printf("勝ちました\n"); } else if(i==0&&n==2) { printf("負けました\n"); } if(i==1&&n==0){ printf("負けました\n"); } else if(i==1&&n==1){ printf("あいこです\n"); } else if(i==1&&n==2) { printf("勝ちました\n"); } if(i==2&&n==0){ printf("勝ちました\n"); } else if(i==2&&n==1){ printf("負けました\n"); } else if(i==2&&n==2){ printf("あいこです\n"); } if(i>2) { printf("やりなおしてください\n"); } return 0; }

  • 確率の問題がわかりません。

    A,B,Cの三人で次のようなじゃんけん競技を行う。 ・皆グー,チョキ,パーを任意に出すが,グーはチョキに勝ち,パーはグーに勝つ。 ・全員が同じものを出せばアイコ(勝負がつかない)。また,グー,チョキ,パーが出揃ってもアイコ。 ・まけた人はその場ではずれ,残った人でじゃんけんを行う。 ・じゃんけんは何回でもできるものとし,勝ち残った者が一人になれば,その人が優勝となる。 (1)最初のじゃんけんでアイコになる確率は? (2)Aが二回目で優勝する確率は? (3)Aが三回目で優勝する確率は? (4)Aがn回目で優勝する確率をPnとすると、Pnは? (5) (4)より、Aが優勝する確率Σ(∞)(n=1)Pnは? ただし,0<a<1のとき,lim(n→∞)na^n=0である。 わかる方、全問でなくてもいいので、解き方を詳しく教えていただけたら幸いです。お願い致します。

専門家に質問してみよう