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

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

ただいまの
回答率

89.87%

Javaのコイン奪取ゲームの勝負判定について教えてください

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,009

kimi0000

score 12

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class LoToi5 {
    /**
     * コイン奪取ゲーム
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
            //手番カウント用変数
            int turnCount = 0;
            //入力するための準備
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            //ゲームの説明
            System.out.println("*******");
            System.out.println("* コイン奪取ゲーム*");
            System.out.println("*******");
            System.out.println("");
            System.out.println("ゲーム説明(対象人数2名)\r\n" +
                    "①まず名前を決目てください\r\n" +
                    "②次にコイン全体の枚数を決めてください(奇数)\r\n" +
                    "③二人交互1~3枚のコインを無くなるまで取る\r\n" +
                    "④最後取得コイン合計偶数の方が勝利です");
            System.out.println("");

            //メッセージ表示
            System.out.println("一人目の名前を入力してください。");
            //入力する情報を取得する
            String user1=br.readLine();
            //メッセージ表示
            System.out.println("二人目の名前を入力してください。");
            //入力する情報を取得する
            String user2 = br.readLine();
            //メッセージ表示
            System.out.println("コインの枚数を決めてください。");
            //入力する情報を取得する
            String coin = br.readLine();
            //文字列を数値に変換する
            int cm=Integer.parseInt(coin);
            System.out.println("今回決めたコインの数は"+cm+"枚です。");
            System.out.println("それではゲームを開始します");
            for(int i =cm;0<i;){
            if(cm%2 !=0){
                //ゲーム終了までループ

                    try{

                        System.out.println("コインを1~3枚まで取ってください。");
                        int takeCoin=Integer.parseInt(br.readLine());
                        //コイン1以上3以下の判定
                        if(takeCoin>=1 && takeCoin<=3){
                            if(takeCoin<=i){
                                if(turnCount % 2 ==0){
                                    System.out.println(user1+"さんの番です");
                                }else{
                                    System.out.println(user2+"さんの番です");
                                }
                                //コインを減らす
                                i -=takeCoin;
                                turnCount++;
                                System.out.println("コインを"+takeCoin+"枚取りました");

                            }else{
                                System.out.println("残りのコインの枚数よりも多い枚数を取ろうとしています");
                            }
                        }else{
                            System.out.println("1回に取れるコインの枚数は1~3枚までです");
                        }
                        System.out.println("残りは"+i+"枚です");
                    } catch (NumberFormatException e) {
                        System.out.println("入力は数字で行って下さい。");
                    } catch (IOException e) {
                        System.out.println("不正な入力が行われました。");
                    }
                    //勝負の判定
                    
            }else{
                System.out.println("奇数を入力してください。");
            }

            }
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コイン奪取ゲームを作りました、問題が二つあります。
1、偶数を入力したら、無限ループになりました(偶数で入力したら、奇数で入力してください、再入力してもらう)
2、勝負判定の仕方が分かりません。
最後取得したコイン合計偶数の人が勝、取得した合計数を求める方法が分かりません
どなたが教えてください。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

ご質問の要件に対してはすでに回答されていますが、
なぜバグが起きたのかという別の視点から答えます。


処理の流れを把握していないから、無限ループが起きたのです。
コードの制御構造の読み取りにくさも要因のひとつでしょう。

forやifのインデントはかならずそろえた上で、
なるべくネストが深くならないようにします。
すくなくとも最後のelseは離れすぎです。

if(cm%2 !=0){ 
// いろいろな処理(略)
}else{ 
                System.out.println("奇数を入力してください。"); 
            } 
元のソースでは上のようになっていますが、

if(cm%2 == 0){ 
    System.out.println("奇数を入力してください。"); 
// 入力処理(略)
}
// いろいろな処理(略)
この場合のelseは上のように外せます。
そのようにいろいろ工夫してネストを浅くしましょう。


コードをきれいにするだけで、制御構造が分かるので、
おのずとバグが見つかる場合もよくあります。

逆にこのスタイルで書き続ける限り、
同じようなバグに悩まされ続けると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/23 17:00

    細かく書いていただいてありがとうございます。

    キャンセル

checkベストアンサー

+1

1. 無限ループについて
 Forをまわしたとき、奇数の時の処理では i の値を減らしていますが、
 偶数の時の処理ではi の値に何も処理を施していないので、
 値が変化しないために無限ループが起きています。

for(int i =cm;0<=i;){
  if(cm%2 !=0){
    //奇数の時の処理
  }else{
    System.out.println("奇数を入力してください。"); 
    cm=Integer.parseInt(coin); //再入力
  }
}

2. 勝負判定
 一例です。
 それぞれプレイヤーの現在所持しているコインの枚数を保管する変数を用意し、
 プレイヤーがコインをとったときに、その枚数を変数に保管します。
 最後、コインの枚数が0になりループを抜けた後に、
 それぞれの所持しているコインの枚数を比較し、勝利判定を出す。
int player1,player2 = 0;
for(int i =cm;0<=i;){
  if(cm%2 !=0){
    //奇数の時の処理
      if(turnCount % 2 ==0){ 
        System.out.println(user1+"さんの番です"); 
        player1 += takeCoin;
      }else{ 
        System.out.println(user2+"さんの番です"); 
        player2 += takeCoin;
      } 
    }else{
    System.out.println("奇数を入力してください。"); 
    cm=Integer.parseInt(coin); //再入力
  }
}

//コイン枚数の比較
if (player1%2 = 0)
  System.out.println(user2+"さんの勝利です"); 
}else if(player2%2 = 0){
  System.out.println(user2+"さんの勝利です"); 
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/23 16:41

    ありがとうございます。問題2を解決できました、
    しかし問題1は
    for(int i =cm;0<i;){
    //入力したコイン数が奇数の場合
    if(cm%2 !=0){
                 }else{
    System.out.println("奇数を入力してください。");
    cm=Integer.parseInt(coin);
    }
    }
    のように書き換えましたが、また無限ループ すみません何度も

    キャンセル

  • 2015/07/23 16:46

    すみません、上記の回答では記述が足りませんでした。
    (新たにユーザに入力してもらう箇所が抜けていました。)
    MakotoMiyazakiさんの回答のように、書き換えてください。

    coin = br.readLine();
    cm=Integer.parseInt(coin);

    キャンセル

  • 2015/07/23 16:59

    ありがとうございます。 大変勉強になりました

    キャンセル

0

1.無限ループになる原因
cmをfor文の外で受け取っているので、コインの数に偶数を入力されると
再入力されるタイミングが無く、無限ループで「奇数を入力してください。」が
表示されてしまいます。
なので、
 System.out.println("奇数を入力してください。");
の後に、
coin = br.readLine(); 
cm=Integer.parseInt(coin); 
を入れるといいです。

2.勝負判定方法
プレイヤーの取得コイン数を持つ配列を用意してあげて
playerCoin[turnCount % 2] += takeCoint;
の様に取得したコインの数を保持して、その配列を使って判定してみてはどうでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/23 16:37

    ありがとうございます

    キャンセル

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

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

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