You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yahtzee游戏开发:如何实现玩家手牌展示与保留骰子功能?

Yahtzee游戏骰子功能问题修复方案

核心问题分析与修复

1. Hand类构造函数的static骰子问题

你在Hand构造函数里使用static Dice,会导致所有Hand实例共享同一组骰子,完全不符合游戏逻辑——每个玩家或每轮游戏都应该拥有独立的骰子实例。直接移除static修饰,改为创建独立的骰子对象:

Hand::Hand(){
  for (int i = 0; i < HAND_SIZE; i++) {
    dice_array[i] = new Dice(); // 每个骰子都是独立实例
    dice_array[i]->roll();
  }
}
// 新增析构函数避免内存泄漏
Hand::~Hand(){
  for (int i = 0; i < HAND_SIZE; i++) {
    delete dice_array[i];
  }
}

2. setSelection函数未重置选中状态

当前代码仅设置选中骰子的保留状态,但不会取消之前的选择。比如玩家第一次选了"12",第二次选"34",骰子1、2仍会被错误保留。需要先重置所有骰子为不保留状态,再设置选中项:

void Hand::setSelection(string selection){
  // 先重置所有骰子为不保留
  for(int i = 0; i < HAND_SIZE; i++){
    dice_array[i]->setcheckDice(false);
  }
  // 再设置选中的骰子,增加边界检查防止无效输入
  int num;
  for(int i = 0; i < selection.size(); i++){
    num = selection.at(i)-'0';
    if(num >=1 && num <= HAND_SIZE){
      dice_array[num - 1]->setcheckDice(true);
    }
  }
}

3. show函数优化展示体验

原show函数仅显示骰子数值,玩家无法直观对应骰子编号。建议添加编号标注,方便玩家选择保留项:

void Hand::show(){
  cout << "当前骰子:" << endl;
  for (int i = 0; i < HAND_SIZE; i++){
    cout << "[" << (i+1) << "] " << dice_array[i]->reveal() << " ";
  }
  cout << endl;
}

4. 可选优化:使用智能指针管理内存

如果使用C++11及以上版本,建议用std::unique_ptr代替裸指针,避免手动管理内存的风险:

#include <memory>
class Hand {
private:
    std::unique_ptr<Dice> dice_array[HAND_SIZE];
};
// 构造函数修改为
Hand::Hand(){
  for (int i = 0; i < HAND_SIZE; i++) {
    dice_array[i] = std::make_unique<Dice>();
    dice_array[i]->roll();
  }
}
// 无需手动编写析构函数,智能指针自动释放内存

注意事项

确保你的Dice类正确实现了setcheckDice和getcheckDice方法,比如包含私有成员bool isKept;及对应的setter、getter函数。

内容的提问来源于stack exchange,提问作者Genie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:31:11