enum实战之石头剪刀布

本文通过实现一个简单的“石头剪刀布”程序,熟悉Java枚举类型(enum)多路分发的使用。

需要用到的类主要是以下四个:

  1. 游戏主体RoShamBo:包括ROCK,SCISSORS,PAPER三种动作;
  2. 对战结果Outcome:包括WIN,LOSE,DRAW三种对战结果;
  3. 对战接口Competitor:包括对战方法compete();
  4. 逻辑验证RoShamBoSample:随机生成对战数据,验证对战结果。
详细代码如下:

1,Outcome.java:

package com.sample.roshambo;

public enum Outcome {
    WIN, LOSE, DRAW;
}
2,Competitor.java:
package com.sample.roshambo;

public interface Competitor<T extends Competitor<T>> {
    Outcome compete(T competitor);
}
3,RoShamBo.java:
package com.sample.roshambo;

public enum RoShamBo implements Competitor<RoShamBo> {

    ROCK(Outcome.DRAW, Outcome.WIN, Outcome.LOSE), SCISSORS(Outcome.LOSE, Outcome.DRAW, Outcome.WIN), PAPER(
            Outcome.WIN, Outcome.LOSE, Outcome.DRAW);

    private Outcome vsRock, vsScissors, vsPaper;

    private RoShamBo(Outcome vsRock, Outcome vsScissors, Outcome vsPaper) {
        this.vsRock = vsRock;
        this.vsScissors = vsScissors;
        this.vsPaper = vsPaper;
    }

    @Override
    public Outcome compete(RoShamBo competitor) {
        switch (competitor) {
            default:
            case ROCK:
                return vsRock;
            case SCISSORS:
                return vsScissors;
            case PAPER:
                return vsPaper;
        }
    }

}

4,RoShamBoSample:

package com.sample.roshambo;

import java.util.Random;

public class RoShamBoSample {

    private static final int MATCH_NUM = 10;

    private static <T extends Enum<T>> T random(Class<T> enumClass) {
        T[] values = enumClass.getEnumConstants();
        if (values.length < 1) {
            throw new IllegalArgumentException(enumClass.getSimpleName() + " has no constant");
        }
        return values[new Random().nextInt(values.length)];
    }

    private static <T extends Enum<RoShamBo> & Competitor<T>> Outcome match(T competitor1, T competitor2) {
        Outcome outcome = competitor1.compete(competitor2);
        System.out.println(competitor1 + " VS " + competitor2 + " : " + outcome);
        return outcome;
    }

    public static void main(String[] args) {
        for (int i = 0; i < MATCH_NUM; i++) {
            RoShamBo roShamBo1 = random(RoShamBo.class);
            RoShamBo roShamBo2 = random(RoShamBo.class);
            match(roShamBo1, roShamBo2);
        }
    }

}
其中一次的验证数据如下:
SCISSORS VS SCISSORS : DRAW
PAPER VS SCISSORS : LOSE
PAPER VS ROCK : WIN
SCISSORS VS ROCK : LOSE
SCISSORS VS SCISSORS : DRAW
PAPER VS ROCK : WIN
PAPER VS PAPER : DRAW
PAPER VS ROCK : WIN
SCISSORS VS ROCK : LOSE
PAPER VS ROCK : WIN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值