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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

5回答

2305閲覧

JAVAでじゃんけんあいこしか出ず。

pirikinoko

総合スコア2

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2021/09/09 09:06

編集2021/09/10 09:18
java初心者です初めての課題として javaで基礎的なじゃんけんのゲームを作っています。 ですがグー、チョキ、パーのいずれを入力してもあいこになってしまいます。 それと別問題かもしれませんがインスタンスの生成時にstaticとうたないとエラーが出るので仕方なく打っているのですがそこについてもお聞きしたいです。 ここに質問の内容を詳しく書いてください。 (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生しました。 ### 発生している問題・エラーメッセージ 必ずあいこになる

JAVA

1package myfirstone; 2import java.util.Random; 3import java.util.Scanner; 4 5public class Myfirstclass { 6 7 public static void main(String[] args) { 8 Scanner scanner = new Scanner(System.in); 9 10 System.out.println("グー、チョキ、パーのいずれかを入力してください"); 11 String pon = scanner.nextLine(); 12 scanner.close(); 13 System.out.println("あなたは" + pon + "を出しました。"); 14 System.out.println("-----------------------"); 15 Random rand = new Random(); 16 int teki = rand.nextInt(3); 17 switch (teki) { 18 case 0: 19 System.out.println("相手はグーを出しました"); 20 break; 21 case 1: 22 System.out.println("相手はチョキを出しました"); 23 break; 24 case 2: 25 System.out.println("相手はパーを出しました"); 26 break; 27 } 28 System.out.println("-----------------------"); 29 paa.janken(teki); 30 31 } 32 33}
```JAVA package myfirstone; public class paa { public static String pon; public static int teki; public static void janken(int teki) { if(pon=="グー" && teki==1 ||pon=="チョキ" && teki==2 || pon=="パー" && teki==0) { System.out.println("あなたの勝ちです"); } else if(pon=="グー" && teki==2|| pon=="チョキ" && teki==0||pon=="パー" && teki==1) { System.out.println("あなたの負けです"); } else { System.out.println("あいこです"); } } }

試したこと

入力をグー、チョキ、パーではなく数字に変えるとできたが、グー、チョキ、パーの入力で行いたい。

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

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

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

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

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

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

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

1T2R3M4

2021/09/09 09:09

java 文字列 比較 とかで調べてみてはいかがでしょうか。
BeatStar

2021/09/09 09:43

この課題の目的はなんでしょうか。 1. オブジェクト指向を理解するため 2. 単純にif文とかの理解のため 普通に考えると2だとは思いますが、1の可能性も捨てきれませんね。 単純に組めば2ですけど、1の場合は理解していないと出来ないし。
jimbe

2021/09/09 11:38

> 入力をグー、チョキ、パーではなく数字に変えるとできたが 恐らく、"あなた"は常にグーを出したと見なされて勝った負けたと出されていたのでは。
pirikinoko

2021/09/09 13:43

@1T2R3M4 どのように調べてよいかわからなかったのでありがとうございます。
pirikinoko

2021/09/09 13:45

@BeatStar この課題の目的はJAVAの基本的な文法を学んだあとに何を創ればいいのか分からずとりあえずわかりやすいじゃんけんをつくって知識をおさらいしつつどのように作るのか体験する目的です。
pirikinoko

2021/09/09 13:47

@jimbe 敵がパーの時もチョキの時もあいこになってしまうので常にグーというわけではないかもしれません。
BeatStar

2021/09/09 13:50

後、コードは"<code>"または"<コード>"のボタンがあるので、それを押して出てくるヤツの中に書いてください。
jimbe

2021/09/09 14:47

> 敵がパーの時もチョキの時もあいこになってしまうので すいません、現在の文字列にした場合のことではありませんで、 「入力を ~ 数字に変えると『できた』」 風に見えたのは、paa.pon が 0 なので勝敗が判定されていたからでは・・・という想像でした。
dodox86

2021/09/09 23:46

コードを書いて、コンパイルして実行して要望通り動いた・動かない、ではなく、1行1行理解して追ってみましたか?
BeatStar

2021/09/10 05:52

後、コードは"<code>"または"<コード>"のボタンがあるので、それを押して出てくるヤツの中に書いてください。 (二度目)
pirikinoko

2021/09/10 09:19

@jimbe そういうことでしたか、なるほど。
pirikinoko

2021/09/10 09:21

@dodox86 JAVAについての経験が浅く一行一行追って理解することすら厳しいですが何とかわからないところを紐解きつつやってみます。ありがとうございます。
pirikinoko

2021/09/10 09:22

@BeatStar すみません投稿の仕方間違っていたみたいですね多分直せたと思いますありがとうございます。
guest

回答5

0

pon=="グー"

これでは文字列の比較はできません

って、そもそもこの変数に代入してるところが見当たりませんが。。

投稿2021/09/09 10:19

編集2021/09/09 10:21
y_waiwai

総合スコア87774

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

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

pirikinoko

2021/09/10 08:24

回答ありがとうございます。文字列の比較についてもう少し調べてみます。
guest

0

ベストでてますが
この質問の問題は文字列比較でなく、paa.pon が未設定なことです。
※==でなくequalsを使うべきというのを否定するものではないです

なので

java

1 String pon = scanner.nextLine(); 2 scanner.close(); 3 System.out.println("あなたは" + pon + "を出しました。");

の部分を

java

1 paa.pon = scanner.nextLine().intern(); 2 scanner.close(); 3 System.out.println("あなたは" + paa.pon + "を出しました。");

とすると、「String Constant Poolの再利用」するので、==でも動作します。

投稿2021/09/14 02:33

momon-ga

総合スコア4820

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

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

pirikinoko

2021/09/16 06:08

具体的でわかりやすい回答ありがとうございます。 .intern()を知らなかったので調べてみます!!
guest

0

ベストアンサー

Javaでの文字列比較は、"==演算子" ではなく、equalsメソッドを使った方が安全のようです。

ヒント: 参考1

上記コードのif文の条件がtrueとなるので、値の比較ができているように錯覚してしまうかもしれませんが、これは参照先(アドレス値)の比較をして、String Constant Poolの再利用によって参照先(アドレス値)が同じだったためtrueとなるのです。なので、下記のような場合には成立しません。

とあるので、場合によってはうまくいかない可能性もありますね。

文字列を比較するときはequalsメソッドを使いましょう。

それに他の方も仰っているように、「フィールドpon が初期化も代入されていない」ですね。


[追記1]

それと別問題かもしれませんがインスタンスの生成時にstaticとうたないとエラーが出るので仕方なく打っているのですがそこについてもお聞きしたいです。

今回のメインとは別枠ですが、一応書いておきます。

まず、この問題をどうにかする前に、「オブジェクト指向とは何か」を理解する必要があります。

オブジェクト指向(以降 OOP) とは、データ(= フィールド)と処理(= メソッド)をひとまとめにしたオブジェクトを中心に見る発想法です。

C言語とかのような言語では、データと処理(関数)は別々でした。
でも、この関係するものをひとまとめにしたオブジェクトにすることで、運用しやすくしています。

対象データとその処理方法はオブジェクトだけが知っている」状態にできるので、
オブジェクトに管理や処理を任せる」ということが出来ます。

そう、C#で言えば Stringとかみたいなものですね。

質問者さんはこのStringに入っているデータの状態、完全に把握しますか?

そりゃ、もちろん、「今はディレクトリパスが入っている」とかみたいなものは把握するとは思いますが、
事細かに把握しますか?

しませんね。

文字列分割とかも、「String君、文字列を分割したものをくれないか?」とオブジェクトに依頼したりするだけですよね。

呼び出し側は実装がどうなっているのかは興味なく、単に特定の処理(文字列分割, 文字列置換 etc.) だけが興味あるのですよね。

そう、C言語の関数の範囲がオブジェクトレベルにまで広がった感じです。

ですが、勝手にオブジェクトを作って……とやると、コンパイラとかが理解できません。

いきなり、「これ、田中さんに渡して」とだけ言われるようなものです。
(いや、田中さんって誰よ???)

どの人を言っているのかを教えてくれないとわかりませんね。

そう、そういう情報を教えてあげないといけません。

で、その役割がクラスです。

「こういうデータ構造があるんで、よろぴく~」とコンパイラに教えてあげるのです。
(言語によってはインタプリタだったりするが)

で、普通、クラスのメンバ( フィールドやメソッド ) には staticは付けません。

C#

1public class ClassA{ 2 public ClassA( int n ){ 3 this.N = n; 4 this.name = "test"; 5 } 6 public void add( int a ){ 7 this.N += a; 8 } 9 10 // 他にもメソッド等がある 11 12 public int N{ get; set; } 13 14 private string name; 15}

みたいに。(上記サンプルは特に意味のないものですが)

そして、コンパイラとかに「このクラスでオブジェクトを作りますね~」と教えてあげる必要があります。

C#

1ClassA obj = new ClassA( 100 );

これによって、obj は N というデータや nameというデータをもったもので、
それに対する処理も完備しています。

これによって、N や name を管理したり処理したりするのは obj になります。

もちろん、一つのクラスから複数個のオブジェクトを作る事もできます。

とにかく、オブジェクトに管理を任せるのです。

でも、どうしても一つのメソッドで完結するような処理があります。

そういう場合は苦肉の策として、staticなメソッド等を使います。

ですが、これは オブジェクトに結びついたものではなく、クラスレベルでついています。

(イメージ的にはC言語の関数. 実際には別物だが, あくまでイメージとして)

なので、staticなメソッド内で自分クラスのメンバを使いたい場合でもインスタンス化(オブジェクトを生成すること)が必要です。

今回のように、paaクラスのjankenメソッドはstaticになっています。
そのため、ある意味、別のクラスからアクセスしているようなものとなり、
「おいおい、staticなやつから非staticなやつにアクセスできんぞ」と言っているのです。

クラスを組んだからOOP……ではありません。

フィールドとメソッドをひとまとめにして、そのオブジェクトに管理や処理を任せるための発想法がOOPです

投稿2021/09/09 13:58

編集2021/09/10 05:54
BeatStar

総合スコア4958

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

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

dodox86

2021/09/09 23:42

> Javaでの文字列比較は、"==演算子" ではなく、equalsメソッドを使った方が安全のようです。 安全かどうかと言うより、JavaにおいてはStringクラスで表される文字列の内容が同一かどうかという判定をするにあたって"=="の使用が不適切です。参考先のリンクの記事にもあるように、"=="は、参照の値自体の比較です。"=="の使用は、理解した上で目的次第でそれを使うにとどめるべきです。
BeatStar

2021/09/10 05:15

@ dodox86さん ですね。修正しておきます。
pirikinoko

2021/09/11 06:24

@dodox86 さん equalsメソッドというのを全く知らなかったので勉強します!
guest

0

インスタンスの生成時にstaticとうたないとエラーが出るので仕方なく打っているのですが

このコードの中で「インスタンスの生成」をしているのは Scanner と Random だけです。(どちらも "new クラス名(~)" という文があります。)
メソッドやクラス内に定義した変数に static を付けることは「インスタンスの生成時」と表現される事象では無く、単にそれらを「static とする」と宣言しているだけです。

static が必要とされているのは、janken メソッドを(paa クラスのインスタンスを経由せずに) paa.janken として呼び出している為でしょう。
"クラス名.メソッド名" という呼び出し方は(インスタンスを必要としない)クラスメソッドに可能なことで、クラスメソッドはインスタンスメソッドに static を付けた見た目になります。
paa.pon や paa.teki は現状使われていないようですので、static は有っても無くても構わない状態かと思います。

投稿2021/09/09 11:54

編集2021/09/11 08:06
jimbe

総合スコア12648

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

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

pirikinoko

2021/09/09 13:52

paa.pon と paa.teki にはstatic を付けるつもりはなかったのですがstaticを付けないと 「非staticフィールドponをstatic参照できません」と出てくるのでつけていた形です。 話は変わりますがこの場合インスタンスを生成してインスタンスメソッドでやったほうがいいですか??
jimbe

2021/09/09 14:42 編集

あ、すいません、pon はメソッド内で使ってましたね。(static な)クラスメソッド内で使っているので pon も static でなければなりません。 teki は…janken 内ではパラメータの teki が使われると思うのですが、teki も static をと言われますか? > この場合インスタンスを生成してインスタンスメソッドでやったほうが ~ それはやりたい方法次第です。 オブジェクトが必要となるのは、何かのデータ(変数)と処理(メソッド)を纏めて扱うと都合が良いと判断される場合です。 「この場合」はメソッドのパラメータでデータは十分なようですし、どちらでも大して違いはないでしょう。 ただ、全部 static だと「 java らしくない」とは言えると思います。
pirikinoko

2021/09/11 06:23

すみません、tekiのほうは大丈夫だったようです。 JAVAを使う上ではなるべくインスタンス使えるように頑張ります!!
dodox86

2021/09/11 08:22

> JAVAを使う上ではなるべくインスタンス使えるように頑張ります!! 横からですみませんが、きっとそれが早急な課題ですね。今はpaaクラスがありますが、これにGooやChokiクラスが増えたり複数人でのじゃんけんに対応させようとしたら、staticでは不自然かつ無理が出てくるはずです。jimbeさんが書かれているように、全部staticだと「Javaらしくない」し、一般的にそんな作りにはならないはずなのです。
pirikinoko

2021/09/16 06:11

そうですよね、まだまだ経験が浅いのでいろいろ課題が見つかってありがたいです。
guest

0

すべて解決したわけではないですが、行き詰っていたので皆さんの助言を一つ一つ紐解いて学習していきたいと思います。丁寧な回答ありがとうございました!!

投稿2021/09/11 06:26

pirikinoko

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問