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

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

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

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

Q&A

解決済

2回答

739閲覧

java じゃんけんゲーム 出力されない

Tsubasa73

総合スコア7

Java

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

0グッド

0クリップ

投稿2022/09/03 06:50

前提

javaでじゃんけんゲームを作っています。コンピューターの出力と比較して勝者を決定します。

実現したいこと

・入力する側が勝つまでじゃんけんを続け、入力者が勝ったらじゃんけんを終了する。

発生している問題・エラーメッセージ

じゃんけんの結果が出力されない

該当のソースコード

Java

1import java.io.*; 2class Sample{ 3 public static void main(String[] args)throws IOException{ 4 5 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 6 7 for(int i = 0; i >= 0; i++){ 8 9 System.out.print("パー(P),グー(G),チョキ(T)>"); 10 String myHand = br.readLine(); 11 12 int compHand = (int)(Math.random()*3)+1; 13 System.out.print("コンピュータ:"); 14 15 if(compHand == 1){ 16 System.out.println("P"); 17 }else if(compHand == 2){ 18 System.out.println("G"); 19 }else if(compHand == 3){ 20 System.out.println("T"); 21 } 22 23 if((myHand == "G" && compHand == 3) || (myHand == "T" && compHand == 1) || (myHand == "P" && compHand == 2)){ 24 System.out.println("あなたの勝ち"); 25 break; 26 }else if((myHand == "G" && compHand == 2) || (myHand == "T" && compHand == 3) || (myHand == "P" && compHand == 1)){ 27 System.out.println("あいこ"); 28 continue; 29 }else if((myHand == "G" && compHand == 1) || (myHand == "T" && compHand == 2) || (myHand == "P" && compHand == 3)){ 30 System.out.println("コンピュータの勝ち"); 31 continue; 32 } 33 } 34 } 35}

試したこと

break;を使うことで入力者が勝った時にじゃんけんゲームが終了すると考えた。すると勝敗が出力されないままゲームが続いた。なぜかわからないのでご教授いただきたい。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

文字の比較なら == が使えます。
例えば myHand == "G"myHand.charAt(0) == 'G' に書き換えて下さい。

for(int i = 0; i >= 0; i++){
変なfor文ですね。i は 0 から始めてどんどん増やすのですから、正であるのは当然です。
無限ループなら while (true) { または for (;;) { でいいでしょう。

myHand も compHand も 0、1、2 にすると簡単になります。

Java

1import java.util.Scanner; 2 3class Sample{ 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 while (true) { 7 System.out.print("パー(P),グー(G),チョキ(T)>"); 8 int myHand = "PGT".indexOf(sc.next()); 9 int compHand = (int)(Math.random()*3); 10 System.out.println("コンピュータ:" + "PGT".charAt(compHand)); 11 int d = (compHand - myHand + 3) % 3; 12 if (d == 1) { 13 System.out.println("あなたの勝ち"); 14 break; 15 } 16 if (d == 0) 17 System.out.println("あいこ"); 18 else 19 System.out.println("コンピュータの勝ち"); 20 } 21 } 22}

投稿2022/09/03 09:01

編集2022/09/03 09:06
kazuma-s

総合スコア8224

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

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

0

ベストアンサー

文字列の比較には == ではなく .equals を使ってください。
具体的には、例えば myHand == "G"myHand.equals("G") に書き換えて下さい。

おまけ

たぶん私ならこう書きます。
勝ち負けの判定とか、文字や数値からの変換とか、逐一考えるのはめんどくさそうなので...

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.io.IOException; 4import java.util.Random; 5 6enum JankenHand { 7 P("P"), G("G"), T("T"); 8 9 private String name; 10 private JankenHand(String name) { 11 this.name = name; 12 } 13 14 public boolean win(JankenHand other) { 15 if(this == P && other == G) return true; 16 if(this == G && other == T) return true; 17 if(this == T && other == P) return true; 18 return false; 19 } 20 21 @Override 22 public String toString() { 23 return name; 24 } 25 26 public static JankenHand of(String name) { 27 for(JankenHand hand: JankenHand.values()) { 28 if(hand.name.equals(name)) return hand; 29 } 30 throw new IllegalArgumentException( 31 String.format("不正な引数: %s", name)); 32 } 33 34 public static JankenHand getRandomHand(Random gen) { 35 return JankenHand.values()[gen.nextInt(JankenHand.values().length)]; 36 } 37} 38 39class Sample { 40 public static void main(String[] args) throws IOException { 41 Random randGen = new Random(); 42 43 try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { 44 while(true) { 45 // 自分の手を入力 46 System.out.print("パー(P),グー(G),チョキ(T)>"); 47 final JankenHand myHand; 48 try { 49 myHand = JankenHand.of(br.readLine()); 50 } 51 catch(IllegalArgumentException e) { 52 System.err.println(e.getMessage()); 53 continue; 54 } 55 56 // コンピュータの手を取得 57 final JankenHand compHand = JankenHand.getRandomHand(randGen); 58 System.out.println("コンピュータ:" + compHand); 59 60 // 勝ち負けを判定 61 if(myHand.win(compHand)) { 62 System.out.println("あなたの勝ち"); 63 break; 64 } 65 if(compHand.win(myHand)) { 66 System.out.println("コンピュータの勝ち"); 67 continue; 68 } 69 70 System.out.println("あいこ"); 71 } 72 } 73 } 74}

getRandomHandの引数をStrategyにしてやると癖あるコンピューターが作れます。
また、日本の3すくみのジャンケン以外も比較的簡単に作れます。

いろいろ改造してみると楽しいですよ。

投稿2022/09/03 06:54

編集2022/09/03 07:33
LouiS0616

総合スコア35660

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

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

Tsubasa73

2022/09/03 06:58

初歩的なミスでした。気をつけます。ありがとうございました。
jimbe

2022/09/03 08:53

JankenHand.of メソッドは enum.valueOf で良いように思います。
LouiS0616

2022/09/03 09:20

@jimbe さん 確かに今回は識別子と名前が完全一致しているのでそれでもいけますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問