如何将字符映射到(播放)卡?

时间:2017-06-04 20:27:21

标签: java android

我有一个Android卡游戏应用程序。 在我的应用程序中,我发送有关玩家之间已经玩过的游戏卡的数据,并且我尝试使消息尽可能短。 我有一个代表每张卡的课程。 现在,为了使消息更小,我将每张卡称为单个字符。 例如,黑桃的王牌将是'a' 钻石王牌将是'b'等等。

我的问题是,如何以最有效的方式将字符映射回相应的卡? (例如字符和卡片的hashmap) 例如,如果玩家收到'a,b',则会将其翻译成黑桃和钻石。

谢谢!

2 个答案:

答案 0 :(得分:1)

我将每张卡映射到以''开头的字符(32位十进制,0x20十六进制,因此您将始终处理可打印字符)然后只需要一个switch语句来覆盖所有卡片。一个用于编码的switch语句,另一个用于解码为“Ace of Diamonds”。例如。

虽然很长,但是大switch语句比链式if-elseif语句更好,并且比二进制编码更容易理解。如果我是为一个内存受限的设备做的,我可能会选择二进制编码,但对于真正的计算机,我只使用switch,因为它很容易理解。

答案 1 :(得分:0)

我相信Switch-case / if-else在这种情况下还可以。它会变大,但是你定义50个映射的任何类型的代码都会很大。

另一种方法是以某种方式“存储”您的角色< - >卡片关系,并使用方法来检索值。您可以通过易于阅读的方式获得关系,并且可以轻松注册映射并使用它。

我认为有1:1关系的地图(来自Googles Guava的BiMap?)。您只需在该地图中注册您的角色和卡片,这样您就可以在两个方向上进行识别。

如果你想在没有第三方库的情况下这样做,你应该可以使用两张地图轻松完成:

/** used to find the correct Card by Character */
private final static Map<Character, Card> mapCharToCard = new HashMap<>();

/** used to find the correct Character by Card (for sending over network) */
private final static Map<Card, Character> mapCardToChar = new HashMap<>();

/* Always stores boths ways so you can always map it back and forth */
public final static void register(Character character, Card card) {

    mapCharToCard.put(character, card);
    mapCardToChar.put(card, character);
}

public final static Character map(Card card) {

    return mapCardToChar.get(card);
}

public final static Card map(Character character) {

    return mapCharToCard.get(character);
}

public static void main(String[] args) {

    register('a', new Card("Spades", "Ace"));
    register('b', new Card("Heart", "King"));

    System.out.println(map('a'));
    System.out.println(map('b'));

    // Even works with new cards as hashmap uses equals() to check
    System.out.println(map(new Card("Spades", "Ace")));
}

public static class Card {

    private String color;
    private String value;

    public Card(String color, String value) {
        super();
        this.color = color;
        this.value = value;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return "Card [getColor()=" + getColor() + ", getValue()=" + getValue() + "]";
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        result = prime * result + ((value == null) ? 0 : value.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Card other = (Card) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (value == null) {
            if (other.value != null)
                return false;
        } else if (!value.equals(other.value))
            return false;
        return true;
    }
}