建设公司设计公司网站中山今科网站建设
2025/12/30 12:02:16 网站建设 项目流程
建设公司设计公司网站,中山今科网站建设,武穴市住房和城乡建设局网站,郑州网站建设详细内容推荐C 类继承、设计与装饰器模式 - 游戏角色示例 我将通过一个游戏角色系统来演示C中的类继承、类设计和装饰器模式。 完整代码示例 #include iostream #include string #include memory #include vector// 1. 基类设计#xff1a;游戏角色 cla…C 类继承、设计与装饰器模式 - 游戏角色示例我将通过一个游戏角色系统来演示C中的类继承、类设计和装饰器模式。完整代码示例#includeiostream#includestring#includememory#includevector// 1. 基类设计游戏角色 classGameCharacter{protected:std::string name;intlevel;inthealth;intbaseDamage;public:GameCharacter(conststd::stringname,intlevel,inthealth,intbaseDamage):name(name),level(level),health(health),baseDamage(baseDamage){}virtual~GameCharacter()default;// 虚函数 - 可以在派生类中被重写virtualvoidattack()const{std::coutname 发动普通攻击造成 baseDamage 点伤害std::endl;}// 虚函数 - 可以在派生类中被重写virtualvoidspecialAbility()const{std::coutname 使用了特殊能力std::endl;}// 非虚函数 - 不希望被重写voidtakeDamage(intdamage){health-damage;std::coutname 受到了 damage 点伤害剩余生命值: healthstd::endl;}// 纯虚函数 - 派生类必须实现virtualvoiddisplayStats()const0;voidheal(intamount){healthamount;std::coutname 恢复了 amount 点生命值当前生命值: healthstd::endl;}std::stringgetName()const{returnname;}intgetLevel()const{returnlevel;}intgetHealth()const{returnhealth;}intgetBaseDamage()const{returnbaseDamage;}voidsetBaseDamage(intdamage){baseDamagedamage;}voidsetHealth(inthp){healthhp;}};// 2. 继承具体游戏角色类 classWarrior:publicGameCharacter{private:intarmor;intrage;// 战士特有资源怒气值public:Warrior(conststd::stringname,intlevel,inthealth150,intbaseDamage30):GameCharacter(name,level,health,baseDamage),armor(10),rage(0){}// 重写基类的虚函数voidattack()constoverride{std::coutname 挥舞巨剑造成 baseDamage 点物理伤害std::endl;}// 重写基类的虚函数voidspecialAbility()constoverride{std::coutname 使用技能旋风斩造成 baseDamage*2 点范围伤害std::endl;}// 实现基类的纯虚函数voiddisplayStats()constoverride{std::cout 战士 std::endl;std::cout名称: namestd::endl;std::cout等级: levelstd::endl;std::cout生命值: healthstd::endl;std::cout基础伤害: baseDamagestd::endl;std::cout护甲值: armorstd::endl;std::cout怒气值: ragestd::endl;}// 战士特有方法voidshieldBash(){std::coutname 使用盾击造成 baseDamage*0.5 点伤害并击晕目标std::endl;rage10;}};classMage:publicGameCharacter{private:intmana;intmaxMana;public:Mage(conststd::stringname,intlevel,inthealth80,intbaseDamage20):GameCharacter(name,level,health,baseDamage),mana(100),maxMana(100){}// 重写基类的虚函数voidattack()constoverride{std::coutname 发射魔法飞弹造成 baseDamage 点魔法伤害std::endl;}// 重写基类的虚函数voidspecialAbility()constoverride{std::coutname 使用技能火球术消耗30法力造成 baseDamage*3 点火焰伤害std::endl;}// 实现基类的纯虚函数voiddisplayStats()constoverride{std::cout 法师 std::endl;std::cout名称: namestd::endl;std::cout等级: levelstd::endl;std::cout生命值: healthstd::endl;std::cout基础伤害: baseDamagestd::endl;std::cout法力值: mana/maxManastd::endl;}// 法师特有方法voidcastFireball(){if(mana30){mana-30;std::coutname 施放火球术造成 baseDamage*3 点火焰伤害std::endl;}else{std::coutname 法力值不足std::endl;}}voidmeditate(){manamaxMana;std::coutname 进行冥想恢复了全部法力值std::endl;}};// 3. 装饰器模式游戏角色装备/状态装饰器 // 装饰器基类classCharacterDecorator:publicGameCharacter{protected:std::shared_ptrGameCharacterdecoratedCharacter;public:CharacterDecorator(std::shared_ptrGameCharactercharacter):GameCharacter(character-getName(),character-getLevel(),character-getHealth(),character-getBaseDamage()),decoratedCharacter(character){}// 默认转发所有方法到被装饰的角色voidattack()constoverride{decoratedCharacter-attack();}voidspecialAbility()constoverride{decoratedCharacter-specialAbility();}voiddisplayStats()constoverride{decoratedCharacter-displayStats();}voidtakeDamage(intdamage)override{decoratedCharacter-takeDamage(damage);}};// 具体装饰器武器装饰器classWeaponDecorator:publicCharacterDecorator{private:std::string weaponName;intweaponDamage;public:WeaponDecorator(std::shared_ptrGameCharactercharacter,conststd::stringweaponName,intweaponDamage):CharacterDecorator(character),weaponName(weaponName),weaponDamage(weaponDamage){}voidattack()constoverride{std::coutdecoratedCharacter-getName() 使用 weaponName 进行攻击额外造成 weaponDamage 点伤害std::endl;decoratedCharacter-attack();}voiddisplayStats()constoverride{decoratedCharacter-displayStats();std::cout装备: weaponName (weaponDamage 攻击力)std::endl;}intgetBaseDamage()const{returndecoratedCharacter-getBaseDamage()weaponDamage;}};// 具体装饰器护甲装饰器classArmorDecorator:publicCharacterDecorator{private:std::string armorName;intarmorDefense;public:ArmorDecorator(std::shared_ptrGameCharactercharacter,conststd::stringarmorName,intarmorDefense):CharacterDecorator(character),armorName(armorName),armorDefense(armorDefense){}voidtakeDamage(intdamage)override{intreducedDamagedamage-armorDefense;if(reducedDamage0)reducedDamage0;std::coutarmorName 吸收了 armorDefense 点伤害std::endl;decoratedCharacter-takeDamage(reducedDamage);}voiddisplayStats()constoverride{decoratedCharacter-displayStats();std::cout护甲: armorName (armorDefense 防御)std::endl;}};// 具体装饰器状态效果装饰器如中毒classPoisonEffectDecorator:publicCharacterDecorator{private:intpoisonDamagePerTurn;intturnsRemaining;public:PoisonEffectDecorator(std::shared_ptrGameCharactercharacter,intpoisonDamage,intduration):CharacterDecorator(character),poisonDamagePerTurn(poisonDamage),turnsRemaining(duration){}voidattack()constoverride{std::coutdecoratedCharacter-getName() 在中毒状态下攻击效果减弱std::endl;// 中毒时攻击力减半autononConstCharstd::const_pointer_castGameCharacter(decoratedCharacter);intoriginalDamagenonConstChar-getBaseDamage();nonConstChar-setBaseDamage(originalDamage/2);decoratedCharacter-attack();nonConstChar-setBaseDamage(originalDamage);}voidtakeDamage(intdamage)override{// 中毒状态下受到额外伤害std::coutdecoratedCharacter-getName() 因中毒额外受到 poisonDamagePerTurn 点伤害std::endl;decoratedCharacter-takeDamage(damagepoisonDamagePerTurn);turnsRemaining--;if(turnsRemaining0){std::coutdecoratedCharacter-getName() 的中毒效果结束了std::endl;}}voiddisplayStats()constoverride{decoratedCharacter-displayStats();std::cout状态: 中毒 (剩余turnsRemaining回合每回合受到poisonDamagePerTurn点伤害)std::endl;}};// 4. 使用示例和测试 intmain(){std::cout 游戏角色系统演示 std::endlstd::endl;// 创建基础角色std::cout1. 创建基础角色:std::endl;autowarriorstd::make_sharedWarrior(阿尔萨斯,10);automagestd::make_sharedMage(吉安娜,8);warrior-displayStats();warrior-attack();warrior-specialAbility();std::coutstd::endl;mage-displayStats();mage-attack();mage-specialAbility();std::coutstd::endl;// 使用装饰器为角色添加装备std::cout2. 为战士添加装备:std::endl;autowarriorWithSwordstd::make_sharedWeaponDecorator(warrior,霜之哀伤,25);autowarriorWithArmorstd::make_sharedArmorDecorator(warriorWithSword,板甲,15);warriorWithArmor-displayStats();warriorWithArmor-attack();warriorWithArmor-takeDamage(50);std::coutstd::endl;// 为法师添加装备和状态效果std::cout3. 为法师添加装备和状态效果:std::endl;automageWithStaffstd::make_sharedWeaponDecorator(mage,埃提耶什,20);autopoisonedMagestd::make_sharedPoisonEffectDecorator(mageWithStaff,5,3);poisonedMage-displayStats();poisonedMage-attack();poisonedMage-takeDamage(20);poisonedMage-takeDamage(15);std::coutstd::endl;// 多层装饰器嵌套std::cout4. 多层装饰器嵌套完全装备的战士:std::endl;autofullyEquippedWarriorstd::make_sharedArmorDecorator(std::make_sharedWeaponDecorator(warrior,炎魔之手,35),巨龙之鳞,20);fullyEquippedWarrior-displayStats();fullyEquippedWarrior-attack();fullyEquippedWarrior-takeDamage(60);std::coutstd::endl;// 演示多态性std::cout5. 多态性演示角色集合:std::endl;std::vectorstd::shared_ptrGameCharactercharacters;characters.push_back(warrior);characters.push_back(mage);characters.push_back(warriorWithArmor);characters.push_back(poisonedMage);characters.push_back(fullyEquippedWarrior);for(constautocharacter:characters){std::cout--- character-getName() ---std::endl;character-attack();character-displayStats();std::coutstd::endl;}// 演示动态添加/移除装饰器std::cout6. 动态添加装饰器战士获得新武器:std::endl;warrior-displayStats();warrior-attack();autowarriorWithNewWeaponstd::make_sharedWeaponDecorator(warrior,萨弗拉斯,40);warriorWithNewWeapon-displayStats();warriorWithNewWeapon-attack();return0;}关键概念解释类继承· 基类 GameCharacter: 定义了所有游戏角色的通用属性和方法· 派生类 Warrior 和 Mage: 继承基类并添加职业特有属性和方法· 虚函数和纯虚函数: 实现多态行为类设计原则· 封装: 将数据成员设为私有/受保护通过公共接口访问· 单一职责: 每个类有明确的职责· 开闭原则: 对扩展开放对修改关闭装饰器模式· 装饰器基类 CharacterDecorator: 继承自 GameCharacter包含指向被装饰对象的指针· 具体装饰器: 添加特定功能而不修改原有类· 动态组合: 可以在运行时动态添加或移除功能编译和运行# 使用g编译g-stdc11-ogame_characters game_characters.cpp# 运行程序./game_characters输出示例程序将展示基础角色的创建和使用通过继承实现的不同职业装饰器为角色动态添加装备和状态效果多层装饰器嵌套多态性的实际应用这个示例完整展示了C中类继承、设计和装饰器模式的实际应用通过游戏角色系统使概念更加直观易懂。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询