質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • C

    4005questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • if

    220questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

  • while

    83questions

    Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

  • Switch

    20questions

繰り返しの表現の追加

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 324

合計得点が21点以上の時か10回じゃんけんをしたときにプログラムを終了する。という条件を付けくわえたいです。
どのように表現すればいいのかアドバイスください。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int a = 0, b = 0;
    int points_a = 0;
    int points_b = 0;
    int turns = 0;
    char inputs[][10] = { "Rock","Scissors","Paper" };

    for (turns = 0; turns < 10; turns++) {
        while (1) {
            printf("Input for game number %d: ", turns + 1);
            scanf("%d %d", &a, &b);
            if (a < 1 || a>3 || b < 1 || b>3)
                printf("Invalid input(Rock:1,Scissors:2,Paper:3),please try again:\n\n");
            else
                break;
        }
        printf("A plays %s,B plays %s: ", inputs[a - 1], inputs[b - 1]);

        if (a == b) {
            printf("draw.\n");
        }
        else if ((a == 1 && b == 2) || (a == 2 && b == 1)) {
            printf("%c wins and gets 1points.\n", (a < b ? 'A' : 'B'));
            if (a < b)
                points_a += 1;
            else
                points_b += 1;
        }

        else if ((a == 1 && b == 3) || (a == 3 && b == 1)) {
            printf("%c wins and gets 5 points.\n", (a > b ? 'A' : 'B'));
            if (a > b)
                points_a = 5;
            else
                points_b = 5;
        }
        else if ((a == 2 && b == 3) || (a == 3 && b == 2)) {
            printf("%c wins and gets 2 points.\n", (a < b ? 'A' : 'B'));
            if (a > b)
                points_a += 2;
            else
                points_b += 2;
        }
        else {
            printf("Unknown error\n");
            return -1;
        }

        printf("Current number of points: A - %d, B - %d. \n\n", points_a, points_b);

        if (points_a >= 21 || points_b >= 21)
            break;
    }
    if (points_a == points_b) {
        printf("Draw(points:A %d,B %d)\n", points_a, points_b);
    }
    else {
        printf("\nWinner: %c (points: A %d, B %d)\n", (points_a > points_b) ? 'A' : 'B', points_a, points_b);
    }
    return(0);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+1

こんにちは、
プログラムの都合上 Rock: 0, Scissors: 1, Paper: 2にしております。

ジャンケンの判定をするところですが
重要になってくるのが(user1の手 - user2の手 + 3) % 3です。この値をResult_numと名づけることにします。例えば、

user1の手 user2の手 結果 Result_num
Rock Rock Draw 0
Rock Paper user1 lose 1
Scissors Paper user2 win 2

のようになります。
これを使うとif文やswitch文を使わなくても判定できます。
質問欄に書いてあるソースには与えられる点数が
Rockで勝ったら1点、Scissorsで勝ったら2点、Paperで勝ったら5点にしてあるますが、
今回の説明では(それぞれの手 + 1) * 2にしております。(これでif文は不要)
適宜if文などで変更こともできますが、
ソースが煩雑になるため、このような形にしました。
また、判定の文字(win,lose,draw)は

char result_text[3][15] = {"Draw","user1 Lose","user1 Win!!"};


にすることで番号指定で文字を表示することができます。

私が書いたソースコードを載せておきます。

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 256
#define HAND 3

int main(void)
{

    char buf[BUFSIZE];
    char result_text[HAND][20] = {"Draw","user1 Lose","user1 Win"};
    char hand[HAND][10] = {"Rock","Scissors","Paper"};
    int i;
    int count = 0;
    int user_hand[2];
    int user_point[2] = {0,0};
    int result_num;
    int result;

    while(1){
        printf("%d回目",count + 1);
        printf("Rock : 0 , Scissors: 1, Paper : 2\n");
        for(i = 0; i < 2; i++){
            do{
                fgets(buf,sizeof(buf),stdin);
                user_hand[i] = atoi(buf);
                if(user_hand[i] < 0 || user_hand[i] > 2){
                    printf("再入力してください。\n");
                }
            }while(user_hand[i] < 0 || user_hand[i] > 2);
        }

        result = (user_hand[0] - user_hand[1] + 3) % HAND;
        printf("user1:%s user2:%s\n",hand[user_hand[0]],hand[user_hand[1]]);

        printf("%s \n",result_text[result]);

        if(result != 0){
            user_point[result - 1] += (user_hand[result - 1] + 1) * 3;
        }

        printf("user1:%d user2:%d\n",user_point[0],user_point[1]);
        count++;
        if(count >= 10){
            break;
        }
        else if(user_point[0] >= 21 || user_point[1] >= 21){
            break;
        }
    }
    printf("終了\n");
    printf("user1の点数:%d user2の点数:%d\n",user_point[0],user_point[1]);
    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 11:16

    while文の条件文は少し複雑なのでとりあえずwhile(1)にして、while文の中で
    条件を満たしたらbraek文で終える形にしました。

    キャンセル

  • 2018/04/29 11:31

    AもBも自分で入力した値でじゃんけんをしたいです。
    実行結果は以下のようにあらわしたい場合はどうすればいいですか?

    Input for game number 1: 3 1
    A plays Paper, B plays Rock: A wins and gets 5 points.
    Current number of points: A - 5, B - 0.

    Input for game number 2: 5 1
    Invalid input (Rock: 1, Scissors: 2, Paper: 3), please try again:

    Input for game number 2: 2 2
    A plays Scissors, B plays Scissors: draw.
    Current number of points: A - 5, B - 0.
       (shortened)
    Input for game number 10: 3 2
    A plays Paper, B plays Scissors: B wins and gets 2 points.
    Current number of points: A - 17, B - 13.

    Winner: A (points: A 17, B 13)

    キャンセル

  • 2018/04/29 12:28

    訂正しました。

    キャンセル

  • 2018/04/29 12:29

    printf("Current number of points: A - %d B - %d",A_score,B_score);と書くのはどうですか?

    キャンセル

+1

「合計得点が21点以上の時か10回じゃんけんをした」時にプログラムを終了するのですから、それぞれの条件がどうなるかを書き出しましょう。つまり、

  • 合計得点が21点以上
  • じゃんけんを10回した

という条件を書き出してください。そのためには、合計得点じゃんけんの回数を保持するようにしましょう。今のところ、これを保持する変数や処理はないですよね。まずはそれを用意しましょう。
そして、どちらかの条件が満たされた時にループを抜けるようにすればよいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 11:44

    どこの部分にループを書けばいいのですか?

    キャンセル

  • 2018/04/29 11:47

    すでにwhile(1)でループになってますよね。
    今のままだと、ひたすらじゃんけんを続けるだけなので、ループを抜ける条件(「合計得点が21点以上」、「じゃんけんを10回した」)を追加すればいいのです。

    キャンセル

checkベストアンサー

0

元のコードを一部修正する形で書きました。
do whileで後判定することと
対戦者の点数の保持を追加です。
動作確認はしていません。

質問者様のコードは関数化や
勝ち負け判定テーブル(じゃんけんの勝ち¥あいこ/負けと
点数のテーブルを配列に定義する あとで簡単に点数やルールを修正できます)
などしていけますね。

int main(void){

    int a;
    int b;
    int i = 0;
    int total_a = 0;
    int total_b = 0;

    do {
        printf("Game input: ");
        scanf("%d %d", &a, &b);

        if ((a==1 || a==2 || a==3) && (b==1 || b==2 || b==3)) {
            break;        
        }

            printf("Invalid input (Rock: 1, Scissors: 2, Paper: 3),please try again:");

        }

        switch (a) {
        case 1:
            printf("A: Rock,");
            break;

        case 2:
            printf("A: Scissors,");
            break;

        case 3:
            printf("A: Paper,");
            break;
        }
        switch (b) {
        case 1:
            printf(" B: Rock;");
            break;

        case 2:
            printf(" B: Scissors;");
            break;

        case 3:
            printf(" B: Paper;");
            break;
        }

        if (a == b) {
            printf("Draw (points: A 0, B 0)\n");
        }

        else if (a == 1 && b == 2) {
            printf(" A wins and gets 1 points.\n");
            printf("Winner: A (points: A 1, B 0)\n");
        total_a = total_a + 1
        }
        else if (a == 2 && b == 3) {
            printf(" A wins and gets 2 points.\n");
            printf("Winner: A (points: A 2, B 0)\n");
        total_a = total_a + 2
        }
        else if (a == 3 && b == 1) {
            printf(" A wins and gets 5 points.\n");
            printf("Winner: A (points: A 5, B 0)\n");
        total_a = total_a + 5
        }

        else if (a == 1 && b == 3) {
            printf(" B wins and gets 1 points.\n");
            printf("Winner: B (points: A 0, B 5)\n");
        total_b = total_b + 5
        }
        else if (a == 2 && b == 1) {
            printf(" B wins and gets 1 points.\n");
            printf("Winner: B (points: A 0, B 1)\n");
        total_b = total_b + 1
        }
        else if (a == 3 && b == 2) {
            printf(" B wins and gets 2 points.\n");
            printf("Winner: B (points: A 0, B 2)\n");
        total_b = total_b + 2
        }
    } while(total_a >= 21 || total_b >= 21 || i >= 10);

    printf("*****GAME OVER *****\n");

    if (total_a > total_b) {
        printf("A wins. \n");        
    }
    else if (total_a  total_b) 
        printf("B wins. \n"); 
    }
    return(0);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 13:36 編集

    ありがとうございます。
    このプログラムではデバックができませんでした。switch文のところにwhileが定義されていないとでてしまいました。あと一歩でできそうなので思考の手助けお願いします。。。

    キャンセル

  • 2018/04/29 13:46

    mMs7ScOiWNZzOieさん

    少し待っていただけますが。今手元にPCがないので。
    一応知り合いに見てもらってます。
    あとで回答いたします。

    キャンセル

  • 2018/04/29 16:15

    括弧が対応してないだけに読めますし見えます。それと最後の条件式も変ですね。

    キャンセル

  • 2018/04/29 17:46

    プログラムを書き換えたのでみてもらえますか?
    しかし、このプログラムだと10回じゃんけんをする前に21点以上になったはずなのに10回じゃんけんをするまでプログラムが終わりません。なぜでしょうか?

    キャンセル

  • 2018/04/29 18:28

    LouiS0616さん コメントありがとうございました。

    元のソースがあの感じでしたのでざっと考え方だけ書きました。
    さっき作っていておかしいなことに気がつきました。

    mMs7ScOiWNZzOieさん

    一応元のソースの書き方は残して作成しました。
    「10回じゃんけんをする前に21点以上になったはずなのに10回じゃんけんをするまでプログラムが終わりません」とかの問題もクリアしています。

    で、先の書き直したソースコードの上の疑問についてですが

    if (points_a >= 21 || points_b >= 21)
    break;

    この条件文で  || turns == 10 を追加すればいいと思います。

    キャンセル

  • 2018/04/29 18:45

    if (points_a >= 21 || points_b >= 21)
    break;

    ここですね。

    || turns == 10 を追加 ではだめですね、見た感じ。やっかいなif文ですね。

    turns == 9 でbreak; をどう入れるかですね。

    キャンセル

  • 2018/04/29 18:48

    ありがとうございます!!すべての謎は解決しました。ありがとうございました。

    キャンセル

  • 2018/04/29 18:59

    解決できてよかったですね。アドバイスがうまくいかなかったので、質問者さんが残った問題も
    自力解決されてよかったです。

    ほかの回答者の方、その考えがとてもうまい方も見受けられます。
    参考にしてください。

    キャンセル

0

グローバル変数a_score,b_scoreを宣言します。
main関数をjankenとでも改名します。
janken内でスコアをa_scoreb_scoreを計算するようにします。

int main(void){
  for(int count = 0;a_score < 21 && b_score < 21 && count < 10;count++){
    janken();
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コードを作成しました。

実行環境 Linux 
コンパイラ gcc

#include <stdio.h>

int main(void){
    int i=1;
    int a;
    int b;
    int total_a = 0;
    int total_b = 0;

    do {
        while(1) {
           printf("Game input(EXIT= press 9) :\n");
           scanf("%d %d", &a, &b);

            if (a==9 || b==9) {
                 printf("EXIT!!\n");
                 return 0;
            }
            if ( (a>=4) || (a<=0) || (b>=4) || (b<=0) ) {
                printf("Invalid input (Rock: 1, Scissors: 2, Paper: 3),please try again:\n");
           } else {
               break;
           }
       }

        switch (a) {
            case 1:
                printf("A: Rock,");
                break;

            case 2:
                printf("A: Scissors,");
                break;

            case 3:
                printf("A: Paper,");
                break;
            }

        switch (b) {
            case 1:
                printf(" B: Rock;");
                break;

            case 2:
                printf(" B: Scissors;");
                break;

            case 3:
                printf(" B: Paper;");
                break;
           }

           if (a == b) {
                printf("Draw (points: A 0, B 0)\n");
            }
            else if (a == 1 && b == 2) {
               printf(" A wins and gets 1 points.\n");
                printf("Winner: A (points: A 1, B 0)\n");
                total_a = total_a + 1;
            }
            else if (a == 2 && b == 3) {
                printf(" A wins and gets 2 points.\n");
                printf("Winner: A (points: A 2, B 0)\n");
                total_a = total_a + 2;
            }
            else if (a == 3 && b == 1) {
                printf(" A wins and gets 5 points.\n");
                printf("Winner: A (points: A 5, B 0)\n");
                total_a = total_a + 5;
            }
            else if (a == 1 && b == 3) {
                printf(" B wins and gets 1 points.\n");
                printf("Winner: B (points: A 0, B 5)\n");
                total_b = total_b + 5;
            }
            else if (a == 2 && b == 1) {
                printf(" B wins and gets 1 points.\n");
                printf("Winner: B (points: A 0, B 1)\n");
                total_b = total_b + 1;
            }
            else if (a == 3 && b == 2) {
                printf(" B wins and gets 2 points.\n");
                printf("Winner: B (points: A 0, B 2)\n");
                total_b = total_b + 2;
            }

        printf("%2d %2d %2d\n", total_a, total_b, i);
        printf("\n");

        i++;

    } while((total_a < 21) && (total_b < 21) && (i <= 10));

    printf("\n*****GAME OVER *****\n");

    if (i == 11) {
        printf("10 times. Game is over.\n");
        return 0;
    }
    if (total_a > total_b) {
        printf("A wins. \n");
    }
    else if (total_a < total_b) {
        printf("B wins. \n");
    }
        return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4005questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • if

    220questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

  • while

    83questions

    Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

  • Switch

    20questions