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

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

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

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

Q&A

受付中

ジャンケンゲーム

tkokushi
tkokushi

総合スコア5

Java

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

4回答

0グッド

0クリップ

7885閲覧

投稿2017/05/07 08:23

ジャンケンゲームを作ってます。
<ルール>
コンピュータに3回負けたらゲーム終了!
負けるまでゲームは続く!

数字を入力するとループが止まりません。
あと、winloseクラスで勝敗が判定されません。```

どなたかお助けください!

コード

package

1 2import java.io.IOException; 3 4//実行するクラス 5public class Main { 6 7 public static void main(String[] args) throws IOException { 8 int loseCoount = 0; 9 10 while (true) { 11 try { 12 if(loseCoount < 3){ 13 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 14 System.out.println("コンピュータに3回負けたら終了です。"); 15 Winlose.winlose(0, 0); 16 continue; 17 }else{ 18 System.out.println("3回負けたので終了です"); 19 System.exit(0); 20 } 21 continue; 22 } catch (Exception e) { 23 System.out.println("0.1.2.以外は入れないでください"); 24 } 25 } 26 } 27} 28 29 30package janken; 31 32import java.util.Random; 33 34//コンピュータの手を決めるクラス 35public class Computer { 36 37 public static int computer() { 38 39 // コンピュータの手をランダムで決める 40 Random random = new Random(); 41 int computerhand = random.nextInt(3); 42 String[] hand = { "グー", "チョキ", "パー" }; 43 44 System.out.println("コンピュータは" + hand[computerhand]); 45 return computerhand; 46 } 47} 48 49 50package janken; 51 52//import java.util.InputMismatchException; 53import java.util.Scanner; 54 55// プレイヤーの入力した手を決める 56public class Player { 57 58 public static int player() { 59 60 61 62 63 // 入力した結果を出力する 64 Scanner scanner = new Scanner(System.in); 65 int playerhand = scanner.nextInt(3); 66 String[] hand = { "グー", "チョキ", "パー" }; 67 scanner.close(); 68 System.out.println("あなたの手は" + hand[playerhand]); 69 70 return playerhand; 71 } 72} 73 74 75package janken; 76 77//勝敗を決めるクラス 78public class Winlose { 79 80 public static void winlose(int computerhand, int playerhand) { 81 82 int winCount = 0; 83 int loseCount = 0; 84 int drawCount = 0; 85 86 // プレイヤークラスのメソッドを呼ぶ 87 Player.player(); 88 89 // コンピュータクラスのメソッドを呼ぶ 90 Computer.computer(); 91 92 // 勝敗を決める 93 switch (computerhand) { 94 // コンピュータの手がグーの時 95 case 0: 96 if (0 == playerhand) { 97 System.out.println("引き分けooo"); 98 drawCount++; 99 break; 100 } else if (1 == playerhand) { 101 System.out.println("負け"); 102 loseCount++; 103 break; 104 } else if (2 == playerhand) { 105 System.out.println("勝ち"); 106 winCount++; 107 break; 108 } 109 // コンピュータの手がチョキの時 110 case 1: 111 if (1 == playerhand) { 112 System.out.println("引き分け"); 113 break; 114 } else if (2 == playerhand) { 115 System.out.println("負け"); 116 loseCount++; 117 break; 118 } else if (0 == playerhand) { 119 System.out.println("勝ち"); 120 winCount++; 121 break; 122 } 123 case 2: 124 if (2 == playerhand) { 125 System.out.println("引き分け"); 126 drawCount++; 127 break; 128 } else if (0 == playerhand) { 129 System.out.println("負け"); 130 loseCount++; 131 break; 132 } else if (1 == playerhand) { 133 System.out.println("勝ち"); 134 winCount++; 135 break; 136 } 137 } 138 // 勝敗の回数を表示 139 System.out.println("勝った回数:" + winCount + "/負けた回数:" + loseCount + "/引きわけの回数:" + drawCount + ""); 140 141 } 142 }

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

swordone

2017/05/07 10:01

マークダウンのやり方が違っています。コード部分を反転選択して<code>を押してください。

回答4

2

java

1while (true) { 2 try { 3 if(loseCoount < 3){ 4 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 5 System.out.println("コンピュータに3回負けたら終了です。"); 6 Winlose.winlose(0, 0); //ここ 7 continue; 8 }else{ 9 System.out.println("3回負けたので終了です"); 10 System.exit(0); 11 } 12 continue; 13 } catch (Exception e) { 14 System.out.println("0.1.2.以外は入れないでください"); 15 } 16}

//ここ の部分でloseCountを変化させ、ループから抜けさせようとしているようですが、
winloseメソッドはvoidメソッドで、このクラスに属するloseCountは一切変化しないので、無限ループになります。
winloseメソッドの返り値を勝ち負け引き分け判別できるようにして、このループの中でloseCountを変化させなければいけません。

投稿2017/05/07 08:30

swordone

総合スコア20613

akabee, katoy👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

tkokushi

2017/05/07 08:55

java初心者ですいません。 この場合は引数が初期化しているって事ですか?
swordone

2017/05/07 09:32

そうではなく、loseCountが0のまま動いていません。

1

書き直した例を示します。

java

1package janken; 2 3import java.util.InputMismatchException; 4 5//実行するクラス 6public class Main { 7 public static void main(String[] args) { 8 Player player = new Player(); 9 Computer computer = new Computer(); 10 judgement winlose = new judgement(); 11 12 System.out.println("コンピュータに3回負けたら終了です。"); 13 while (true) { 14 try { 15 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 16 Hand player_hand = player.play(); 17 Hand computer_hand = computer.play(); 18 System.out.println("あなたの手は" + player_hand.getLabel()); 19 System.out.println("コンピュータは" + computer_hand.getLabel()); 20 21 winlose.judge(computer_hand, player_hand); 22 winlose.show_results(); 23 24 if (winlose.getLoseCount() >= 3) { 25 System.out.println("3回負けたので終了です"); 26 break; 27 } 28 } catch (InputMismatchException ex) { 29 System.out.println("0.1.2.以外は入れないでください"); 30 } 31 } 32 } 33} 34

java

1package janken; 2 3import java.util.Random; 4 5//コンピュータの手を決めるクラス 6public class Computer { 7 public Hand play() { 8 // コンピュータの手をランダムで決める 9 Random random = new Random(); 10 return Hand.getByOrder(random.nextInt(3)); 11 } 12}

java

1package janken; 2 3//import java.util.InputMismatchException; 4import java.util.Scanner; 5 6// プレイヤーの入力した手を決める 7public class Player { 8 public Hand play() { 9 Scanner scanner = new Scanner(System.in); 10 scanner.reset(); 11 return Hand.getByOrder(scanner.nextInt(3)); 12 } 13}

java

1package janken; 2 3//勝敗を決めるクラス 4public class judgement { 5 private int winCount = 0; 6 private int loseCount = 0; 7 private int drawCount = 0; 8 9 public void judge(Hand computerhand, Hand playerhand) { 10 // 勝敗を決める 11 int computerhand_order = computerhand.ordinal(); 12 int playerhand_order = playerhand.ordinal(); 13 if (computerhand_order == playerhand_order) { 14 drawCount++; 15 } else if ((computerhand_order == 0 && playerhand_order == 1) 16 || (computerhand_order == 1 && playerhand_order == 2) 17 || (computerhand_order == 2 && playerhand_order == 0)) { 18 loseCount++; 19 } else { 20 winCount++; 21 } 22 } 23 24 public void show_results() { 25 // 勝敗の回数を表示 26 System.out.println("勝った回数:" + winCount + "/負けた回数:" + loseCount + "/引きわけの回数:" + drawCount + ""); 27 } 28 29 public int getLoseCount() { 30 return loseCount; 31 } 32}

java

1package janken; 2 3public enum Hand { 4 /** 列挙定数の定義 */ 5 Stone("ぐー"), 6 scissors("ちょき"), 7 Paper("ぱー"); 8 9 private String label; 10 11 /** コンストラクタ */ 12 Hand(String label) { 13 this.label = label; 14 } 15 16 public String getLabel() { 17 return this.label; 18 } 19 20 public static Hand getByOrder(int order) { 21 Hand[] hands = Hand.values(); 22 return hands[order]; 23 } 24}

投稿2017/05/07 11:17

katoy

総合スコア22306

akabee👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

tkokushi

2017/05/07 12:25

自分の書いた4クラスだけで完結させるのは難しいですか?
katoy

2017/05/07 21:43

上の例では、グー、チョキ、パーと整数 0, 1, 2の関連付けが複数ファイルに存在してしまっているのを Hand にまてめているだけです。 質問文のコードにあったようにグー、チョキ、パーと整数 0, 1, 2の関連付をその都度 処理すれば、 Hand は不要です。

1

質問文にあるコードに最小限の変更をして、動作するようにしてみました。
しかし動作はしますが、class 設計としてはツッコミどころがいろいろあります。
別回答で、書き直ししたコード例も示します。

変更点の概要は

  • scanner の close をしないようにしたこと、
  • Winlose クラス中の 勝敗カウントを static にしたこと、
  • winlose メソッドで losecount を返すようにしたこと、

です。

java

1package janken; 2import java.io.IOException; 3 4//実行するクラス 5public class Main { 6 public static void main(String[] args) throws IOException { 7 int loseCoount = 0; 8 9 while (true) { 10 try { 11 if (loseCoount < 3) { 12 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 13 System.out.println("コンピュータに3回負けたら終了です。"); 14 // プレイヤークラスのメソッドを呼ぶ 15 int playerhand = Player.player(); 16 // コンピュータクラスのメソッドを呼ぶ 17 int computerhand = Computer.computer(); 18 loseCoount = Winlose.winlose(computerhand, playerhand); 19 continue; 20 } else { 21 System.out.println("3回負けたので終了です"); 22 System.exit(0); 23 } 24 continue; 25 } catch (Exception e) { 26 System.out.println("0.1.2.以外は入れないでください"); 27 } 28 } 29 } 30} 31

java

1package janken; 2 3//import java.util.InputMismatchException; 4import java.util.Scanner; 5 6// プレイヤーの入力した手を決める 7public class Player { 8 public static int player() { 9 // 入力した結果を出力する 10 Scanner scanner = new Scanner(System.in); 11 int playerhand = scanner.nextInt(3); 12 String[] hand = { "グー", "チョキ", "パー" }; 13 scanner.reset(); 14 System.out.println("あなたの手は" + hand[playerhand]); 15 return playerhand; 16 } 17}

java

1package janken; 2 3import java.util.Random; 4 5//コンピュータの手を決めるクラス 6public class Computer { 7 public static int computer() { 8 // コンピュータの手をランダムで決める 9 Random random = new Random(); 10 int computerhand = random.nextInt(3); 11 String[] hand = { "グー", "チョキ", "パー" }; 12 13 System.out.println("コンピュータは" + hand[computerhand]); 14 return computerhand; 15 } 16}

java

1package janken; 2 3//勝敗を決めるクラス 4public class Winlose { 5 static private int winCount = 0; 6 static private int loseCount = 0; 7 static private int drawCount = 0; 8 9 public static int winlose(int computerhand, int playerhand) { 10 // 勝敗を決める 11 switch (computerhand) { 12 case 0: 13 // コンピュータの手がグーの時 14 if (0 == playerhand) { 15 System.out.println("引き分けooo"); 16 drawCount++; 17 break; 18 } else if (1 == playerhand) { 19 System.out.println("負け"); 20 loseCount++; 21 break; 22 } else if (2 == playerhand) { 23 System.out.println("勝ち"); 24 winCount++; 25 break; 26 } 27 case 1: 28 // コンピュータの手がチョキの時 29 if (1 == playerhand) { 30 System.out.println("引き分け"); 31 break; 32 } else if (2 == playerhand) { 33 System.out.println("負け"); 34 loseCount++; 35 break; 36 } else if (0 == playerhand) { 37 System.out.println("勝ち"); 38 winCount++; 39 break; 40 } 41 case 2: 42 // コンピュータの手がパーの時 43 if (2 == playerhand) { 44 System.out.println("引き分け"); 45 drawCount++; 46 break; 47 } else if (0 == playerhand) { 48 System.out.println("負け"); 49 loseCount++; 50 break; 51 } else if (1 == playerhand) { 52 System.out.println("勝ち"); 53 winCount++; 54 break; 55 } 56 } 57 // 勝敗の回数を表示 58 System.out.println("勝った回数:" + winCount + "/負けた回数:" + loseCount + "/引きわけの回数:" + drawCount + ""); 59 return loseCount; 60 } 61}

投稿2017/05/07 09:25

katoy

総合スコア22306

akabee👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

tkokushi

2017/05/07 10:24

丁寧な返信ありがとうございます。 ループが終わりません。 条件式が間違っているのでしょうか?

0

こんにちは、 とりあえず無限ループになる原因と思われるところを抜粋しておきます。

Java

1while (true) { 2 try { 3 if(loseCoount < 3){ 4 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 5 System.out.println("コンピュータに3回負けたら終了です。"); 6 Winlose.winlose(0, 0); 7 continue; 8 }else{ 9 System.out.println("3回負けたので終了です"); 10 System.exit(0); 11 } 12 continue; 13 } catch (Exception e) { 14 System.out.println("0.1.2.以外は入れないでください"); 15 } 16 } 17 } 18 }

while文の条件文ところはTrueに対してbreak文が見つからないので無限ループしているのではないかと
思います。単純にwhile文の条件文は loseCount < 3でいいと思います。

###switch文のところを工夫しよう
配列と演算子を上手に使えばswitch文の判定のところはもっと効率よく書けます。
ていうか、switch文を使う必要がありません。
まずは下の表をご覧ください。

|あなた|コンピューター|結果|2つの整数の差を3で割ったときのあまり|
|:--:|:--:|--:|
|0|0|引き分け|0|
|2|1|コンピューターの勝ち|1|
|1|2|あなたの勝ち|2|

「あなたが入力した整数」と「コンピューターがランダムに出力する整数」の関係性がわかります。
これだけわかっても各コードの量はだいぶ減ると思います。(switch文を使うとしても)
ここで、もっと減らすために色んな配列を準備します。

Java

1 String []hand = {"グー","チョキ","パー"}; 2 String []judge = {"引き分け","負け","勝ち"};

これを使うと

Java

1System.out.println(name + "さん:" + hand[my_hand]); 2System.out.println("コンピューター:" + hand[computer_hand]); 3System.out.println(name + "さん" + judge[judge_num] + "です。");

のように書くことでswitch文を書かずに済みます。
judge_numは先ほど説明した2つの整数の差を3で割ったときのあまりです。
ただし2つの整数の差がマイナスの時,それを3で割った余りもマイナスになるので、
3加えています。(例えば、2つの整数の差が-2の時,3出割った余り-2となります。)

以下、私が書いたソースコードを載せておきます。
あくまでも、不正な入力がないことを前提としています。
(入力した数字を3で割った余りに変換しているため、数字を入力する限りエラーは出ません。)

Java

1 2import java.util.Scanner; 3import java.util.Random; 4 5public class Main { 6 7 public static void main(String[] args) { 8 9 System.out.println("ジャンケンゲームです!あなたの手を入力してください グー:0 チョキ:1 パー:2"); 10 System.out.println("コンピュータに3回負けたら終了です。"); 11 System.out.println("あなたの名前を入力してください。"); 12 Scanner sc = new Scanner(System.in); 13 String name = sc.nextLine(); 14 System.out.println(name + "さん、よろしくお願いします。"); 15 int []judge_count = {0,0,0}; //引き分け、負け、勝ちの回数 16 17 String []hand = {"グー","チョキ","パー"}; 18 String []judge = {"引き分け","負け","勝ち"}; 19 20 while(judge_count[1] < 3){ 21 22 System.out.println("現在"); 23 for(int i = 0; i < 3; i++){ 24 System.out.println(judge[i] + ":" + judge_count[i] + "回"); 25 } 26 System.out.println("ジャンケン..."); 27 String line = sc.nextLine(); 28 int my_hand = Integer.parseInt(line); 29 my_hand = my_hand % 3; 30 Random random = new Random(); 31 int computer_hand = random.nextInt(3); 32 int judge_num = (my_hand - computer_hand + 3) % 3; 33 34 System.out.println(name + "さん:" + hand[my_hand]); 35 System.out.println("コンピューター:" + hand[computer_hand]); 36 System.out.println(name + "さん" + judge[judge_num] + "です。"); 37 judge_count[judge_num]++; 38 } 39 System.out.println("結果"); 40 for(int i = 0; i < 3; i++){ 41 System.out.println(judge[i] + ":" + judge_count[i] + "回"); 42 } 43   } 44}

投稿2018/04/17 00:24

退会済みユーザー

退会済みユーザー

総合スコア0

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

asahina1979

2018/04/17 00:34

1年ほど前のだよこれ (じゃんけんゲームをつくれってどこかの教材なのかなぁ)
退会済みユーザー

退会済みユーザー

2018/04/17 00:40

何か問題でも?

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Java

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