处理Java二十一点模拟器中的拆分 - 递归?

时间:2014-07-31 18:27:49

标签: java recursion

我正在创建一个二十一点模拟器来自学java,它已经非常有用。这是最后一块,然后它将是功能性的。我在处理拆分方面遇到了麻烦。如果你不玩二十一点,分裂意味着玩家有机会拿走他们最初的每张牌并为每个牌创造一个新牌。

目前,有一个卡类和一个卡片组的卡片组。还有一个玩家类,其中有一个名为hand的对象,也是一个卡片的arraylist。玩家有一个名为bet的变量,这是每手牌下注的金额。

分裂的问题是它创造了一个额外的牌,现在这些牌中的每一手都有自己的赌注。我需要修改程序并自己动手吗?这似乎有点矫枉过正,它可能会产生自己的问题。例如,在某些时候,无论如何,玩家将不得不处理多手牌。

我的第二个想法是在play方法中处理它,它以递归方式处理所有基本策略。有两个问题,一个是我从未使用过递归,另外两个是,每个人只有一个手对象。

第三个看起来也很混乱的想法是创建一个扩展人类类并创建额外手牌的playerSplit类。问题是在任何一轮中每人可能有多次分裂。

我包含了我认为相关的代码,因为程序有点长,无法包含所有内容。如果需要额外的代码,请告诉我。

人类构造函数

public Human(String name, Deck deck){
    this.handValue = 0;
    this.name = name;
    this.hand = new ArrayList<Card>();
    this.deck = deck;
}

玩家构造函数(Player类扩展Human):

public Player(String name, Deck deck, double minBet, double maxBet){
    super(name, deck);
    this.bankroll = 1000;
    this.minBet = minBet;
    this.maxBet = maxBet;
    this.bet = minBet;
}

2 个答案:

答案 0 :(得分:1)

尝试思考不同对象如何在二十一点游戏中进行交互。经销商将牌发给玩家,然后玩家可以握手,如果手被拆分,则发牌。

在你的Human构造函数中,你有一个代表手的牌的arraylist。不应该把它绑在人身上,而应该为一手牌设一个单独的类。

Hand类具有卡片列表,与其相关的投注以及与手牌相关的其他方法。

Human课程中,有一个存储所有玩家手的arraylist,如下所示:

ArrayList<Hand> hands;

还有一种方法可以分开一只手,该手将一只手作为输入并在分割后返回新手。你可以这样做:

public ArrayList<Hand> splitHand(Hand h)

在编写这样的应用程序时,你应该把所有东西分成它们自己的类,它们可以相互独立地运行,封装它们的逻辑。你应该认识到一手牌是一个独立的对象,有自己的属性和方法,而不是你的手直接作为一组牌附加到玩家。以这种方式编程要容易得多。例如,检查手是否等于21可以通过在手类上添加一个方法来完成,该方法被称为hand.getSum()之类的东西。

答案 1 :(得分:0)

递归似乎不适合表示系统状态。

假设一个玩家拥有多只手,每只手都拥有它自己的状态并且必须在gui中渲染,那么你最好在每个玩家之间建立一对多的关系并且手数是多少播放。

在二十一点中,玩家也可以坐在桌子上并在桌子上玩多手牌,所以如果你要模拟真正的赌场式游戏,这种一对多的关系已经存在。