【问题标题】:How do I compare two card objects that hold strings?如何比较两个持有字符串的卡片对象?
【发布时间】:2017-09-18 19:26:55
【问题描述】:

我正在模拟纸牌游戏 War,但在找到两个纸牌对象之间价值更高的牌时遇到了问题。例如,如果玩家 1 有红桃 10,玩家 2 有梅花 9,那么玩家 1 应该赢得这手牌。但是,由于卡片包含字符串变量,我不知道如何比较它们以确定哪张卡片具有更大的价值。我有三个类,一个包含两个字符串数组的卡片类,一个包含卡片集合的卡片组和一个主类。

import java.util.ArrayList;
import java.util.Collections;

public class Deck {
private ArrayList<Card> cards;
public Deck() {
    cards = new ArrayList<Card>();
    for(int i = 0; i <=3; i++) {
        for(int j = 0 ; j <= 12; j++) {
            cards.add(new Card(i,j));
        }
    }  
}

public void shuffle() {
    Collections.shuffle(cards);
} 

public Card deal() {
    if (isEmpty() == true) {
        return null;
    }
    else {
        return cards.remove(0);
    }
}
public Card playCard() {
    return cards.remove(0);
}
public void getCard (Card newCard) {
    cards.add(newCard);
}
public void clearDeck() {
    cards.removeAll(cards);
}
public boolean isEmpty() {
    return cards.isEmpty();
}

public int cardCount() {
    return cards.size();
}

public String toString() {
    String result = "Cards remaining in deck: " + cards;
    return result;
}    
}

 public class Card 
 {
private int type, value;
protected String[] cardType = {"Clubs", "Spades", "Diamonds", "Hearts"};
protected String[] cardValue = {"Ace", "King", "Queen", "Jack", "10",
                               "9", "8", "7", "6", "5", "4", "3", "2"};

public Card() {

}
public Card(int types, int values)
{
    type = types; 
    value = values;
}


public String toString()
{
    String resultCard = cardValue[value] + " of " + cardType[type];

    return resultCard;
}

}

public class Main
{
public static void main(String[] args)
{
    Deck deck = new Deck();
    Deck player1 = new Deck();
    Deck player2 = new Deck();
    Deck pile = new Deck();
    pile.clearDeck();
    deck.shuffle();

    dealCards(deck, player1, player2);
    addToPile(player1, player2, pile);
}
 public static void dealCards(Deck deck, Deck p1, Deck p2) {
   for (int i=0; i <26; i++) {
        p1.getCard(deck.deal());
        p2.getCard(deck.deal());
   }
   p1.shuffle();
   p2.shuffle();
 }
 public static void addToPile(Deck p1, Deck p2, Deck deckPile) {
    Card p1Card;
    Card p2Card;
    p1Card = p1.playCard();
    p2Card = p2.playCard();
    deckPile.getCard(p1Card);
    deckPile.getCard(p2Card);
  } 
}

【问题讨论】:

  • 您可能需要stop 使用字符串——枚举在这里可以很好地工作——或者定义一个Comparator&lt;String&gt;,可能基于Map&lt;String, Integer&gt;

标签: java


【解决方案1】:

您可以做的是在您的 Card 类中创建一个方法来比较 2 个 Cards

由于我不知道游戏规则,这里是一个带有以下规则的示例
1. 梅花 > 黑桃 > 方块 > 红心
2. 最高牌获胜

可能是这样的:

// 1 -> This card is greater
// 0 -> both cards are equal
// -1 -> This card is lesser
public int isGreater(Card cardToCompare) {
    // Check the cardType
    if (this.type < cardToCompare.type) {
        return 1;
    }
    if (this.type == cardToCompare.type) {
        if (this.value < cardToCompare.value) {
            return 1;
        }
        if (this.value == cardToCompare.value) {
            return 0;
        }
        if (this.value > cardToCompare.value) {
            return -1;
        }
    }
    if (this.type > cardToCompare.type) {
        return -1;
    }
}

请注意,valuetype 的较小数字等于数组中较大的卡片。

编辑: 由于在这个游戏中卡牌类型并不重要(有人告诉过我),你也可以这样做:

// positive result -> this card is greater
// 0 -> cards are equal
// negative result -> cardToCompare is greater
public int isGreater(Card cardToCompare) {
    return cardToCompare.value - this.value;
}

【讨论】:

  • type 在这个游戏中并不重要,所以它可以简单地是return cardToCompare.value - this.value;
  • 类型无关紧要,但我修改了这个函数中的逻辑并让它工作,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2022-06-29
  • 2013-09-17
  • 2019-01-14
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多