2013-12-09 44 views
0

我试图创建一个非常简单的战争游戏。用户和电脑每回合吸1张牌,他们要么赢,要么输,要么输。当卡片不在时,游戏结束。我有4个班。我的战争班大部分时间只是在测试甲板上是否有效。我需要做对半平分甲板所以每个玩家抽1张卡每回合(由比赛结束共有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()); 
     } 
    } 
     } 
+1

为每个玩家提供一副套牌,每套牌都由原来的一半制作^^ – moonwave99

+2

简单的方法就是让双方的玩家拥有完整的套牌,并且每当一张牌被抽出时,从两套牌中移除该牌。 .. –

+3

为什么你需要拆分甲板,如果当你调用'drawRandomCard()'它将牌从甲板上移开?如果玩家和电脑依次调用'drawRandomCard()',那么它将自动发生,每个人最终会得到26张卡片。 –

回答

1

创建两个ArrayList<Card> S,然后进行for循环,去通过52次。

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); 
    } 
} 

确保在FullDeck刚刚返回cards添加getCards()方法。

而且这种方式,所有的卡都在随机每个玩家的手中,所以你可以让他们为了。

编辑:虽然,最简单的解决方案是丹尼尔加布里埃尔说,并连续两次打电话drawRandomCard()

+0

'我<52'?如果你正在检查你得到索引的数组的长度会更好。 – nhgrif

+0

为什么?我不关心阵列的长度,因为我知道它的大小。我的意思是,如果这是一张不规则的牌组,那么是的,你说得对,但这对于这种情况来说是多余的。 –

+1

这是检查阵列长度的原因。如果我决定修改甲板的构造方式,会发生什么?或者也许我想用我的游戏做其他事情,无论如何。无论出于何种原因,如果我决定在甲板尺寸上作出改变,那么我对'52'进行硬编码的地方越多,我必须去更多的地方并修复。使用数组的大小意味着结果是相同的,并且该方法更加灵活。每次更改一段代码时,都必须重新测试它......所以尽量以减少不必重写它的几率编写代码。 – nhgrif

1

它会是有意义的重命名FullDeck类只是Deck ...

然后,包括Deck一个构造函数的ArrayList作为参数。包括Deck的方法返回一个Deck对象,被称为像splitDeck

内部,splitDeck花费一半的卡Deck,从cards删除他们在该对象上,并将它们添加到一个新的,临时ArrayList。然后,它创建并返回一个使用此临时构建的卡座对象ArrayList


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