

以下のプログラムでは、手がランダムに出されるのですが、これを少し変えて  
パー、グー、チョキ、パー、グー、チョキ・・・  
のように規則性があるように手を出させるためにはどうしたら良いですか。

[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 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]


CC BY-SA 4.0
2021-07-14T13:06:11.417
78185
2021-07-15T01:27:46.343
2021-07-15T01:27:46.343
9820
46879
question
java
じゃんけんプログラムを規則性のあるパターンに置き換えたい


特定個数のパターン配列を繰り返し表示するには剰余算(余り計算)の利用が一般的な解法です。

第三者にも役立ちそうな規則性のあるパターンとして、曜日の連続表示を例に出します。

曜日の連続表示をするには、"月","火",..."日" という7個の配列を持ち、"日"の次にまた"月"を表示します。  
これはパー、グー、チョキのパターンを7個の配列に拡大しただけなので、仕組みが分かればじゃんけんゲームにも応用可能です。

下記のサンプルコードでは`i`が100回増分するfor文で `i % 7` によって剰余として0から6の数値をループしながら取得できます。  
これで"月","火",...と配列を表示して"日"の次にまた"月"を表示する規則的な繰り返し処理を実現しています。

`0 % 7 == 0`  
`1 % 7 == 1`  
`2 % 7 == 2`  
...  
`7 % 7 == 0`  
`8 % 7 == 1`  
`9 % 7 == 2`

**サンプルコード**

[code]

    public class Test {
        public static void main(String[] args) {
            String dayOfWeeks = "月火水木金土日";
            for(int i = 0; i < 100; i++) {
                // 0から6を連続して求める 0,1,2,3,4,5,6,0,1,2...
                int joyo = i % 7;
                // dayOfWeeksのchar配列パターンを表示する
                System.out.println(dayOfWeeks.charAt(joyo));
            }
        }
    }
    
[/code]

ご質問のコードも「手がランダムに出される」部分を剰余のコードに置き換えることで解決できます。

サンプルコードでは`CharSequence#charAt`を使って1文字ずつ配列化していますが、じゃんけんゲームに転用する場合は配列でもswitch文でもお好みの方法で実装してください。


CC BY-SA 4.0
2021-07-15T01:26:37.773
78190
2021-07-15T01:26:37.773
9820
78185
answer