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;
}
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
No.2
- 回答日時:
プログラムをいきなりかきすぎているようですね。
仕様をまず検証して、構造を想定する方がよいですよ。
このプログラムでは、総当たりで判定するところまでできている
といえますが、それでは話が複雑になるようです。
1.乱数の発生(1~3)
2.人間の入力
3.判定
4.繰り返し+脱出条件
5.勝率判定
ぐらいでしょうか。
このうち1~3の一部は思想はどうあれかんせいしていますから
あとは繰り返しの構造と脱出条件を考えれば、なんとかなりますね。
「あいこである限りは自動的にじゃんけんを反復しなさい。」
と問題があるわけですから、繰り返し回数は不定回であると想定できる
ので、必然的に、while文をつかうことになりそうです。
ね!かんたんでしょ?
がんばってください
No.1
- 回答日時:
まずは、仕様に応じて機能を分割するところから始めて下さい。
「コンピュータがジャンケンの手をランダムに返す機能」とか
「コンピュータとユーザーの手を比較して勝敗を返す機能」とか
「累計勝利数などを保存する機能」とか
その他いろいろ関数プロトタイプだけ作って、main()関数を書き直しましょう。
main()関数が質問文に書いたよりも長くなったら機能分割が足りないと思いましょう。
回答ありがとうございます。正直、本当にC言語がさっぱりで、まったくわかんないんです。明日までの課題で、どうしても分からないのでよろしければ、教えてはいただけないでしょうか?すいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- その他(プログラミング・Web制作) 【Python初学者】以下コードについて教えていただきたいです 4 2023/04/19 13:01
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 プログラミング
-
printf で二進表示を行いたい。
-
unsigned int型について
-
scanfに文字が入力されたときに...
-
ヌメロンの対戦相手
-
C言語でマウス入力(クリックや...
-
コマンドラインに出力した文字...
-
円の面積を求めるプログラミン...
-
C言語についてです学籍番号、名...
-
4の倍数を論理演算で表す。。
-
printfのコードは?
-
三角形の判別
-
CPU温度・負荷等を調べるには
-
C言語 関数
-
【C言語教えてください】sin波...
-
LU分解法のピボット選択機能実...
-
cshの文字列操作(0埋め)
-
strcmp
-
パスカルの三角形についてのCプ...
-
プログラム(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報