0

我们正在制作一个简单的 52 张纸牌游戏。我们在处理、洗牌和存储牌时遇到了很多麻烦。应向每位玩家发 5 张牌。该游戏类似于Hearts,但每个玩家只能获得5张牌。到目前为止,这是我们的代码:

    int[] deck = new int[52];
    String[] suits = { "Spades", "Hearts", "Diamonds", "Clubs" };
    String[] ranks = { "A ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ",
            "9 ", "10", "J ", "Q ", "K " };


    // Initialize the cards
    for (int i = 0; i < deck.length; i++)
        deck[i] = i;

    // Shuffle the cards
    for (int i = 0; i < deck.length; i++) {

        // Generate an index randomly

        int index = (int) (Math.random() * deck.length);
        int temp = deck[i];
        deck[i] = deck[index];
        deck[index] = temp;

    }

    // Display the first five cards
    System.out.println("player 1 has:");
    for (int i = 0; i < 5; i++) {
    String suit = suits[deck[i] / 13];
    String rank = ranks[deck[i] % 13];
    selectionSort(deck);
    System.out.println("Card number " + deck[i] + " : " + rank + " of "
                + suit);

    }

    int player1[] = deck;

    // Display the first five cards
    System.out.println("\n" + "player 2 has:");
    for (int i = 5; i < 10; i++) {
    String suit = suits[deck[i] / 13];
    String rank = ranks[deck[i] % 13];
    System.out.println("Card number " + deck[i] + " : " + rank + " of "
                + suit);

    }

    int player2[] = deck;

    // Display the first five cards

    System.out.println("\n" + "player 3 has:");
    for (int i = 10; i < 15; i++) {
    String suit = suits[deck[i] / 13];
    String rank = ranks[deck[i] % 13];

    System.out.println("Card number " + deck[i] + " : " + rank + " of "
    + suit );

    }
    int player3[] = deck;

}

public static void selectionSort(int[] deck) {

    for (int i = 52; i < deck.length - 1; i--){
    int currentMax = deck[i];
    int currentMaxIndex = i;

    for (int j = i + 1; j < deck.length; j++) {
        if (currentMax > deck[j]) {
            currentMax = deck[j];
            currentMaxIndex = j;
        }}
    if (currentMaxIndex != i) {
        deck[currentMaxIndex] = deck[i];
        deck[i] = currentMax;

        }
    }
}
 }
4

3 回答 3

2

使“卡片”成为一个对象。

这将大大简化您的代码。与其拥有一个字符串数组,不如在每个卡片对象中使用 2 个字符来表示等级和花色。

然后你可以制作“甲板”一系列卡片。

让玩家也有一个对象,有自己的卡片阵列。

如果你愿意,你甚至可以让 deck 成为一个对象,这样你就可以调用

deck.shuffle();
于 2012-12-30T18:03:29.780 回答
1

好的,我认为从长远来看,这将对您有所帮助。我看了你的代码大约两秒钟,发现它有一些严重的结构问题。您应该从这里开始:

public enum Suit
{
     CLUBS, SPADES, HEARTS, DIAMONDS
}

public enum Value
{
    TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
}

public class Card
{
    private Value value;
    private Suit suit;


    public Card(Suit theSuit, Value theValue)
    {
        suit = theSuit;
        value = theValue;
    }

    public Value getValue()
    {
        return value;
    }

    public Suit getSuit()
    {
        return suit;
    }
}

现在,一旦我们建立了基础,我们也可以说一手牌和一副牌非常相似,因为它们都是一叠牌,所以我们应该为它们建立一个基础:

public class CardStack
{
    public ArrayList<Card> cards;

    public CardStack()
    {
        cards = new ArrayList<Card>();
    }

    public Card draw()
    {
        if(cards.size() > 0)
        {
            Card card = cards.objectAt(cards.size() - 1);
            cards.remove(card);
            return card;
        }

        return null;
    }

    public void addCard(Card card)
    {
        cards.add(card);
    }
}

现在剩下的由你决定,Deck 和 Hand 都应该扩展 CardStack。抱歉,答案很长,但从长远来看,这将对您有所帮助。如果结构错误,程序将永远无法正常运行。你显然应该有一个 Player 类,它应该有一个 Hand 实例和你的 Game 类,或者任何应该有一个 deck 实例的东西。套牌应该有洗牌和重置的方法,手真的只需要像一个清晰的肉棒。我希望这对你有所帮助!祝你好运!


更新

如果您不知道枚举是什么,这里有更多关于枚举的信息:

以下是一些通用的 OOP 信息:

如果您阅读了这两篇文章,您的代码将大大改进。如果您需要更多帮助,我可以发布更多代码。

于 2012-12-30T19:13:42.550 回答
0

正如其他人在评论和答案中指出的那样,可以通过使其面向对象来改进设计。

我想我理解这个意图:首先创建一个套牌并洗牌。之后,前 5 个元素deck代表玩家 1 的手牌。接下来的 5 个元素代表玩家 2 的手牌,以此类推。

在循环内打印玩家 1 的手时,selectionSort会调用它。该方法selectionSort对整个deck数组进行排序。仔细检查selectionSort表明它什么也没做!修复后selectionSort,您将在输出中看到一张随机牌,然后是最后一套(俱乐部)的最后四张牌。

我假设您尝试通过selectionSort在打印玩家 1 的手的循环中调用来对玩家 1 的手进行排序。

如果我的假设是正确的,您应该进行修改selectionSort,以便您可以指定一个上下索引,以指定应该对数组的哪一部分进行排序。它可能看起来像这样:

public static void selectionSort(int[] deck, int start, int end) {

    for (int i = start; i<end; i++) {
        int currentMax = deck[i];
        int currentMaxIndex = i;

        for (int j = i + 1; j < end; j++) {
            if (currentMax < deck[j]) {
                currentMax = deck[j];
                currentMaxIndex = j;
            }
        }
        if (currentMaxIndex != i) {
            deck[currentMaxIndex] = deck[i];
            deck[i] = currentMax;
        }
    }
}

要对玩家 1 的牌进行排序,请调用selectionSort(deck, 0, 5);。对于玩家 2 调用selectionSort(deck, 5, 10);。对于玩家 3 调用selectionSort(deck, 10, 15);

于 2012-12-30T18:36:48.513 回答