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

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

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

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

Q&A

解決済

3回答

1808閲覧

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

kimi0000

総合スコア14

Java

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

0グッド

1クリップ

投稿2015/07/23 06:37

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、勝負判定の仕方が分かりません。
最後取得したコイン合計偶数の人が勝、取得した合計数を求める方法が分かりません
どなたが教えてください。

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

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

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

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

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

guest

回答3

0

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

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

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

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

if(cm%2 == 0){
System.out.println("奇数を入力してください。");
// 入力処理(略)
}
// いろいろな処理(略)

この場合のelseは上のように外せます。
そのようにいろいろ工夫してネストを浅くしましょう。

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

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

投稿2015/07/23 07:46

編集2015/07/23 07:48
LLman

総合スコア5592

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

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

kimi0000

2015/07/23 08:00

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

0

ベストアンサー

  1. 無限ループについて

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

Java

1for(int i =cm;0<=i;){ 2 if(cm%2 !=0){ 3 //奇数の時の処理 4 }else{ 5 System.out.println("奇数を入力してください。"); 6 cm=Integer.parseInt(coin); //再入力 7 } 8}
  1. 勝負判定

一例です。
それぞれプレイヤーの現在所持しているコインの枚数を保管する変数を用意し、
プレイヤーがコインをとったときに、その枚数を変数に保管します。
最後、コインの枚数が0になりループを抜けた後に、
それぞれの所持しているコインの枚数を比較し、勝利判定を出す。

Java

1int player1,player2 = 0; 2for(int i =cm;0<=i;){ 3 if(cm%2 !=0){ 4 //奇数の時の処理 5 if(turnCount % 2 ==0){ 6 System.out.println(user1+"さんの番です"); 7 player1 += takeCoin; 8 }else{ 9 System.out.println(user2+"さんの番です"); 10 player2 += takeCoin; 11 } 12 }else{ 13 System.out.println("奇数を入力してください。"); 14 cm=Integer.parseInt(coin); //再入力 15 } 16} 17 18//コイン枚数の比較 19if (player1%2 = 0) 20 System.out.println(user2+"さんの勝利です"); 21}else if(player2%2 = 0){ 22 System.out.println(user2+"さんの勝利です"); 23}

投稿2015/07/23 07:08

編集2015/07/23 07:09
f-hanako

総合スコア159

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

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

kimi0000

2015/07/23 07:41

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

2015/07/23 07:46

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

2015/07/23 07:59

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

0

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

Java

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

を入れるといいです。

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

投稿2015/07/23 06:51

編集2015/07/23 07:21
MakotoMiyazaki

総合スコア297

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

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

kimi0000

2015/07/23 07:37

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問