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

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

ただいまの
回答率

87.80%

Java DiceGame

解決済

回答 2

投稿 編集

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

score 3

Dice Game### 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)JavaでDaice Gameを作っています。

下記のようなプログラミングを作りたいのですが、途中でつまずいてしまいました。
どなたか手助けお願いいたします。
このソースだと、score(所持金)が0になっても、ラウンドが経過してしまいます。
なぜでしょうか?
また、ここはこうしたほうがいいよというアドバイスがあればお願いいたします。

import java.util.Random;

public class DiceGame {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        int i = 0;
        int score = 1000;
        int b;
        String a;
        while (i < 5 || score <= 0) {
            Random rnd = new Random();

            System.out.println((i + 1) + "回目の処理です。現在の所持金" + score + "円");
            i++;
            System.out.println("サイコロを2つ振ります");
            System.out.println("合計の数が偶数(even)か奇数(odd)かを予想してください");

            while (true) {
                a = new java.util.Scanner(System.in).nextLine();

                if ((a.equals("even")) || a.equals("odd")) {
                    break;
                }
            }
            System.out.println("掛け金を入力してください。");

            while (true) {
                b = new java.util.Scanner(System.in).nextInt();

                if ((b > 0 && b <= score)) {
                    break;
                }
            }
            int num = rnd.nextInt(12);
            num++;

            if (num % 2 == 0) {
                System.out.println("偶数" + num + "が出ました。");
            } else {
                System.out.println("奇数" + num + "が出ました。");
            }
            if ((a.equals("even")) && (num % 2 == 0)) {
                System.out.println("あなたの勝ちです。掛け金" + b + "円が増え、あなたの所持金は" + (score + b) + "円になりました。");
                score = score + b;
            } else if ((a.equals("odd")) && (num % 2 == 1)) {
                System.out.println("あなたの勝ちです。掛け金" + b + "円が増え、あなたの所持金は" + (score + b) + "円になりました。");
                score = score + b;
            } else {
                System.out.println("あなたの負けです。掛け金" + b + "円が減り、あなたの所持金は" + (score - b) + "円になりました。");
                score = score - b;
            }
        }
    }

}

6面体ダイス2個の合計値が偶数であるか奇数であるかを当てる
ラウンドを5回繰り返し所持金をどれだけ増やせるかを競う
現在の所持金とラウンドを表示する
初期の所持金は、1000円とする
標準入力より偶数(even)もしくは奇数(odd)のどちらに賭けるかを取得する
このときevenやoddでない入力は無視して、正しい入力が行われるまでループする
標準入力より賭け金の金額(数値)を取得する
このとき数値以外や負数、所持金を超える値などの受け付けない入力は無視して、正しい入力が行われるまでループする
6面体のダイスを2個振り合計値を求める

勝敗の判定
合計値の偶数奇数が賭けたものと一致していた場合、プレイヤーの勝ちとし所持金を賭けた金額分増やす
そうでない場合、プレイヤーの負けとし所持金を賭けた金額分減らす
所持金が0円以下になった場合ゲームオーバーとしプログラムを終了する
5ラウンドが経過した場合、所持金を表示してプログラムを終了する

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • asakuta

    2019/08/13 19:13

    前のプログラムと問題点は残しておいて追記で新たなプログラムと問題点を書くようにしましょう。
    じゃないと怖い人たちに怒られます。

    キャンセル

  • asakuta

    2019/08/13 19:28

    > int num = rnd.nextInt(12); num++;
    この部分ですがサイコロを2回ふるなら2~12の範囲が必要なはずです。上記の処理では1~12ではないですか?。
    whileからの抜け方は私の処理を参考にしてみてください

    キャンセル

  • javarou

    2019/08/13 19:50

    わかりました、気を付けます。

    なるほど、サイコロは2つですもんね。ありがとうございます。
    while文参考にさせていただきます。

    キャンセル

回答 2

+3

score(所持金)が0になっても、ラウンドが経過してしまいます。

while (i < 5 || score <= 0) {


while は 条件式が true の間ループします. この式の場合「i が 5 未満, あるいは score が 0 以下」ならループすることになります.
おかしいことがお分かりでしょうか.


ここはこうしたほうがいいよ

個人的な嗜好等が入っていることを念のためお断りしておきます.

====

Random rnd = new Random();


は, while の外に出してよいと思います. 毎回 Random を作り直す必要はありません.

====

new java.util.Scanner(System.in)


これも毎回作り直す必要はありません. asakuta さんのコードのように, 最初に変数に入れておけばずっと使えます.
さらに,

b = new java.util.Scanner(System.in).nextInt();


当初のご質問に戻りますが, こちらで文字を入力した場合例外が発生するのではありませんか.
try-catch が必要ではないでしょうか.

====

  int i = 0;
  :
  while (i < 5 ~ ) {
    :
    i++;
    :
  }


変数 i は 0 から始まり, ループ毎に 1 増え, 5 以上になったらループを抜けます.
これは

  for(int i=0; i<5 ~; i++) {
    :
  }


と同等であり, (ループ条件に少し追加はありますが)「5回ループする」という表現においてはこちらのほうが明確かと思います.

====

  while (true) {
    a = ~;
    if ((a.equals("even")) || a.equals("odd")) {
      break;
    }
  }


while で無限ループをしつつ最後に条件で抜けるのでしたら, do-while が使えます. (ループ条件になるので可否が逆になります.)

  do {
    a = ~;
  } while(!a.equals("even") && !a.equals("odd"));

====

他にも, 当たった場合の even と odd の処理が同じだったり(1つのif文に纏められます), score の表示と計算で同じ加算を行っていたり(計算してから表示すれば, 表示は計算せずにすみます), 変数名が a/b だったり(せめて bet や answer 等それなりに意味のあるようなほうが読み易いです), 折角ダイスゲームなので乱数の生成はサイコロを模したクラスを作っても良さそうだったり...します.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/13 20:51

    一つ一つ細かいところまで説明してくださりありがとうございました。とても、丁寧で分かりやすかったです!while文勘違いしてました、ご指摘ありがとうございます。

    キャンセル

  • 2019/08/14 09:37

    わざわざ回答おこすのもなんなので、気になったことの追加として

    「掛け金」は「賭け金」ですかね。質問では正しいのにソースは誤字ですね、

    キャンセル

checkベストアンサー

+1

出来てる部分と出来ていない部分を正確に記述してどの部分について質問したいのかもう一度精査してみてください。今のままではできていない部分or間違っている部分が多すぎます。

ひとつひとつ解説しようと思いましたが改修部分が多すぎるため動くプログラムを貼っておきます。 分からない部分は質問してください。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = 0;
        int score = 1000;
        String a = null;
        int b = 0;
        while (i < 5) {
            i++;
            System.out.println((i) + "回目の処理です。現在の所持金" + score + "円");
            System.out.println("サイコロを2つ振ります");
            System.out.println("合計の数が偶数(even)か奇数(odd)かを予想してください");
            for (;;) {
                a = sc.next();
                if (a.equals("odd") || a.equals("even")) {
                    break;
                } else {
                    continue;
                }
            }
            System.out.println("掛け金を入力してください。");
            for (;;) {
                for (;;) {
                    if (sc.hasNextInt()) {
                        b = sc.nextInt();
                        break;
                    } else {
                        sc.next();
                    }
                }
                if (b <= score) {
                    break;
                } else {
                    continue;
                }
            }
            int num = ((int) (Math.random() * 6) + 1) + ((int) (Math.random() * 6) + 1);
            if (num % 2 == 0) {
                System.out.println("偶数" + num + "が出ました。");
            } else {
                System.out.println("奇数" + num + "が出ました。");
            }
            if ((a.equals("even")) && (num % 2 == 0) || (a.equals("odd")) && (num % 2 != 0)) {
                score += b;
                System.out.println("あなたの勝ちです。掛け金" + b + "円が増え、あなたの所持金は" + (score) + "円になりました。");
            } else {
                score -= b;
                System.out.println("あなたの負けです。掛け金は" + b + "円が減り、あなたの所持金は" + (score) + "円になりました。");
                if (score <= 1) {
                    break;
                }
            }
        }
        System.out.println("合計点は" + score);
        sc.close();
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/13 18:31

    少し調べてみたらわかりました。この場合、このint i;がフィールドであるか、ローカル変数であるかで扱いが変わってきて、intがプリミティブ型であれば0 (boolean型ならfalse)ていうことですね。

    キャンセル

  • 2019/08/13 19:07

    どうやら```のみの表記があるとインデントが正しく反映されないみたいです。
    code部は正しく修正されたみたいなので言及してる一文を削除しました。

    キャンセル

  • 2019/08/13 19:28

    確認しました。ありがとうございます。

    キャンセル

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

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

関連した質問

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