我有一個Android卡牌遊戲應用程序。 在我的應用我將數據發送關於已經在玩家之間玩的遊戲卡,我儘量使信息儘可能短。 我有一個代表每張卡片的類。 現在,爲了減小信息,我將每張卡片稱爲單個字符。 例如黑桃王牌將''' 王牌鑽石將'B'等等..如何將chars映射到(玩)卡?
我的問題是,我怎麼能映射字符回到對應的卡,以最有效的方式? (對於字符和卡的示例散列映射) 例如,如果一個播放器接收到「A,B」,他將其轉換爲黑桃和鑽石的ACE。
謝謝!
我有一個Android卡牌遊戲應用程序。 在我的應用我將數據發送關於已經在玩家之間玩的遊戲卡,我儘量使信息儘可能短。 我有一個代表每張卡片的類。 現在,爲了減小信息,我將每張卡片稱爲單個字符。 例如黑桃王牌將''' 王牌鑽石將'B'等等..如何將chars映射到(玩)卡?
我的問題是,我怎麼能映射字符回到對應的卡,以最有效的方式? (對於字符和卡的示例散列映射) 例如,如果一個播放器接收到「A,B」,他將其轉換爲黑桃和鑽石的ACE。
謝謝!
我每張卡映射到一個字符以「」(32十進制,十六進制0×20,所以你總是有可打印字符處理),則只是有一個switch語句覆蓋所有的牌。例如,一個開關語句進行編碼,另一個開關語句解碼爲「鑽石王牌」。
雖然冗長,但較大的switch
語句比鏈接的if-elseif
語句更好,並且比二進制編碼更容易理解。如果我爲一個內存受限的設備做這件事,我可能會選擇二進制編碼,但對於一臺真正的計算機,我只是使用switch
,因爲它很容易理解。
相信的switch-case/if-else語句是在這種情況下確定。它會變大,但是任何你定義50個映射的代碼都會很大。其他
一種辦法是「專賣店」你的角色< - >卡關係在某種程度上和使用方法來檢索值。您將以易讀的方式獲得關係,並且註冊映射並使用它很容易。
我覺得這是對1地圖:(?BIMAP從谷歌番石榴)1的關係。你可以在地圖上註冊你的角色和卡片,這樣你就可以在兩個方向上進行識別。
/** 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;
}
}
爲什麼不直接使用switch語句:
如果你想這樣做沒有第三者庫,您可以輕鬆地用做兩個地圖它應該能夠? –
我認爲有50多個案例的開關不會如此有效 – Billy
「有效性」是什麼意思?由於switch語句將被轉換爲跳轉標記,因此它最有可能比HashMaps更好地執行。當然,就可讀性和可維護性而言,轉換語句可能不是最好的。 –