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
相关产品推荐
相关产品推荐

