【问题标题】:Each Player in my Java Poker Game uses their own deck我的 Java 扑克游戏中的每个玩家都使用自己的牌组
【发布时间】:2014-09-14 01:11:25
【问题描述】:

您好,我正在尝试创建视频扑克游戏。这是我到目前为止的一部分(为了节省空间,我没有包括枚举、导入、变量、toStrings 等):

My Card 类定义了我们的卡片:

public Card(Value value, Suit suit) {

    this.value = value;
    this.suit = suit;
}

我的 Deck 类在 draw() 方法中创建了 52 张牌并返回 5 张牌:

private ArrayList<Card> deck = new ArrayList<Card>();
private ArrayList<Card> hand = new ArrayList<Card>();
private final int HANDSIZE = 5;

public Deck() {

    for(Suit suit : Suit.values()) {
        for(Value value : Value.values()){
            Card card = new Card(value, suit);
            deck.add(card);
        }
    }
}

public ArrayList<Card> draw() {

    Random rng = new Random();

    for(int i = 0; i < HANDSIZE; i++){
        int getCard = rng.nextInt(deck.size());
        Card addCard = deck.get(getCard);
        hand.add(addCard);
        deck.remove(getCard);
    }

    return hand;
}

我的 Player 类可以提供有关我们玩家的信息。

public class Player extends Deck {

    private String name;
    private int chips;

    public Player(String name, int chips) {

        this.name = name;
        this.chips = chips;
    }

问题是每个玩家都使用自己的套牌,因此有时两个或多个不同的玩家可能拥有同一张牌。我的问题是如何设置我的程序让每个玩家使用相同的套牌?谢谢。

输出示例:

姓名:John Doe,现金:500 [红桃J,红桃10,方块2,梅花A,方块9]

姓名:Jane Doe,现金:500 [黑桃K,方块2,红桃J,黑桃A,方块7]

【问题讨论】:

  • 播放器不应从 Deck 扩展,而应获取对 Deck 实例的引用,该实例应通过其构造函数传递给 Player...
  • 您的“游戏”类应该保留一个Deck,并且游戏中的每个Player 不应从Deck 扩展,但可能应该有一个从@987654332 填充的Hand @ 包含在 Game 类中,不管它是什么。

标签: java class duplicates poker


【解决方案1】:

不要让 Player 类扩展 Deck。这基本上是让玩家(在某种程度上)使用自己,而你让他们自己“拥有”套牌。因此,需要单独使用 Deck 类。

在 Player 构造函数中传递一个 Deck 实例,如下所示:

public class Player {

    private String name;
    private int chips;
    private Deck deck;

    public Player(String name, int chips, Deck deck) {
        this.name = name;
        this.chips = chips;
        this.deck = deck;
    }
}

【讨论】:

  • 我将如何更改我的 ArrayList 构造手以使用 Deck 甲板
【解决方案2】:

如果没有其他方便的地方放置你的甲板,你可以使用单例模式:

private ArrayList<Card> deck = new ArrayList<Card>();
private final int HANDSIZE = 5;

private static Deck deck = new Deck();

public static Deck getInstance() {
  return deck;
}

// Private Constructor
private Deck() {

    for(Suit suit : Suit.values()) {
        for(Value value : Value.values()){
            Card card = new Card(value, suit);
            deck.add(card);
        }
    }
}

public ArrayList<Card> draw() {

    Random rng = new Random();
    ArrayList<Card> hand = new ArrayList<Card>();
    for(int i = 0; i < HANDSIZE; i++){
    int getCard = rng.nextInt(deck.size());
    Card addCard = deck.get(getCard);
    hand.add(addCard);
    deck.remove(getCard);
    }

    return hand;
}

}

玩家从牌组中抽牌:

public class Player {

    private String name;
    private int chips;

    public Player(String name, int chips) {

        this.name = name;
        this.chips = chips;
    }

    public ArrayList<Card> draw() {
        Deck.getInstance().draw()
    }

【讨论】:

  • 这似乎工作正常,除了玩家 2 输出前 5 张牌加上额外的 5 张牌: 姓名:John Doe,现金:500 [方块八,方块二,黑桃二,红桃七,梅花杰克] 姓名:Jane Doe,现金:500 [方块八,方块二,黑桃二,红桃七,梅花杰克,方块十,黑桃五,方块六,钻石九,钻石杰克]
  • hand 应该是 draw 方法中的局部变量,而不是类的属性。以上更新。
【解决方案3】:

所以我会创建 5* 随机整数的玩家数量。然后将其分成五组,然后进入牌组并寻找那些编号的卡片。即a 0是黑桃2 a 13是三叶草2 a 14是三叶草等。此外,您还必须重复此过程,直到获得没有重复项的列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多