纸牌游戏 - 选择球员手牌的问题

时间:2012-12-30 17:02:08

标签: java oop sorting

我们正在制作一款简单的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;

        }
    }
}
 }

3 个答案:

答案 0 :(得分:2)

制作&#34; card&#34;一个对象。

这将极大地简化您的代码。不是拥有一个字符串数组,而是在每个卡片对象中只有2个字符用于排名和套装。

然后你可以制作&#34; deck&#34;一系列卡片。

让玩家拥有一个对象,并拥有自己的一系列牌。

如果你愿意,你甚至可以让甲板成为一个物体,这样你就可以打电话了

deck.shuffle();

答案 1 :(得分: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实例。甲板应该有一个shuffle和reset方法,Hand真的只需要一个清晰的meathod。我希望这能帮到你!祝你好运!


更新

如果您不知道它们是什么,请参阅以下内容:

以下是一些一般的OOP信息:

如果您阅读了这两个代码,您的代码将会大大改善。如果您需要更多帮助,我可以发布更多代码。

答案 2 :(得分:0)

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

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

在循环内打印播放器1的手时,会调用selectionSort。方法selectionSort对完整的deck数组进行排序。仔细检查selectionSort告诉我它什么都不做!在修复selectionSort之后,你会在输出中看到一张随机牌,然后是最后一张牌(俱乐部)的最后四张牌。

我假设你试图通过在打印玩家1之手的循环中调用selectionSort来对玩家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);