Java 如何洗牌和显示卡片,使其仅显示一次
如何在Java中洗牌和显示卡片,使它们只显示一次Java 如何洗牌和显示卡片,使其仅显示一次,java,Java,如何在Java中洗牌和显示卡片,使它们只显示一次 Math.random()有可能显示两次。不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在显示后被调用,只需重新绘制即可 不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在已经显示之后被调用,只需重新绘制即可 就一般方法而言,您可以使用两个阵列(一个用于“牌组”,另一个用于“显示”牌),只需将牌组中的每一张牌移除,并在每次随机选择后将其添加到显示的牌阵列中。就一般方法而言,您可以使用两个阵列(一个
Math.random()
有可能显示两次。不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在显示后被调用,只需重新绘制即可 不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在已经显示之后被调用,只需重新绘制即可 就一般方法而言,您可以使用两个阵列(一个用于“牌组”,另一个用于“显示”牌),只需将牌组中的每一张牌移除,并在每次随机选择后将其添加到显示的牌阵列中。就一般方法而言,您可以使用两个阵列(一个用于“牌组”,一个用于“显示”牌)每次随机选择后,只需移除牌组中的每张牌,并将其添加到显示的牌阵列中。如果您总是洗牌整副牌,则有很好的机会再次抽取一张牌。如果你不想要这张牌,那么你就不能把这张牌放回牌组
现实生活中的游戏会使用一副越来越小的牌和一堆越来越大的抽牌
如果您定义一个“Card”类并使用包含这些Card对象的列表,那么就容易多了。然后,洗牌该列表,获取顶部卡片,将其添加到另一个列表中,并将其从牌组中移除:
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
公共类卡{
String name;//为了简单起见,只需要卡的名称
公共卡(字符串名称){
this.name=名称;
}
公共字符串getName(){return name;}
}
// ...
列表组=新的ArrayList();
initDeck();//在牌组中添加52张新卡
收藏。洗牌(套牌);//洗牌
卡片绘制=卡片组。获取(0);//抽第一张牌
甲板。移除(绘制);//把它从甲板上拿下来
如果你总是洗牌整副牌,很有可能第二次抽牌。如果你不想要这张牌,那么你就不能把这张牌放回牌组
现实生活中的游戏会使用一副越来越小的牌和一堆越来越大的抽牌
如果您定义一个“Card”类并使用包含这些Card对象的列表,那么就容易多了。然后,洗牌该列表,获取顶部卡片,将其添加到另一个列表中,并将其从牌组中移除:
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
公共类卡{
String name;//为了简单起见,只需要卡的名称
公共卡(字符串名称){
this.name=名称;
}
公共字符串getName(){return name;}
}
// ...
列表组=新的ArrayList();
initDeck();//在牌组中添加52张新卡
收藏。洗牌(套牌);//洗牌
卡片绘制=卡片组。获取(0);//抽第一张牌
甲板。移除(绘制);//把它从甲板上拿下来
将52张卡放入阵列列表中
然后打电话
Collections.shuffle(cardList);
然后只处理列表中的前n张牌。将52张牌放入一个数组列表中
然后打电话
Collections.shuffle(cardList);
然后只处理列表中的前n张卡。由于您可能使用的是面向对象编程语言,因此可以执行以下操作:
class Deck(object):
private fields:
cardsLeft : list of Card objects
methods:
drawCard() -> randomly takes Card from self.cardsLeft
reset()
class Card(object)
由于您可能正在使用面向对象编程语言,因此可以执行以下操作:
class Deck(object):
private fields:
cardsLeft : list of Card objects
methods:
drawCard() -> randomly takes Card from self.cardsLeft
reset()
class Card(object)
如果您想为一副卡片建模,那么使用作为底层数据结构是一种选择
列表
的每个元素都应该是一张卡片——可以是卡片
类的实例,也可以是像整数这样简单的东西
甲板将装载构成甲板的物体。加载列表
可以通过调用应包含在数据组中的每个元素来完成
随机挑选一张牌实际上需要从牌组中移除一张牌。通过列表
界面,可以使用该方法。(被移除的实际元素可能是该列表中存在的随机元素索引。)这样,您就不必跟踪哪些卡已经被移除
如果甲板需要随机化,则可以使用该方法。它将采取一个集合
(一个列表
是集合
的一个子界面)并在列表
上执行就地洗牌
根据以上想法,使用我们假设可用的卡
类,代码可能如下所示:
// 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.
//初始化数据组。
列表组=新的ArrayList();
//把甲板装上货物。
牌组。添加(新牌(套装。心型,等级。王牌));
//等等。。。
牌组。添加(新牌(套装。黑桃,等级。国王));
//洗牌。
收藏。洗牌(牌组);
//从牌组中随机取出一张牌。
int-sizeOfDeck=deck.size();
Card Random Card=list.remove(new Random().nextInt(size));
//因为我们从牌组中移除了“卡”,所以它不会再次出现。
如果您想为一副卡片建模,那么使用a作为底层数据结构是一种选择
列表
的每个元素都应该是一张卡片——可以是卡片
类的实例,也可以是像整数这样简单的东西
甲板将装载构成甲板的物体。加载列表
可以通过调用应包含在数据组中的每个元素来完成
随机挑选一张牌实际上需要从牌组中移除一张牌。通过列表
界面,可以使用该方法。(被移除的实际元素可能是该列表中存在的随机元素索引。)这样,您就不必跟踪哪些卡已经被移除
如果甲板需要随机化,则可以使用该方法。它将采取一个集合
(一个列表
是集合
的一个子界面)并在列表
上执行就地洗牌
接受上述想法,并使用卡
cla