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

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

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

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

Q&A

解決済

2回答

5153閲覧

Java:じゃんけんゲームでの「2連続で勝利した場合、同時にその方に-1pt」という処理を加えるには

masanori-

総合スコア9

Java

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

0グッド

0クリップ

投稿2018/09/18 07:30

編集2018/09/19 09:00

前提・実現したいこと

今私は研修でJavaを使って「じゃんけんゲーム(先に3勝したら勝ち)」という内容のプログラミングをしております。
上記の内容の動作は完了しており、付け加える形として「2連続で勝利した場合、その方に-1pt」という処理を加えたいと考えております。

下記はメインのメソッドだけを貼り付けさせて頂きました。
//勝ち負け判定のどこかに「2連続で勝利した場合、同時にその方に-1pt」の処理を打ち込むであろう。というところまでは考察できるのですが、
ifを使うのか、switchを使うのかといった部分や条件式の中身はどのように打ち込めばいいのか分かりません。

■■■追加詳細■■■

「2連続で勝利した場合、同時にその方に-1pt」
例えば、
1回戦目 playerが勝ち:CPUが負け スコア【1pt:0pt】
2回戦目playerが勝ち:CPUが負け スコア【2pt:0pt】
しかしここでplayerが2連勝なので、-1pt スコア【1pt:0pt】
3回戦目



というような流れの処理となるようにと作りたいです。

2連勝して-1ptの処理が発生した後は、連勝のカウントをリセットし、続きを始めます。
2連勝後にまた勝っても何もなくその後2連勝するとまた-1ptされ、その場合は一旦スコアが「player 3pt: CPU 0pt」となりますが、表示されるスコアは「player 2pt: CPU 0pt」となるようにしたいと考えております。

根本的に間違ったコードを書かいているのか、ベースはあっているのか、要素が足りないなどを教えて頂ければと存じます。

■■■■■■■■■■■■■■

なにぶん、初心者なもので質問の仕方に不備があったり、もっと詳しくといったことでも出来ればコメント頂ければと思います。

どなたかよろしければ、回答をお願い致します。

該当のソースコード

int lastWinner = 0; //もし、playerが「勝ち」ならlastWinner=1のフラグが立つ/* if(result == S結果.勝ち) { lastWinner = 1; } //もし、1のフラグかつ勝負の結果が勝ちならplayerは-1pt、そしてフラグをリセット/* if(lastWinner == 1 && S結果.勝ち) { playerPt--; lastWinner = 0; } //もし、playerが「負け」ならlastWinner=2のフラグが立つ/* if(result == S結果.負け) { lastWinner = 2; } //もし、2のフラグで、かつ勝負の結果が負けならCPUは-1pt、そしてフラグをリセット/* if(lastWinner == 2 && S結果.負け) { cpuPt--; lastWinner = 0; } //S結果のメソッド/* package janken; import janken.Enums.S手; import janken.Enums.S結果; public class Janken { /** Playerの手 */ private S手 playerHand; /** CPUの手 */ private S手 cpuHand; /** * コンストラクタ * * Playerの手と、CPUの手をセット * @param playerHand Playerの手 */ Janken(S手 value) { this.playerHand = value; this.cpuHand = this.getRandomHand(); } /** * 勝ち負け判定 * * @return 結果 */ public S結果 judge() { //勝ち if((this.playerHand == S手.グー && this.cpuHand == S手.チョキ) || (this.playerHand == S手.チョキ && this.cpuHand == S手.パー) || (this.playerHand == S手.パー && this.cpuHand == S手.グー)) { return S結果.勝ち; } //あいこ if(this.playerHand == this.cpuHand) { return S結果.あいこ; } //上記以外は負け return S結果.負け; } /** * PlayerとCPUの手を返却(表示用) * * @return PlayerとCPUの手を返却 */ public String getInputHand(){ return "Playerの手:" + this.playerHand + "、CPUの手:" + this.cpuHand; } /** * ランダムの手を返却 * * @return コンピューターの手 */ private S手 getRandomHand() { // ランダムでグー、チョキ、パーを決定し返却 int hand = (int)(Math.random() * 3) + 1; return S手.getEnum(hand); } }

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

エディタはVSCodeを使用しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/18 07:43

>//勝ち負け判定のどこかに「2連続で勝利した場合、同時にその方に-1pt」の処理を打ち込む これが答えではないかと思うのですが、何がどういう風に分からないのか具体的に書いたほうが回答がきやすいと思います^^
masanori-

2018/09/18 07:57

ありがとうございます。加える場所はあってるみたいで安心しました。もう少し噛み砕いて投稿してみます!
fuzzball

2018/09/19 02:16

3連勝した場合の3戦目は-1されるのでしょうか?それとも2連勝した時点で一旦クリアされるのでしょうか?
masanori-

2018/09/19 03:33

ありがとうございます。その後は連勝のカウントをリセットしたいです。そこまで考えてませんでした、、すみません。改めて追加詳細を提示致します。
guest

回答2

0

ベストアンサー

「2連続で勝利した場合、同時にその方に-1pt」

の仕様がどういうことかよくわかりませんが、以下のような変数を追加すれば判定は可能かと思います。

  • 直前のじゃんけんの勝者を保存しておく変数
  • 連勝数を保存・更新する変数(↑の変数を使って連勝を判断できるはずです。)

※「2」連続の場合であれば直前のじゃんけんの勝者を保存しておく変数だけで判定可能です。
3連続以上を計測するなら連勝数を記録する必要があります。


また、じゃんけんの人数が2人だけの場合、どちらかを基準にしておけばカウントする変数だけで済みそうです。

  • プレイヤーが勝った場合、カウントが0以下であればカウントを1とし、カウントが1以上なら+1を加える
  • CPUが勝った場合、カウントが0以上であればカウントを-1とし、カウントが-1以下なら-1を加える

[追記]「 && のオペランド型が不正です」について

2つ目のif文の比較の仕方が1箇所間違っています。
上のif文の条件文と見比べればわかるかと思いますが、以下がヒントです。

  • &&の左右は必ず真偽値(true/false)である必要があります(true, false, 条件文)

[更に追記]
提示された1つ目のif文は以下のように書いており、

java

1if(result == S結果.勝ち) {

2つ目のif文は以下のように書いています。

java

1if(winFlag =true && S結果.勝ち) {

1つ目のif文のresult == S結果.勝ちと、2つ目のif文のwinFlag =trueはどちらも
「同じかどうか」の比較をしたいようですが、1つ目のif文は正しい比較を行っていて、
2つ目のif文の方は比較の式になっていません。
(代入の式になっているので、真偽値になりません。)

[またまた追記]

上記の件に加えて、&&の右側でも間違いがありました。
そちらは「じゃんけんの結果が勝ち」という条件が来るはずなので、
resultS結果.勝ちを比較する必要があります。


[追記2] 2連勝の判定について

追記されたコードではCPUの2連勝判定ができていません。
(プレイヤーのみ2連勝の制約があるのであれば問題ないですが。)
CPUにも2連勝判定が必要であればint型で以下のような判定をするなどが必要でしょう。

  • 判定用変数が0であれば直前の勝者なし(一番最初)
  • 判定用変数が1であれば直前の勝者はプレイヤー
  • 判定用変数が2であれば直前の勝者はCPU

[更に追記]
上記をご提示いただいたコードのように示すと以下のようになります。
※これでやりたいことができる保証はないです。
あくまでも判定用変数の使い方の例です。

java

1// 前回の勝者を格納する変数 2int lastWinner = 0; 3 4/* ...省略... */ 5 6// プレイヤーの2連勝判定 7if (lastWinner == 1 && S結果.勝ち) { 8 playerPt--; 9 // 前回の勝者のリセット 10 lastWinner = 0; 11} 12 13/* ...省略... */ 14 15// CPUの2連勝判定 16if (lastWinner == 2 && S結果.負け) { 17 cpuPt--; 18 // 前回の勝者のリセット 19 lastWinner = 0; 20}

投稿2018/09/18 07:55

編集2018/09/19 09:10
dice142

総合スコア5158

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

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

masanori-

2018/09/19 02:06

返信が遅くなり申し訳ございません。 回答ありがとうございます。 「2連続で勝利した場合、同時にその方に-1pt」こちらをもう少し分かり易くするべきでした。 1回戦目 playerが勝ち:CPUが負け スコア【1pt:0pt】 2回戦目playerが勝ち:CPUが負け スコア【2pt:0pt】 しかしここでplayerが2連勝なので、-1pt スコア【1pt:0pt】 3回戦目 ・ ・ ・ というような流れの処理となるようにと作りたいです。
masanori-

2018/09/19 02:08

今回のは2人のじゃんけんなので、playerを基準にカウントをしたいと思います。
fuzzball

2018/09/19 03:48 編集

たくさんの情報が書かれていて、必要な情報を拾えてないように見えますが、 今回の質問(2連勝の判定)に必要なのは、 >>直前のじゃんけんの勝者を保存しておく変数 これだけです。
dice142

2018/09/19 03:56

> fuzzball様 補足ありがとうございます。 3連勝の判定も不要のようなのでその条件のみで良さそうですね。
masanori-

2018/09/19 04:13

fuzzballさん、dice142さんありがとうございます。 「直前のじゃんけんの勝者を保存しておく変数」 これだけです。 なるほどです。コードはシンプルになるということでしょうか? 先ほど、追加詳細と現状を 「前提・実現したいこと」にて更新させて頂きました。 恐れ入りますが、アドバイスをお願い致します、、
dice142

2018/09/19 04:24

> masanori-様 >>コードはシンプルになるということでしょうか? 変数の追加が1つだけで済むという意味です。 今回の内容では既存のコードがよりシンプルになるわけではないです。 >> 追加詳細と現状を 「前提・実現したいこと」にて更新させて頂きました。 回答に追記しました。
masanori-

2018/09/19 05:24

dise142さんありがとうございます。 真偽値の意味を十分に理解しておりませんでした。 となると、今回真偽値の要素は関係なさそうに思いましたが真偽値を用いて進めるものなのでしょうか? CPUの判定が確かに抜けておりました。 あと、補足も抜けておりました。今回のじゃんけんアプリはplayerが勝利するか負けるかの判定でございます。 なのでCPUが3点取り勝利した場合表示にはplayerの負けと表示されます。 今回の私の質問内容に関係性があるのか分かりませんが、それを踏まえて改めてアドバイスをよろしくお願いできればと思います、、
dice142

2018/09/19 05:44

真偽値の件については回答に追記しました。 CPUの判定は質問外なのでこちらに書きます。 現状の状態では以下のように ・プレイヤーは2連勝したら-1点となる ・CPUは2連勝しても-1点にならない という感じになっています。 つまり、プレイヤーは連続3回勝っても3点にたどり着かないのに対し、 CPUは連続3回勝てば3点にたどり着けるというゲームになるので プレイヤーに不利なものになってしまいます。 これは仕様上の問題なので、今回の質問とは別な問題ではありますが、 気になったので追記した次第です。
masanori-

2018/09/19 06:11

dice142さん、お世話になっております。 真偽値ではない条件式だとどのようになりますでしょうか? せっかくヒントをいただいているのに申し訳ございませんが、そこからの閃きが降りてこずです、、 あと、 定義は int win = 0; //直前の勝者なし int playerWin = 1; // 直前の勝者player int cpuWin = 2; //直前の勝者CPU と定義しようかと思います。
dice142

2018/09/19 06:20

> 真偽値ではない条件式だとどのようになりますでしょうか? 真偽値ではない条件式は条件式とは言いません。 今回の問題となっている点は、「==」による比較をしたいのに「=」の代入を行ってしまっていることです。 ケアレスミスが起きているので修正しましょうという指摘ですね。
masanori-

2018/09/19 06:41

なるほどです。 ご指摘ありがとうございます。 if(winFlag = true && S結果.勝ち)→if(winFlag == true && S結果.勝ち) ということですね。 しかしこの部分を修正しても私の制作したい実装内容としては完成に近づいてるのでしょうか?
dice142

2018/09/19 06:49

> if(winFlag = true && S結果.勝ち)→if(winFlag == true && S結果.勝ち) > ということですね。 そういうことです。 > この部分を修正しても私の制作したい実装内容としては完成に近づいてるのでしょうか? むしろエラーが出るところを修正しないことで完成は近づきません。 本質問を通り越して最終的にどのようなものになれば良いのかは私にはわかりませんが、 少なくとも一歩ずつ進んでいるのは間違いないと思います。
dice142

2018/09/19 06:51

初回の質問と追記されたエラーが解決されたら、本質問自体を解決済みにされるとよいかと思います。 追記ばかりになっていると、後で見返したときにどういう流れで解決に至ったのかわからなくなってしまう恐れがあります。
masanori-

2018/09/19 06:56

ありがとうございます! しかし、定義は int win = 0; //直前の勝者なし int playerWin = 1; // 直前の勝者player int cpuWin = 2; //直前の勝者CPU と定義して、playerとPCUにも効果を出したいと考えておりますのでwinFlag改め、上記の定義に差し替えていこうと考えておりますが、そうすると完成が遠ざかるといった事はないでしょうか?
dice142

2018/09/19 07:10

なるほどそういう意味合いでしたか。 たしかに途中でCPUの2連勝も考慮に入れる話になってましたね。 とはいえ、そこまで遠回りにはならないはずです。 うまく伝わっていないようなので回答に追記しましたが、winFlagでtrueかどうかを判定していたものを statusで0か1か2かを判定するように変更するので、遠ざかるというほどマイナス印象に思わなくて大丈夫ですよ。
masanori-

2018/09/19 07:28

はい、ありがとうございます。 ソースコードもありがとうございます。感謝です。。 いただいたコードの各「//省略」の中身は 1つ目if(result == S結果.勝ち) { 2つ目if(result == S結果.負け) { が入るのでしょうか?
dice142

2018/09/19 07:36

そういうものも含めて、ですね。 コードは結構長いので全部示すのは面倒なので省略しましたが、 ・「int lastWinner = 0」の初期化はどこに入れるのか、  →これはコード全体を見てどこで初期化するのか考えてみましょう。 ・「lastWinner」の更新はどこで行うのか、  →これは今提示してもらったif文に入るものかと。 に注目してみてください。
masanori-

2018/09/19 08:25

ありがとうございます。 「int lastWinner = 0」の初期化はメインメソッドの下の行に書きました。 「前提・実現したいこと」の中に今回の追加要素をdice142さんのコードを参考に作り上げてみました。 しかしコンパイルしますと 「&&」のオペランド型が不正です。 最初の型:boolean 2番目の型:S結果 という風なエラーが出ました。 間違っている部分はどこか、教えて頂けないでしょうか?
dice142

2018/09/19 08:30

S結果というものがどんなクラスなのかがわからないので 推測でしか書けませんが、「S結果.勝ち」というものが S結果インスタンスを返してるのが原因かと思います。
masanori-

2018/09/19 08:50

すいません、インスタンス(実体)を返すとは、引数として引き出されたが、跳ね返された。というニュアンスでしょうか? 、、全然間違えていたらすみませんが回答をお願い致します。 ちなみにS結果は public S結果 judge() { //勝ち if((this.playerHand == S手.グー && this.cpuHand == S手.チョキ) || (this.playerHand == S手.チョキ && this.cpuHand == S手.パー) || (this.playerHand == S手.パー && this.cpuHand == S手.グー)) { return S結果.勝ち; } //あいこ if(this.playerHand == this.cpuHand) { return S結果.あいこ; } //上記以外は負け return S結果.負け; } このようなコードとなってます。
dice142

2018/09/19 08:55

> インスタンス(実体)を返すとは、引数として引き出されたが、跳ね返された。というニュアンスでしょうか? メソッド中のreturnで返される値の型がS結果のインスタンス、という意味です。 こちらにコードを貼っていただいたのですが、できればS結果クラス全体を 質問文に追記していただけますか?
masanori-

2018/09/19 08:59

分かりました。追記いたします。
masanori-

2018/09/19 09:00

今お貼りいたしました。ご確認宜しくお願い致します。
dice142

2018/09/19 09:07

Enumを使っていたのですね。納得しました。 さて、「S結果.勝ち」ですが、これは勝敗を定義したものですよね? 実際の勝敗はresultという変数に格納されていて、それと「S結果.勝ち」を 比較するのが正しい書き方です。 (実際、直前のif文ではそういう書き方をしてますね。) 「... && S結果.勝ち」を「... && result == S結果.勝ち」とすれば エラーはなくなると思われます。
masanori-

2018/09/20 01:38

お世話になっております。 diceさんのアドバイスのもと、無事エラーが解消されました。 本当にありがとうございます。 しかし、追加処理を加える以前はスコアが正常に動作しておりましたが、 動作確認で一つ「勝っても負けてもスコアが反映されない」という状態になっております、、 おそらく「-1ptする」の処理が勝負の結果全てに反応していると考え 今回付け足した if文 に break を付けてみるというのを試みたのですが駄目でした。 いったいどの部分が悪いのか、 今一度サポート頂けないでしょうか?
masanori-

2018/09/20 01:39

ソースコードを「 前提・実現したいこと」に更新致しますので見て頂ければと思います。
dice142

2018/09/20 02:04

エラーが解消されたようでなによりです。 最初の質問が解消されたのでしたら、一度質問を解決済みにし、 新たに別な質問として投稿することをおすすめします。 後日振り返ってここの質問・回答を見たときに、質問文と回答のズレが生じます。 masanori-様のじゃんけんゲームを完成することが本質問の終わりではなく、 あくまでも連勝処理に関する質問が本質問の終わりであることをご理解ください。 新たな「勝っても負けてもスコアが反映されない」に関しては 連勝処理を実装した上のでバグとして、新たに質問していただければ幸いです。 (コメントのやりとりが長くなってしまうのも振り返ったときに見にくいものなので。)
masanori-

2018/09/20 02:11

ありがとうございます。teratailのやり方までご指導頂き本当に助かっております。 新たに質問を作成させて頂きます。
swordone

2018/09/20 02:40

普通に人が判断するのと同じようにコンピュータに判断させるだけで、そのための情報をわかる形で提示すればいいだけの話なんだけどな
guest

0

・前回勝ったフラグを用意しておく
・勝ったらそのフラグを立てる
・負けたらそのフラグを下ろす
・勝ったときにそのフラグが立っていれば-1pt、そしてフラグを下ろす

投稿2018/09/18 07:40

y_waiwai

総合スコア87747

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

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

masanori-

2018/09/18 07:55

回答、ありがとうございます。 その流れを参考に組み立ててみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問