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

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

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

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

Q&A

解決済

4回答

788閲覧

じゃんけんゲームについての再度の質問です。

sanchunaka

総合スコア26

Java

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

0グッド

0クリップ

投稿2024/08/23 17:00

実現したいこと

/実行結果:コマンドプロンプトで実行
2-7.じゃんけんをさせる>javac jp/codeprep/janken/
.java

java jp/codeprep/janken/Main

Taro: ? - ? :Hanako
となり?に手が入らない。

発生している問題・分からないこと

上でも書いたように実行結果で「じゃんけんの手」が表示されない。
いろいろやってみたのですが、解決できません。

実行結果:Taro: ? - ? :Hanako
となります。

該当のソースコード

Main.java

1// Main.java 2package jp.codeprep.janken; 3 4public class Main{ 5 6 public static void main(String[] args){ 7 8 Player player1 = new Player("Taro"); 9 Player player2 = new Player("Hanako"); 10 11 // player1とplayer2のそれぞれからnextHand()で 12 // JankenHandを取得し、 13 JankenHand hand1 = player1.nextHand(); 14 JankenHand hand2 = player2.nextHand(); 15 16 System.out.println( 17 // String.formatは書式文字列の中に値を埋めて 18 // フォーマットするメソッドです。 19 // ここでは"%s: %s - %s :%s"と、 20 // 4つの%sがある書式文字列を使っていますが、 21 // %sの部分が後続の4つの引数で置き換わります。 22 String.format("%s: %s - %s :%s", 23 player1.getName(),hand1, 24 hand2,player2.getName() 25 ) 26 ); 27 } 28} 29 30// Player.java 31package jp.codeprep.janken; 32 33import java.util.Random; 34 35public class Player { 36 37 // ここではprivateとして定義したクラスのメンバ変数nameに 38 // コンストラクタの値を代入しています。 39 private String name; 40 41 private Random random = new Random(); 42 43 // コンストラクタとしてStringのnameを渡してそれをメンバ変数として 44 // 持つようにしてみましょう。 45 public Player(String name){ 46 this.name = name; 47 } 48 49 public String getName(){ 50 return this.name; 51 } 52 53 public JankenHand nextHand(){ 54 55 // Javaで正数の乱数を生成するときは、 56 // RandomクラスのnextInt()を使います 57 // nextInt() は 0 から引数に指定した値未満の整数を返します。 58 int n = random.nextInt(3); 59 60 switch(n){ 61 case 0: return JankenHand.Rock; 62 case 1: return JankenHand.Scissors; 63 case 2: return JankenHand.Paper; 64 } 65 throw new IllegalStateException(); 66 } 67} 68 69// JankenHand.java 70package jp.codeprep.janken; 71 72public enum JankenHand { 73 74 Rock, 75 Scissors, 76 Paper; 77 78 @Override 79 public String toString(){ 80 switch (this) { 81 case Rock: return "✊"; 82 case Scissors: return "✌"; 83 case Paper: return "✋"; 84 } 85 throw new IllegalStateException(); 86 } 87} 88

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

実行結果:コマンドプロンプトで実行
2-7.じゃんけんをさせる>javac jp/codeprep/janken/*.java

java jp/codeprep/janken/Main

Taro: ? - ? :Hanako

補足

CODEPREP:Java起訴オブジェクト指向編https://codeprep.jp/books/66/chapters/2/sections/7
で勉強させてもらっています。
エディタはVSCode,windows10,コマンドプロンプトで実行しています。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

エディタはVSCode,windows10,コマンドプロンプトで実行しています。

コマンドプロンプトにUnicodeを出力できるような設定は行いましたでしょうか。

投稿2024/08/23 21:54

maisumakun

総合スコア146151

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

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

sanchunaka

2024/08/24 02:34

いつもお世話になっております。 何回も同じようなことをしていましたが、 hiriki-oさんの回答で正常に表示されました。 ありがとうございます。
sanchunaka

2024/08/24 03:10

回答ありがとうございます。 実は表示が少しおかしいので、教えてください。以下のように表示されます >java jp/codeprep/janken/Main Taro: ✌ - ✊ :Hanako ko > 「Hanako」の最後の「ko」が表示されます。 こうゆうときはコードに余計な文字が入っているんですが、 見つけられないので教えていただけますか? ちなみにmainメソッドのPlayer player2 = new Player("Hana");とすると >java jp/codeprep/janken/Main Taro: ✌ - ✊ :Hana na > です。 よろしくお願いいたします。
hiroki-o

2024/08/24 03:37

こちらの環境(OpenJDK 22.0.1、コマンドプロンプト)では、Windows 11でも10でも、HanakoでもHanaでも、そういう表示にならないです。 他にソースの変更点は、ありますか?
sanchunaka

2024/08/24 04:04

回答ありがとうございます。 調べてみたのですがいまいち理解できませんでした。 もう一度コードを送りますので、見ていただけますか。 //Main.java package jp.codeprep.janken; public class Main{ public static void main(String[] args){ Player player1 = new Player("Taro"); Player player2 = new Player("Hanako"); // player1とplayer2のそれぞれからnextHand()で // JankenHandを取得し、 JankenHand hand1 = player1.nextHand(); JankenHand hand2 = player2.nextHand(); System.out.println( // String.formatは書式文字列の中に値を埋めて // フォーマットするメソッドです。 // ここでは"%s: %s - %s :%s"と、 // 4つの%sがある書式文字列を使っていますが、 // %sの部分が後続の4つの引数で置き換わります。 String.format("%s: %s - %s :%s", player1.getName(),hand1, hand2,player2.getName() ) ); } } //JankenHand.java package jp.codeprep.janken; public enum JankenHand { Rock, Scissors, Paper; @Override public String toString(){ switch (this) { case Rock: return "✊"; case Scissors: return "✌"; case Paper: return "✋"; } throw new IllegalStateException(); } } // Player.java package jp.codeprep.janken; import java.util.Random; public class Player { // ここではprivateとして定義したクラスのメンバ変数nameに // コンストラクタの値を代入しています。 private String name; private Random random = new Random(); // コンストラクタとしてStringのnameを渡してそれをメンバ変数として // 持つようにしてみましょう。 public Player(String name){ this.name = name; } public String getName(){ return this.name; } public JankenHand nextHand(){ // Javaで正数の乱数を生成するときは、 // RandomクラスのnextInt()を使います // nextInt() は 0 から引数に指定した値未満の整数を返します。 int n = random.nextInt(3); switch(n){ case 0: return JankenHand.Rock; case 1: return JankenHand.Scissors; case 2: return JankenHand.Paper; } throw new IllegalStateException(); } } 結果の最後に「ko」出ます。 ご面倒ですがよろしくお願いいたします。
hiroki-o

2024/08/24 04:26

比較したところ、ソースの変更点は無いので、こちらの調査結果は変わりません。
sanchunaka

2024/08/24 04:30

気になりますが先に進みます。 そのうち解決できるかもしれないので、 ありがとうございました
otn

2024/08/24 14:16

プログラムを読まないで、一般論で回答すると、 > 「Hanako」の最後の「ko」が表示されます。 > こうゆうときはコードに余計な文字が入っているんですが、見つけられないので教えていただけますか? のような時は、ファイルにリダイレクトで書き込んで、16進数で表示するなどして出力内容を確認します。 これで確認済みかも知れませんが、その旨が明記されてなかったので、一応コメントしておきます。 端末出力時と、リダイレクトでのファイル書き込み時に、プログラム上で意図的に出力内容を変えていない前提ですが、今回は大丈夫そうです。
sanchunaka

2024/08/26 03:35

自分で解決しましたのコードとコマンドプロンプトの設定が間違っていたので、正常動作したときのコードと、コマンドプロンプトの設定を下記に示します。 コマンドプロンプトの設定。>chcp 65001を実行する。 プロパティを開いてフォントを選択する。 フォントを「MSゴシック」にする。 //Main.java package jp.codeprep.janken; public class Main{ public static void main(String[] args){ Player player1 = new Player("Taro"); Player player2 = new Player("Hanako"); // player1とplayer2のそれぞれからnextHand()で // JankenHandを取得し、 JankenHand hand1 = player1.nextHand(); JankenHand hand2 = player2.nextHand(); System.out.println( // String.formatは書式文字列の中に値を埋めて // フォーマットするメソッドです。 // ここでは"%s: %s - %s :%s"と、 // 4つの%sがある書式文字列を使っていますが、 // %sの部分が後続の4つの引数で置き換わります。 String.format("%s: %s - %s :%s", player1.getName(),hand1, hand2,player2.getName() ) ); } } // player.java package jp.codeprep.janken; import java.util.Random; public class Player { // ここではprivateとして定義したクラスのメンバ変数nameに // コンストラクタの値を代入しています。 private String name; private Random random = new Random(); // コンストラクタとしてStringのnameを渡してそれをメンバ変数として // 持つようにしてみましょう。 public Player(String name){ this.name = name; } public String getName(){ return this.name; } public JankenHand nextHand(){ // Javaで正数の乱数を生成するときは、 // RandomクラスのnextInt()を使います // nextInt() は 0 から引数に指定した値未満の整数を返します。 int n = random.nextInt(3); switch(n){ case 0: return JankenHand.Rock; case 1: return JankenHand.Scissors; case 2: return JankenHand.Paper; } throw new IllegalStateException(); } } //JankenHand package jp.codeprep.janken; public enum JankenHand { Rock, Scissors, Paper; @Override public String toString(){ switch (this) { case Rock: return "✊"; case Scissors: return "✌"; case Paper: return "✋"; } throw new IllegalStateException(); } } //実行結果: >javac jp/codeprep/janken/*.java >java jp/codeprep/janken/Main Taro: ✋ - ✌ :Hanako コードの中の「switch」の警告が出ますが、とりあえず 期待する結果になっています。
guest

0

ベストアンサー

Windows 11、OpenJDK 22.0.1、コマンドプロンプトで確認しました。

コマンドプロンプトをUTF-8に変更するには

chcp 65001

と叩きます。
その後、そのプログラムを実行すると、文字化けしないで表示できます。

イメージ説明

元のShift_JISに戻すには、コマンドプロンプトを開き直すか、

chcp 932

と叩きます。

投稿2024/08/23 22:36

hiroki-o

総合スコア1143

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

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

sanchunaka

2024/08/24 02:31

回答ありがとうございます。試したところ 問題が解決しました! ベストアンサーに選ばせていただきました。 教えていただいた事は何回も実施していたのですが、 質問のような結果でした。 疲れて、シャットダウンして今朝実行したら何もしていないのに、目的の結果に正常動作しました。 クッキーが関係していたのかもと思っていますが、 よくわかりません。 助かりました。
jimbe

2024/08/24 08:48

クッキーというのは恐らく web のクッキーのことかと思います。であればそれは web ブラウザと web サーバにしか関係ありませんので、コマンドプロンプトで実行する java アプリにはありません。
otn

2024/08/24 14:19

> 疲れて、シャットダウンして今朝実行したら何もしていないのに、目的の結果に正常動作しました。 昨日は、コードページ932ではだめで、65001でないと表示できなかったのに、 今日は、コードページ932でも表示できたのなら、 ・実行したプログラムが違う ・実行したプログラムは同じだが実行の仕方が違う などが原因です。
guest

0

今までコマンドプロンプトでJavaを実行してきましたが、
VSCodeで実行できるようになりましたので、お知らせします。
VSCodeでJavaを実行できるようにするには、サイトに設定など多数出ています。
それが終わているにもかかわらず、シンボルが見つかりませんなどのエラーが出て
うまく実行できないでいましたが、ちょとしたことで出来るようになりました。
VSCODEの右上に「▷」の実行ボタンがあります。そのすぐ横に「v」があり、
それをクリックすると、「Run Code」「Run Java」「Debug Java」と出てきます。
「Run Java」「Debug Java」のどちらかをクリックすると、
無事に正しい実行結果が得られました。
私は独学で、周りにはプログラミングについて聞ける人がいません。
私のように初心者で分からなくて困っている人がいるかもと思い投稿します。

投稿2024/08/27 13:50

sanchunaka

総合スコア26

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

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

0

コマンドプロンプトの設定が間違っていました。

chcp 65001でUTF-8に切り替えて、

フォントの設定をしていなかったので「MSゴシック」に設定しました。
これで期待する結果がえられました。

投稿2024/08/26 03:43

sanchunaka

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問