【发布时间】:2011-04-17 13:13:55
【问题描述】:
如何在 Java 中洗牌和显示卡片,以便它们只显示一次?
Math.random() 有机会出现两次。
【问题讨论】:
标签: java
如何在 Java 中洗牌和显示卡片,以便它们只显示一次?
Math.random() 有机会出现两次。
【问题讨论】:
标签: java
将 52 张卡片放入 ArrayList 中
然后调用
Collections.shuffle(cardList);
然后只发列表中的前 n 张牌。
【讨论】:
不确定是否有任何特定的 api 调用,但您可以轻松地跟踪显示的卡片,如果卡片在显示后被调用,只需重新绘制即可。
【讨论】:
就一般方法而言,您可以使用两个数组(一个用于“牌组”,一个用于“显示”牌),只需在每次随机选择后从牌组中移除每张牌并将其添加到显示的牌组中.
【讨论】:
由于您可能正在使用面向对象的编程语言,您可以这样做:
class Deck(object):
private fields:
cardsLeft : list of Card objects
methods:
drawCard() -> randomly takes Card from self.cardsLeft
reset()
class Card(object)
【讨论】:
如果您总是将整副牌洗牌,则很有可能再次抽到一张牌。如果你不想要这个,那么你就不能把卡片放回甲板上。
现实生活中的游戏会使用一个越来越小的牌组和一堆越来越大的牌。
如果您定义一个“卡片”类并使用包含这些卡片对象的列表,则会容易得多。然后,洗牌,get 最上面的牌,add 到另一张牌,remove 从牌组中:
public class Card {
String name; // for simplicity, just the card's name
public Card(String name) {
this.name = name;
}
public String getName() {return name;}
}
// ...
List<Card> deck = new ArrayList<Card>();
initDeck(); // adds like 52 new cards to the deck
Collections.shuffle(deck); // shuffle the deck
Card drawn = deck.get(0); // draw the first card
deck.remove(drawn); // remove it from the deck
【讨论】:
如果您想为一副纸牌建模,那么使用List 作为底层数据结构是一种选择。
List 的每个元素都应该是一张卡片——无论是 Card 类的实例,还是像 Integer 这样简单的东西。
卡片组将加载应构成卡片组的对象。加载List 可以通过调用List.add 来完成每个应该包含在卡组中的元素。
随机选择一张牌实际上需要从牌组中移除一张牌。对于List 接口,可以使用List.remove 方法。 (实际要删除的元素可能是该列表中存在的随机元素索引。)这样,您就不必跟踪已删除的卡片。
如果牌组需要随机化,则可以使用Collections.shuffle 方法。它需要Collection(List 是Collection 的子接口)并在List 上进行就地洗牌。
采用上述想法,并使用我们假设可用的Card 类,代码可能如下所示:
// Initialize the deck.
List<Card> deck = new ArrayList<Card>();
// Load up the deck.
deck.add(new Card(Suit.HEART, Rank.ACE));
// and so on...
deck.add(new Card(Suit.SPADE, Rank.KING));
// Shuffle the deck.
Collections.shuffle(deck);
// Take a random card out of the deck.
int sizeOfDeck = deck.size();
Card randomCard = list.remove(new Random().nextInt(size));
// Since we removed the `Card` from the deck, it will not appear again.
【讨论】: