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

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

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

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

Q&A

4回答

8340閲覧

ジャンケンゲーム

tkokushi

総合スコア5

Java

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

0グッド

0クリップ

投稿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 }

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

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

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

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

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

swordone

2017/05/07 10:01

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

回答4

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}

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

投稿2017/05/07 08:30

swordone

総合スコア20669

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

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

tkokushi

2017/05/07 08:55

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

2017/05/07 09:32

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

0

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

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

総合スコア22324

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

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

tkokushi

2017/05/07 12:25

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

2017/05/07 21:43

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

0

質問文にあるコードに最小限の変更をして、動作するようにしてみました。
しかし動作はしますが、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

総合スコア22324

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

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

tkokushi

2017/05/07 10:24

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 00:34

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

退会済みユーザー

2018/04/17 00:40

何か問題でも?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問