我的交易方法有困难

时间:2016-09-14 17:42:03

标签: java poker

在我的PokerDeck课程中,我不能让我的交易方法在不产生重复的情况下运行。谁能告诉我我做错了什么?

import java.util.*;

public class PokerDeck {
    public static final int NUMBER_OF_CARDS = PokerCard.NUMBER_OF_SUITS * PokerCard.NUMBER_OF_RANKS;
    // Instance Variables
    private boolean[] deck;
    private int numberOfCardsInDeck;

    // Constructor
    public PokerDeck()

    {
        deck = new boolean[NUMBER_OF_CARDS];
        for (int j = 0; j < deck.length; j++)
            for (PokerCard.CardSuit suit : PokerCard.CardSuit.values())
                for (PokerCard.CardRank rank : PokerCard.CardRank.values())
                    deck[j] = true;

    }

    // Accessor
    public int getNumberOfCardsInDeck() {
        numberOfCardsInDeck = NUMBER_OF_CARDS;
        return this.numberOfCardsInDeck;

    }

    // Mutator:
    // Return all 52 PokerCards to this PokerDeck
    public void shuffle() {
        for (int i = 0; i < deck.length; i++) {
            int index = (int) (Math.random() * deck.length);
            deck[i] = deck[index];
        }

    }

    // Mutator:
    // Return a randomly selected PokerCard from this PokerDeck
    // Update the state of this PokerDeck to reflect removal of
    // the selected PokerCard
    // Exception thrown if this PokerDeck is "empty"

    public PokerCard deal() {
        Random dealer = new Random();
        int ran = dealer.nextInt(deck.length);
        if (numberOfCardsInDeck == 0)
            throw new RuntimeException("Empty Deck");

        if (deck[ran] == false)
            ran = dealer.nextInt(deck.length);

        deck[ran] = false;
        int suit = ran / 13;
        int rank = ran % 13;

        return new PokerCard(PokerCard.CardSuit.values()[suit], PokerCard.CardRank.values()[rank]);
    }
}

我尝试了至少五个不同的代码,所有代码都没有运行,或者它们运行并返回重复项。

2 个答案:

答案 0 :(得分:0)

这段代码有很多问题。你的问题是,因为你越来越随机而不是使用你在交易方法开始时声明的te ran变量。在您宣布ran变量后,请不要dealer.nextInt(deck.length),请将其替换为ran

你的洗牌并不是真正的洗牌,请查看:Random shuffling of an array

比较(例如if(something == false))应该与==进行比较,你正在使用=进行比较(但你可能只是粘贴错误)。

在你的getter中numberOfCardsInDeck = NUMBER_OF_CARDS;是错误的,除非你想要刷新&#39;一副牌,而不只是得到一些牌,但我不这么认为,删除那条线。

你的构造函数中的三元组是错的,你只需要第一个,它在这里没有区别(性能除外),但修复它。

另外我建议重写所有这些,做一个带有套装和等级枚举的卡片对象(类),用卡片对象列表制作一个Deck对象,制作一个deck.getCard()方法,从卡片中删除最后一张卡片,制作decksh的deck.shuffle()方法(现在你将有一个List of Cards,而不是一个数组,所以你可以做Collections.shuffle(cardList),简单)。

另外,改变这个:

if (deck[dealer.nextInt(deck.length)] == false)
            dealer.nextInt(deck.length);

对于这样的事情:

while (deck[ran] == false)
            ran = dealer.nextInt(deck.length);

答案 1 :(得分:0)

有一些可怕的错误让我想知道你读了多少自己的代码:

  1. 在这里重复使用随机:

    if (deck[dealer.nextInt(deck.length)] == false)
    

    表示您将再次随机化而不使用之前生成的ran

  2. 此块

    if (deck[dealer.nextInt(deck.length)] == false)
        dealer.nextInt(deck.length);
    

    没用,因为dealer.nextInt(deck.length)只是创建一个值而不存储任何东西。 我想你一直在努力,直到你找到一张有效的卡片“#34;所以看起来应该更像这样:

    while (deck[ran] == false)
        ran = dealer.nextInt(deck.length);
    
  3. 这里的Shuffle()方法只是复制了你的牌组中的值eveywhere,因为你不是交换,而是简单地用第二个值替换第一个值,丢失第一个值。为了避免这种情况,只需添加

    boolean b = deck[i];
    deck[i] = deck[index];
    deck[index] = b;
    

    使其成为交换。

  4. 这是我在第一次阅读后发现的所有内容。