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

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

ただいまの
回答率

87.79%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,496

score 9

 前提・実現したいこと

今私は研修で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を使用しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/09/18 16:43

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

    キャンセル

  • masanori-

    2018/09/18 16:57

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

    キャンセル

  • fuzzball

    2018/09/19 11:16

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

    キャンセル

  • masanori-

    2018/09/19 12:33

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

    キャンセル

回答 2

checkベストアンサー

+2

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

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

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

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


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

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

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

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

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

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

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

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

if(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

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

// 前回の勝者を格納する変数
int lastWinner = 0;

/* ...省略... */

// プレイヤーの2連勝判定
if (lastWinner == 1 && S結果.勝ち) {
  playerPt--;
  // 前回の勝者のリセット
  lastWinner = 0;
}

/* ...省略... */

// CPUの2連勝判定
if (lastWinner == 2 && S結果.負け) {
  cpuPt--;
  // 前回の勝者のリセット
  lastWinner = 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/20 11:04

    エラーが解消されたようでなによりです。

    最初の質問が解消されたのでしたら、一度質問を解決済みにし、
    新たに別な質問として投稿することをおすすめします。
    後日振り返ってここの質問・回答を見たときに、質問文と回答のズレが生じます。
    masanori-様のじゃんけんゲームを完成することが本質問の終わりではなく、
    あくまでも連勝処理に関する質問が本質問の終わりであることをご理解ください。

    新たな「勝っても負けてもスコアが反映されない」に関しては
    連勝処理を実装した上のでバグとして、新たに質問していただければ幸いです。
    (コメントのやりとりが長くなってしまうのも振り返ったときに見にくいものなので。)

    キャンセル

  • 2018/09/20 11:11

    ありがとうございます。teratailのやり方までご指導頂き本当に助かっております。

    新たに質問を作成させて頂きます。

    キャンセル

  • 2018/09/20 11:40

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/18 16:55

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

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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