dポイントプレゼントキャンペーン実施中!

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

A 回答 (4件)

>本当に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
    • good
    • 0

同様の質問がありました。



http://www.play21.jp/board/formz.cgi?action=res& …
    • good
    • 0

プログラムをいきなりかきすぎているようですね。


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

まずは、仕様に応じて機能を分割するところから始めて下さい。


「コンピュータがジャンケンの手をランダムに返す機能」とか
「コンピュータとユーザーの手を比較して勝敗を返す機能」とか
「累計勝利数などを保存する機能」とか

その他いろいろ関数プロトタイプだけ作って、main()関数を書き直しましょう。
main()関数が質問文に書いたよりも長くなったら機能分割が足りないと思いましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/19 23:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!