enum实战之石头剪刀布
2016-01-06 20:26
435 查看
本文通过实现一个简单的“石头剪刀布”程序,熟悉Java枚举类型(enum)多路分发的使用。
需要用到的类主要是以下四个:
游戏主体RoShamBo:包括ROCK,SCISSORS,PAPER三种动作;
对战结果Outcome:包括WIN,LOSE,DRAW三种对战结果;
对战接口Competitor:包括对战方法compete();
逻辑验证RoShamBoSample:随机生成对战数据,验证对战结果。
详细代码如下:
1,Outcome.java:
4,RoShamBoSample:
需要用到的类主要是以下四个:
游戏主体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
相关文章推荐
- 要慎用mysql的enum字段的原因
- C#枚举类型与结构类型实例解析
- C#中枚举类型和radiobox关联操作的方法
- 关于c#中枚举类型支持显示中文的扩展说明
- c++ 尽量不要使用#define 而是用const、enum、inline替换。
- mysql之set与enum的介绍
- Python中模拟enum枚举类型的5种方法分享
- Java枚举类enum介绍
- python模拟enum枚举类型的方法小结
- Swift教程之枚举类型详解
- 一个运用enum类型的Demo
- enum实现单例模式
- enum VARENUM
- 小谈Java Enum的多态性
- ios枚举
- enum与typedef enum的用法
- C# 将一个字符串 转化为对应的枚举类型
- 枚举 JDK1.5
- Java的Enum用法记录
- Java进级篇 - Java Enum的用法详解