如何在Java中随机播放和显示卡片,以便它们只显示一次?
Math.random()
有机会被展示两次。
答案 0 :(得分:9)
将52张卡放入ArrayList
然后致电
Collections.shuffle(cardList);
然后只处理列表中的前n张卡片。
答案 1 :(得分:0)
不确定是否有任何特定的api通话,但您可以轻松地跟踪显示的卡片,如果在已经显示之后调用卡片,则只需重新绘制。
答案 2 :(得分:0)
就一般方法而言,您可以使用两个阵列(一个用于“卡座”,一个用于“显示”卡)并简单地将每张卡移除到卡座并在每次随机选择后将其添加到显示的卡阵列中
答案 3 :(得分:0)
如果你总是洗牌整个牌组,那么很有可能第二次抽牌。如果您不想这样,那么您不能将卡片放回到卡座上。
现实生活中的游戏会使用一个越来越小的牌组和一堆拉牌,这些牌会越来越大。
如果您定义“Card”类并使用包含这些卡对象的列表,则会容易得多。然后,将列表清空,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
答案 4 :(得分:0)
由于您可能正在使用面向对象的编程语言,因此可以执行此操作:
class Deck(object):
private fields:
cardsLeft : list of Card objects
methods:
drawCard() -> randomly takes Card from self.cardsLeft
reset()
class Card(object)
答案 5 :(得分:0)
如果您想为一副牌建模,那么使用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.