如何用C++实现符合指定要求的发牌函数Deal?
实现交替发牌的
Deal函数方案 首先明确需求:
函数
int Deal(int,CardSet&,CardSet&)需将牌分发给传入的两个CardSet参数,第一个参数为每手牌的牌数。需从当前牌组依次取牌,交替放入两个手牌。例如:若当前牌组为2S、3S、4S、5S、6S、7S(对应整数0至5),需发3张牌,则两个手牌分别获得2S、4S、6S(整数0、2、4)和3S、5S、7S(整数1、3、5)。
实现思路
核心是按顺序交替分配牌:从当前牌组的起始位置开始,先取一张给第一个玩家,再取一张给第二个玩家,重复这个过程直到两个玩家都拿到指定数量的牌。同时要做好参数校验和牌数检查,避免出现无效操作或越界访问。
代码实现
假设我们有一个全局的currentDeck(当前牌组),且CardSet类提供了基础的牌组操作方法(size()、getCardAt()、removeCardAt()、addCard()),下面是具体的函数实现:
// 假设Card是单张牌的类型,CardSet是牌组/手牌的容器类 int Deal(int numCards, CardSet& player1Hand, CardSet& player2Hand) { // 校验输入的每手牌数是否合法 if (numCards <= 0) { return -1; // 返回-1表示无效的牌数参数 } // 引用全局的当前牌组(如果是类成员则替换为this->currentDeck) extern CardSet currentDeck; // 检查当前牌组是否有足够的牌供分发 if (currentDeck.size() < 2 * numCards) { return -2; // 返回-2表示当前牌组牌数不足 } // 交替发牌循环 for (int i = 0; i < numCards; ++i) { // 给第一个玩家发当前牌组的第一张牌 Card player1Card = currentDeck.getCardAt(0); player1Hand.addCard(player1Card); currentDeck.removeCardAt(0); // 给第二个玩家发当前牌组的第一张牌(此时是原牌组的第二张) Card player2Card = currentDeck.getCardAt(0); player2Hand.addCard(player2Card); currentDeck.removeCardAt(0); } // 发牌成功,返回0 return 0; }
关键细节说明
- 参数校验:先判断输入的
numCards是否为正,避免无效的发牌请求;再检查当前牌组的剩余牌数是否至少为2 * numCards,确保能满足两个玩家的需求。 - 交替逻辑:每次从当前牌组的头部(索引0)取牌,先分配给第一个玩家,再分配给第二个玩家。因为每次取牌后会从当前牌组移除该牌,所以下一次取的就是原牌组的下一张,完美匹配需求中的交替规则。
- 返回值设计:用不同的整数返回值区分成功和不同的失败场景,方便调用者后续处理错误。
简化版本(如果CardSet支持pop_front方法)
如果你的CardSet类提供了pop_front()方法(移除并返回牌组的第一张牌),代码可以更简洁:
int Deal(int numCards, CardSet& player1Hand, CardSet& player2Hand) { if (numCards <= 0 || currentDeck.size() < 2 * numCards) { return numCards <= 0 ? -1 : -2; } for (int i = 0; i < numCards; ++i) { player1Hand.addCard(currentDeck.pop_front()); player2Hand.addCard(currentDeck.pop_front()); } return 0; }
内容的提问来源于stack exchange,提问作者muzzi
相关产品推荐
相关产品推荐

