如何在我的二十一点游戏中避免重复卡片?

时间:2017-06-18 00:50:14

标签: java

我正在写一个二十一点游戏,包括一个Suits枚举,CardValues对象,其构造函数和实例变量是:

public class CardValue{

    private String face;
    private int numeric;


    public CardValue(String faceVal){
        face = faceVal;
        numeric = findNumericVal(faceVal);
    }...}

和卡片确定为:

public class Card{

  private CardValue value;
  private Suit suit;

  public Card(){
    this.value = new CardValue(determineFace());
    this.suit = determineSuit();

  }

  public static Suit determineSuit(){

    int randNum = (int) (Math.random() * 4);

    if (randNum == 0){
      return Suit.CLUBS;
    }
    else if (randNum == 1){
      return Suit.DIAMONDS;
    }
    else if (randNum == 2){
      return Suit.HEARTS;
    }
    else{ 
      return Suit.SPADES;
    }

  public static String determineFace(){
    String f = null;

    int rand = (int)(Math.random()*13);

    if (rand == 0){
      f = "2";
    }
    if (rand == 1){
      f = "3";
    }
    if (rand == 2){
      f = "4";
    }
    if(rand == 3){
      f = "5";
    }
    if(rand == 4){
      f = "6";
    }
    if(rand == 5){
      f = "7";
    }
    if(rand == 6){
      f = "8";
    }
    if(rand == 7){
      f = "9";
    }
    if(rand == 8){
      f = "10";
    }
    if (rand == 9){
      f = "J";
    }
    if (rand == 10){
      f = "Q";
    }
    if (rand == 11){
      f = "K";
    }
    if(rand == 12){
      f = "A";
    }
    return f;

  }    

}

我想知道我的玩家在游戏中获得重复牌的问题。我决定随意确定卡片并使用逻辑布尔值来防止重复,而不是建立一个套牌。我在CardGame类中的dealIn(...)方法是:

  public static ArrayList<Card> dealIn(ArrayList<Card> hand){

    Card a = new Card();
    Card b = new Card();

    hand.add( a);

    if(!b.equals(a))
      hand.add(b);

    return hand;
  }

及其制作重复。我怎么能阻止它?

1 个答案:

答案 0 :(得分:1)

我会将user.home称为LinkedList<Card>来代表整个套牌。在二十一点中,经销商将几个标准甲板混合成一个大甲板。生成 n (其中n是大牌中标准套牌的数量)deck对于标准牌组中的每张牌,并将其添加到Card 。然后做 deck这会改变名为Collections.shuffle(deck);的{​​{1}}。然后要绘制一张卡片LinkedList,它会从deck返回顶部deck.poll()并将其从Card中移除。

这就是你的RNG方法存在的问题:即使是单人游戏二十一点,每轮也有几张牌。最小数量为4(经销商为2,玩家为2),但如果玩家或经销商点击,您可能会在一轮中查看更多的牌。因此,太随机生成卡片并检查每个卡片是否与之前处理的卡片之一匹配会太不方便。 此外,正如我所说,在真正的二十一点,你有一个由标准套牌组成的大牌,所以会有重复。