首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扑克牌的无限循环

扑克牌的无限循环
EN

Stack Overflow用户
提问于 2012-05-19 12:55:03
回答 3查看 292关注 0票数 2

我一直在尝试让这副牌处理这个方法,但是一旦它处理了52张牌,它就会进入无限循环。

我知道这是因为我让它生成一个随机数,直到它得到一张尚未设置的卡片,但是一旦所有的卡片都设置好了,条件就永远不会为真,因此无限循环。

即使我知道我的问题,我也不知道如何解决它。我已经试了好几个小时了。我想在它达到52张牌时抛出一个豁免,但是一旦它进入无限循环,它就永远不会达到那个if语句。

代码语言:javascript
复制
public PlayingCard deal() {

    Random swift = new Random();
    int index = swift.nextInt(DECK_SIZE);
    cardsInDeck = DECK_SIZE;
    int i = 51;

    while (this.deck[index] == false||i==cardsInDeck) {index = swift.nextInt(DECK_SIZE);}
    if(i==cardsInDeck) { throw new RuntimeException("Empty Deck");}

    PlayingCard.CardRank[] Ranking = PlayingCard.CardRank.values();
    PlayingCard.CardSuit[] Suiting = PlayingCard.CardSuit.values();

    PlayingCard.CardRank Rank = Ranking[index % 13];
    PlayingCard.CardSuit Suit = Suiting[index % 4];

    PlayingCard selected = new PlayingCard(Suit, Rank);
    this.deck[index] = false;
    i++;
    cardsInDeck--;

    return selected;

}

=============================================================================

完整的代码

导入java.util.Random;

公共类DeckOfCards {

代码语言:javascript
复制
public static final int DECK_SIZE = 52;
//Instance Variables
private boolean[] deck; //An implicit set of 52 Playing-Cards
private int cardsInDeck;//Number of cards currently in the deck
private Random dealer;  //Used to rendomly select a card to be dealt

//Constructor
public DeckOfCards() {
    this.deck = new boolean[DECK_SIZE];
    int index = 0;
    for (PlayingCard.CardSuit Suit : PlayingCard.CardSuit.values()) {
        for (PlayingCard.CardRank Rank : PlayingCard.CardRank.values()) {
            PlayingCard card = new PlayingCard(Suit, Rank);
            deck[index] = true;
            index++;
        }
    }
}

//Collect all 52 Playing-Cards into the deck
public void shuffle() {
    /*Random shuffle = new Random();
    for (int j = 0; j < this.deck.length; j++) {
    int k = shuffle.nextInt(this.deck.length);
    boolean temp = this.deck[j];
    this.deck[j] = this.deck[k];
    this.deck[k] = temp;*/
    int index = 0;
    for (PlayingCard.CardSuit Suit : PlayingCard.CardSuit.values()) {
        for (PlayingCard.CardRank Rank : PlayingCard.CardRank.values()) {
            PlayingCard card = new PlayingCard(Suit, Rank);
            deck[index] = true;
            index++;
        }

    }
}

//Simulate dealing a randomly selected card from the deck
//Dealing from an empty deck results in a RuntimeException
public PlayingCard deal() {

    Random swift = new Random();
    int index = swift.nextInt(DECK_SIZE);
    cardsInDeck = DECK_SIZE;
    int i = 0;

    while (this.deck[index] == false&&i>0) {index = swift.nextInt(DECK_SIZE);}
    if(i>cardsInDeck) { throw new RuntimeException("Empty Deck");}

    PlayingCard.CardRank[] Ranking = PlayingCard.CardRank.values();
    PlayingCard.CardSuit[] Suiting = PlayingCard.CardSuit.values();

    PlayingCard.CardRank Rank = Ranking[index % 13];
    PlayingCard.CardSuit Suit = Suiting[index % 4];

    PlayingCard selected = new PlayingCard(Suit, Rank);
    this.deck[index] = false;
    i++;
    cardsInDeck--;

    return selected;

}

==================================================================

代码语言:javascript
复制
public static void main(String[] args) {
    DeckOfCards myDeck = new DeckOfCards();
    myDeck.shuffle();

    for (int p = 1; p <= 4; p++) {
        for (int c = 1; c <= 13; c++) {
            System.out.print(myDeck.deal() + "  ");
        }
        System.out.println();
    }

    try {
        System.out.println(myDeck.deal());
    } catch (RuntimeException rte) {
        System.out.println(rte.getMessage());
    }
}

}

EN

回答 3

Stack Overflow用户

发布于 2012-05-19 14:33:31

我一直在尝试用这个方法来处理这副牌,但是一旦它处理了52张牌,它就会进入一个无限循环。,

发一副牌的简单方法是:

  1. ArrayList.
  2. Call Collections.shuffle()中的所有卡片放在该列表中;
  3. 按照卡片在随机列表中出现的顺序分发卡片。

代码将比您现在拥有的代码简单得多,并且更容易调试。

票数 4
EN

Stack Overflow用户

发布于 2012-05-19 13:01:06

你有没有试过这样的东西?

代码语言:javascript
复制
    while ((this.deck[index] == false||i==cardsInDeck)&&i<52)
票数 1
EN

Stack Overflow用户

发布于 2012-05-19 14:12:30

一旦你开始选择随机索引,就太晚了。您需要先测试一下这副牌是否有牌。

代码语言:javascript
复制
if (cardsInDeck <= 0) ...throw an exception?...
while (this.deck[index] == false) {index = swift.nextInt(DECK_SIZE);}

您需要正确地初始化cardsInDeck (不是在deal中设置为DECK_SIZE,而是在shuffle和构造函数中设置)。您希望cardsInDeck等于deck[index]==true的索引数这一不变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10662411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档