

Johnの手はグー、パー、チョキ、グー・・・と出力し、Paulの手はランダムに出力するプログラムを作成したいと思い、以下のようにしたのですが、Johnの手が期待しているのとは違って出力されてしまいます。  
（ちなみに、このじゃんけんプログラムは３回先に勝ったほうが勝ちとしています）

どうすれば（OrderedComputerPlayerのどこをどう直せば）、期待している実行結果となりますか。よろしくお願いいたします。

[code]

    /** ジャンケン の通常のコンピュータ プレイヤ */
    public class OrderedComputerPlayer extends Player {
        protected Hand  goo, choki, par;
        // 手を決めるときに使う乱数
    
        /** コンストラクタ, プレイヤの名前を指定する */
        public OrderedComputerPlayer(String name) {
        super(name);
        // 手を設定する
        goo = new Goo();
        choki = new Choki();
        par = new Par();
        
        }
    
        /** match回目の勝負のnum回目のプレイヤの手を出す
         *  Player の showHand をオーバーライド
         */
        public Hand showHand(int match, int num) {
            
        switch(num%4){
        case 1: return goo;
            case 2: return par;
            case 3: return choki; 
            case 0: return goo; 
            }num++;  return goo;
        }
    }
    
[/code]

[code]

    /** ジャンケン の通常のコンピュータ プレイヤ */
    public class NormalComputerPlayer extends Player {
        protected Hand  goo, choki, par;
        protected java.util.Random random; // 手を決めるときに使う乱数
    
        /** コンストラクタ, プレイヤの名前を指定する */
        public NormalComputerPlayer(String name) {
        super(name);
        // 手を設定する
        goo = new Goo();
        choki = new Choki();
        par = new Par();
        random = new java.util.Random();
        }
    
        /** match回目の勝負のnum回目のプレイヤの手を出す
         *  Player の showHand をオーバーライド
         */
        public Hand showHand(int match, int num) {
        int hand = random.nextInt(3);
        if (hand == 0) {
            return goo;
        } else if (hand == 1) {
            return choki;
        } else {
            return par;
        }
        }
    }
    
[/code]

[code]

    /** ジャンケンを開始するためのクラス */
    public class Janken {
        public static void main(String args[]) {
        try {
            Judge judge = new Judge(); // 審判の作成
    
            // プレイヤの作成と審判への登録
            Player jhon = new OrderedComputerPlayer("Jhon");
            judge.registPlayer(jhon);
            Player paul = new NormalComputerPlayer("Paul");
            judge.registPlayer(paul);
    
            // 3回勝負でジャンケンの開始
            judge.startJankens(3);
        }
        catch (JankenException e) {
            System.err.println("Error: " + e.getMessage());
        }
        }
    }
    
[/code]

[code]

    /** ジャンケン プレイヤの抽象クラス */
    public abstract class Player {
        protected String name;     // プレイヤの名前
        protected int    matches;  // matches回勝負(matches回先に勝った方が勝ち)
        protected int    wins;     // プレイヤの勝利数
        protected int    losts;    // プレイヤの負け数
    
        /** コンストラクタ, プレイヤの名前を指定する */
        public Player(String name) {
        this.name = name;   // プレイヤの名前
        wins = losts = 0;   // 勝敗を初期化
        }
    
        /** プレイヤの名前を返す */
        public String getName() {
        return name;
        }
    
        /** 何回勝負か設定するメソッド
         */
        public void setMatches(int matches) {
        this.matches = matches;
        }
    
        /** 
         *   勝ったことを知らされるメソッド
         */
        public void youWon() {
        wins++;
        }
    
        /** 
         *   負けたことを知らされるメソッド
         */
        public void youLost() {
        losts++;
        }
    
    
        /** match回目の勝負のnum回目のプレイヤの手を出す
         *   抽象メソッドなので，サブクラスでオーバーライドする
         */
        public abstract Hand showHand(int match, int num);
    }
    
[/code]

**実行結果:**

[code]

    $ java Janken
    Match 1: Jan Ken Pon!
    Match 1-1:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-2:
    Jhon's hand is Par
    Paul's hand is Goo
    
    Match 1: Jhon won.
    
    Match 2: Jan Ken Pon!
    Match 2-1:
    Jhon's hand is Goo
    Paul's hand is Par
    
    Match 2: Paul won.
    
    Match 3: Jan Ken Pon!
    Match 3-1:
    Jhon's hand is Goo
    Paul's hand is Choki
    
    Match 3: Jhon won.
    
    Match 4: Jan Ken Pon!
    Match 4-1:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 4-2:
    Jhon's hand is Par
    Paul's hand is Choki
    
    Match 4: Paul won.
    
    Match 5: Jan Ken Pon!
    Match 5-1:
    Jhon's hand is Goo
    Paul's hand is Choki
    
    Match 5: Jhon won.
    
    Jhon is a champion.
    Jhon: 3 wins
    Paul: 2 wins
    
[/code]

<<続き>>  
ご指摘ありがとうございます。  
switch(match%4)としたところ、以下のようになりました

[code]

    $ java Janken
    Match 1: Jan Ken Pon!
    Match 1-1:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-2:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-3:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-4:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-5:
    Jhon's hand is Goo
    Paul's hand is Choki
    
    Match 1: Jhon won.
    
    Match 2: Jan Ken Pon!
    Match 2-1:
    Jhon's hand is Par
    Paul's hand is Par
    
    Aiko de Sho
    Match 2-2:
    Jhon's hand is Par
    Paul's hand is Goo
    
    Match 2: Jhon won.
    
    Match 3: Jan Ken Pon!
    Match 3-1:
    Jhon's hand is Choki
    Paul's hand is Par
    
    Match 3: Jhon won.
    
    Jhon is a champion.
    Jhon: 3 wins
    Paul: 0 wins
    
[/code]

これだと、matchが変わるごとにJohnの手が変わってしまい、期待している結果

[code]

    $ java Janken
    Match 1: Jan Ken Pon!
    Match 1-1:
    Jhon's hand is Goo
    Paul's hand is Goo
    
    Aiko de Sho
    Match 1-2:
    Jhon's hand is Par
    Paul's hand is Goo
    
    Match 1: Jhon won.
    
    Match 2: Jan Ken Pon!
    Match 2-1:
    Jhon's hand is Choki
    Paul's hand is Par
    
    Match 2: Jhon won.
    
    Match 3: Jan Ken Pon!
    Match 3-1:
    Jhon's hand is Goo
    Paul's hand is Par
    
    Match 3: Paul won.
    
    Match 4: Jan Ken Pon!
    Match 4-1:
    Jhon's hand is Goo
    Paul's hand is Par
    
    Match 4: Paul won.
    
    Match 5: Jan Ken Pon!
    Match 5-1:
    Jhon's hand is Par
    Paul's hand is Goo
    
    Match 5: John won.
    
    Jhon is a champion.
    Jhon: 3 wins
    Paul: 2 wins
    
[/code]

のようになりません。

自分のプログラムでは

[code]

    public Hand showHand(int match, int num) {
            
        switch(num%4){
        　　case 1: return goo;
            case 2: return par;
            case 3: return choki; 
            case 0: return goo; 
            }num++;  return goo;
        }
    
[/code]

となっており、一番最後にreturn goo;としていることで  
おそらく勝敗が決まるごとにわざわざリセットされて、グーから始まるのだとは思いますが、return goo;がないとエラーとなってしまいます。

ここで、勝敗が決まっても関係なく、グー、パー、チョキ、グー・・・とするにはどうしたらいいですか。


CC BY-SA 4.0
2021-07-21T07:37:12.303
78338
2021-07-22T10:37:13.480
2021-07-22T07:39:00.137
3060
46879
question
java
Javaでじゃんけんプログラムを作る


まだ省略されているコードがあるように見えるので憶測を含みますが、`num` 回目の変数は `match`
勝負目に応じて都度リセットされるわけですから「ゲームを通して今何回目か」を管理する別の変数を用意し、そちらでどの手を出すか決めるようにすれば良さそうです。

つまり、`showHand` に渡すのは、`match` や `num` じゃなくて「今何回目か」を表す変数に変更する。


CC BY-SA 4.0
2021-07-22T10:37:13.480
78361
2021-07-22T10:37:13.480
3060
78338
answer