如何将一副牌分成两半?

时间:2013-12-09 20:36:31

标签: java

我正在努力创造一个非常简单的战争游戏。用户和计算机每回合获得1张牌,他们要么赢,要么打败,要么失败。卡片出局时游戏结束。我有4节课。我的战争课我大部分只是测试一下是否有东西在甲板上工作。我需要做的是将牌组分成两半,这样每个玩家每回合抽一张牌(游戏结束时共计26张),我不知道该怎么做。我猜我需要一个for循环,但除此之外我不知道如何给每个玩家一张牌。忽略类战中的用户输入,就像我说的那样,我只是在测试。我在这里显示了3个类,我的最后一个是JApplet,这里不需要,所以我没有把它包括在内。

编辑:谢谢你的帮助。我有最后一个问题然后我应该好。我想在我的JApplet类中显示Card.toString,但是当我调用Card card = new Card()时;它拒绝工作。我猜这是因为构造函数。我将如何获得要显示的toString,或绕过构造函数。

编辑:想出一切,感谢帮助人员。

import java.util.ArrayList;
import java.util.Random;


public class Card {
    private int suit, number;
    String [] suits = {"Heart" , "Diamond" , "Spade" , "Club"}; //suits
    String [] numbers = { "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" ,
    "Jack" , "Queen" , "King" , "Ace" }; //card values
    String card = "";

     public Card(int suits, int numbers)
        {
            suit = suits; 
            number = numbers;
        }
      public String toString() //displays card suit/value
        {
            String finalCard = numbers[number] + " of " + suits[suit];
            return finalCard;
        }
    }



import java.util.ArrayList;
import java.util.Random;

public class FullDeck {
    private ArrayList<Card> cards = new ArrayList<Card>();//card array list

        public FullDeck()
        {   
            for(int a =0; a<=3; a++) //loops through suits
            {
                for(int b =0; b<=12;b++) //loops through values
                {
                    cards.add(new Card(a,b)); //creates adds cards to list
                }

            }

        }

        public Card drawRandomCard()
        {
            Random generator = new Random(); //picks random card
            int index = generator.nextInt(cards.size());
            return cards.remove(index); //removes card from list
        }



        public String toString()
        {
            String result = "Cards remaining in deck: " + cards; //not currently used
            return result;
        }    
    }

import java.util.Scanner;

public class War {

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        Card C;
        FullDeck hand1 = new FullDeck();
        FullDeck hand2 = new FullDeck();

        System.out.println("Enter number of cards to be dealt: ");
        int numberCards = scan.nextInt();

        System.out.println("Cards drawn: ");
        for (int i = 0; i < numberCards; i++) {
          C = hand1.drawRandomCard();
          System.out.println(C.toString());
        }
    }
        }

2 个答案:

答案 0 :(得分:1)

FullDeck课程重命名为Deck ...

是有意义的

然后,包含Deck的构造函数,该构造函数将ArrayList作为参数。包含Deck的方法,该方法返回Deck个对象,其名称类似于splitDeck

在内部,splitDeck占用Deck中一半的卡片,将其从该cards上的卡片中删除,然后将其添加到新的临时ArrayList中。然后,它创建并返回使用此临时ArrayList构建的deck对象。


public Deck(ArrayList<Card> deck) {
    cards = deck;
}

public Deck splitDeck() {
    ArrayList<Card> temp = new ArrayList<>();
    for(int i = cards.length() - 1; i >= cards.length()/2; --i) {
        temp.add(cards.get(i));
        cards.remove(i);
    }
    return new Deck(temp);
}

现在调用方法的Deck对象包含半个套牌,返回的Deck对象包含另一半。


假设您将类重命名为Deck(只是因为它更有意义)并保持相同的默认构造函数:

Deck playerOneDeck = new Deck();
// playerOne now has a full deck of cards

Deck playerTwoDeck = playerOneDeck.splitDeck();
// playerOne and playerTwo now each have half of playerOne's original full deck

答案 1 :(得分:1)

创建两个ArrayList<Card>,然后创建一个经过52次的for循环。

for(int i=0;i<52;i++){
    Card tempCard = hand1.getCards().remove(hand1.getCards().indexOf(hand1.drawRandomCard()));
    if(i%2 == 1){
        firstPlayersCards.add(tempCard);
    }else{
        secondPlayersCards.add(tempCard);
    }
}

确保在getCards()中添加FullDeck方法,该方法只返回cards

通过这种方式,所有牌都在每个玩家的手中随机化,所以你可以按顺序获得它们。

编辑:但是,最简单的解决方案是Daniel Gabriel所说的,并且连续两次拨打drawRandomCard()