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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1735閲覧

Java DiceGame

javarou

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/08/12 11:09

編集2019/08/13 09:02

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ラウンドが経過した場合、所持金を表示してプログラムを終了する

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/08/12 12:36 編集

変数への加算は学習していませんか? try-catch はどこで行う必要があるのでしょうか? 蛇足ですが, このコードでは奇数では勝てませんが, よいのでしょうか.
javarou

2019/08/12 13:05

よくありません。笑 奇数で勝つ場合はもう一つif文を追加すればよいのですよね? 2ラウンド目に入ったときに、1000円に戻ってしまい、どのようにすれば増減した金額が反映されるのでしょうか、そもそも繰り返し文の中でそういうことをするのは難しいのでしょうか? try-catch構文は入力無効な値が入力された時に無視して、ループを繰り返すというところで使うと思ったのですが間違えでしょうか? 質問ばかりですみません。。。
jimbe

2019/08/13 02:58

> ~を追加すればよいのですよね? このコードは javarou さんのものです. どのようなコードを入れるかは, javarou さんがお考えになって決めなければなりません. if 文を追加する方法もありますし, 追加しない方法もあります. 所持金が変わらないのは, 所持金を表現している score 変数が変わらない為です. 表示の箇所では, 計算していますが結果は表示にしか使われません. 繰り返しますが, 変数の加減算は学習していませんか? try-catch は例外を補足する「手段」です. まず「どのような(入力無効な)値が入力された時, どの箇所でどのようなコト(異常値? 例外?)が起きるのかを知っていなければなりません. それはご確認されていますでしょうか. 「java scanner nextint」で検索すると, try-catch の書き方を含む記事も見つかります. 参考にされては如何でしょうか.
javarou

2019/08/13 08:34

色々調べましたら、何とかその部分はできました。 変数のへの加算勉強済みでした。変数への上書き?ができることを忘れてました。 アドバイスありがとうございます!
asakuta

2019/08/13 10:13

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

2019/08/13 10:28

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

2019/08/13 10:50

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

回答2

0

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

java

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

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


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

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

====

java

1Random rnd = new Random();

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

====

java

1new java.util.Scanner(System.in)

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

java

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

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

====

java

1 int i = 0; 2 : 3 while (i < 5) { 4 : 5 i++; 6 : 7 }

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

java

1 for(int i=0; i<5; i++) { 2 : 3 }

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

====

java

1 while (true) { 2 a =; 3 if ((a.equals("even")) || a.equals("odd")) { 4 break; 5 } 6 }

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

java

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

====

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

投稿2019/08/13 11:45

編集2019/08/13 16:32
jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javarou

2019/08/13 11:51

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

2019/08/14 00:37

わざわざ回答おこすのもなんなので、気になったことの追加として 「掛け金」は「賭け金」ですかね。質問では正しいのにソースは誤字ですね、
guest

0

ベストアンサー

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

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

java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int i = 0; 7 int score = 1000; 8 String a = null; 9 int b = 0; 10 while (i < 5) { 11 i++; 12 System.out.println((i) + "回目の処理です。現在の所持金" + score + "円"); 13 System.out.println("サイコロを2つ振ります"); 14 System.out.println("合計の数が偶数(even)か奇数(odd)かを予想してください"); 15 for (;;) { 16 a = sc.next(); 17 if (a.equals("odd") || a.equals("even")) { 18 break; 19 } else { 20 continue; 21 } 22 } 23 System.out.println("掛け金を入力してください。"); 24 for (;;) { 25 for (;;) { 26 if (sc.hasNextInt()) { 27 b = sc.nextInt(); 28 break; 29 } else { 30 sc.next(); 31 } 32 } 33 if (b <= score) { 34 break; 35 } else { 36 continue; 37 } 38 } 39 int num = ((int) (Math.random() * 6) + 1) + ((int) (Math.random() * 6) + 1); 40 if (num % 2 == 0) { 41 System.out.println("偶数" + num + "が出ました。"); 42 } else { 43 System.out.println("奇数" + num + "が出ました。"); 44 } 45 if ((a.equals("even")) && (num % 2 == 0) || (a.equals("odd")) && (num % 2 != 0)) { 46 score += b; 47 System.out.println("あなたの勝ちです。掛け金" + b + "円が増え、あなたの所持金は" + (score) + "円になりました。"); 48 } else { 49 score -= b; 50 System.out.println("あなたの負けです。掛け金は" + b + "円が減り、あなたの所持金は" + (score) + "円になりました。"); 51 if (score <= 1) { 52 break; 53 } 54 } 55 } 56 System.out.println("合計点は" + score); 57 sc.close(); 58 } 59}

投稿2019/08/13 08:03

編集2019/08/13 10:04
asakuta

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asakuta

2019/08/13 08:32

すいません時間がないためコードをべた貼りしておきます。 もし質問がある場合は明日回答いたします。
BluOxy

2019/08/13 08:36

細かいと思われるかもしれませんが、インデントは入れたほうが良いと思います。
asakuta

2019/08/13 08:44

paiza.ioでちゃちゃっと作ったらインデントが消えました。 現在移動中で時間が無いため落ち着いたら整形するつもりです
javarou

2019/08/13 08:51

まだ始めたばかりで、使い方に慣れていませんでした。アドバイスありがとうございます! コードありがとうございます。参考にさせていただきます。 あれから、少し自分のコードを変えてみたのですが、もしよろしければご確認お願いいたします。
javarou

2019/08/13 09:23

初めint b = 0としていますが、これは0にする意味はありますでしょうか?
javarou

2019/08/13 09:31

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

2019/08/13 10:07

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

2019/08/13 10:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問