您的位置:首页 > 其它

enum实战之石头剪刀布

2016-01-06 20:26 435 查看
本文通过实现一个简单的“石头剪刀布”程序,熟悉Java枚举类型(enum)多路分发的使用。

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

游戏主体RoShamBo:包括ROCK,SCISSORS,PAPER三种动作;
对战结果Outcome:包括WIN,LOSE,DRAW三种对战结果;
对战接口Competitor:包括对战方法compete();
逻辑验证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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息