Java 如何洗牌和显示卡片,使其仅显示一次

Java 如何洗牌和显示卡片,使其仅显示一次,java,Java,如何在Java中洗牌和显示卡片,使它们只显示一次 Math.random()有可能显示两次。不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在显示后被调用,只需重新绘制即可 不确定是否有任何特定的api调用,但您可以轻松地跟踪显示的卡片,如果卡片在已经显示之后被调用,只需重新绘制即可 就一般方法而言,您可以使用两个阵列(一个用于“牌组”,另一个用于“显示”牌),只需将牌组中的每一张牌移除,并在每次随机选择后将其添加到显示的牌阵列中。就一般方法而言,您可以使用两个阵列(一个

如何在Java中洗牌和显示卡片,使它们只显示一次


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