JianGuanTHU / UOJ_Offline

Offline test system for THUOOP
7 stars 0 forks source link

Proposal (第五次作业, 属性相克与Pokemon Battle) #25

Open GengarQ opened 2 years ago

GengarQ commented 2 years ago

知识点

类继承、虚函数与多态、STL容器

题目描述

小明和李华很喜欢玩精灵宝可梦(Pokemon),他们在学习了类继承、虚函数与多态、STL相关知识后,希望能自己模拟出一些简单的宝可梦对战情景。宝可梦对战(本题中仅说明1v1单打对战)规则的简要描述如下:

1.双方各派出一只宝可梦,每个宝可梦都有自己的HP值(初始为满),每回合结束后,若一方HP值为0,则判定该方被击败,对战结束。

2.每只宝可梦均有自己的属性(type)和技能(move)(技能也有属性),出于简化考虑,本题仅考虑攻击技能(即:没有变化技能),若攻击技能的属性克制对方宝可梦的属性,该技能伤害翻倍,若被对方属性所抵抗,则伤害减半,若被对方属性所免疫,则不造成伤害。并伴随相应输出“效果拔群!”或“收效甚微...”或“对xxx完全没有效果...”(详细参见示例)。属性相克表已给出,你需要考虑如何使用合适的STL容器来在战斗中判定属性之间的关系。(从左到右,即从普通系到钢系,我们依次用整数0~16来表示这17种属性) 属性相克表(第二至第五世代)

3.每只宝可梦均可携带道具(item),出于简化考虑,道具仅分为回复道具、攻击道具。回复道具可以在每回合结束后给宝可梦回复HP,攻击道具可以增加宝可梦的技能伤害(在使用技能时)。这两种道具均有可能是消耗型的,即仅可使用一次,消耗后你应当将道具立刻析构,之后将无法使用。题目已给出道具基类item,你需要补充出回复道具和攻击道具的定义。

(其他细节参见代码注释和样例解释)

输入样例

输出样例

小明派出了皮卡丘! 李华派出了水箭龟!

皮卡丘使用了铁尾, 收效甚微... 水箭龟使用了冰冻光束, 水箭龟用吃剩的东西回复了HP, 皮卡丘使用了十万伏特, 效果拔群! 水箭龟使用了加农光炮, 收效甚微... 水箭龟用吃剩的东西回复了HP, 皮卡丘使用了铁尾, 收效甚微... 水箭龟使用了水炮, 水箭龟用吃剩的东西回复了HP, 皮卡丘使用了十万伏特, 效果拔群! 水箭龟使用了地震, 效果拔群! 皮卡丘倒下了。

李华战胜了小明!

样例解释:

第一回合,皮卡丘使用铁尾,由于水抵抗钢,故伤害减半,水箭龟使用冰冻光束,冰对电无克制/抵抗/免疫关系,回合结束后水箭龟使用吃剩的东西回复体力。(伤害计算公式为,实际伤害=技能伤害属性相克倍率(1+提高伤害比例)(不携带道具时提高伤害比例为0,如样例中皮卡丘伤害提升比例为0.3,水箭龟为0),结果向下取整。HP回复公式为:回复量=最大HP*回复比例,向下取整,如样例中水箭龟回复比例为0.0625,皮卡丘为0) 第二回合,皮卡丘使用十万伏特,由于电克制水,故伤害翻倍,水箭龟使用加农光炮,由于水抵抗钢,故伤害减半,回合结束后水箭龟使用吃剩的东西回复体力。 第三回合,皮卡丘使用铁尾,皮卡丘使用铁尾,由于水抵抗钢,故伤害减半,水箭龟使用水,水对电无克制/抵抗/免疫关系,回合结束后水箭龟使用吃剩的东西回复体力。 第四回合,皮卡丘使用十万伏特,由于电克制水,故伤害翻倍,水箭龟使用地震,由于地克制电,故伤害翻倍,回合结束后皮卡丘倒下,战斗结束。

要求

提交格式

你应该提交打包提交除要求中不能修改的文件,包含Healitem.h和Attackitem.h,Move.h,Effect.h。 我们会将main.cpp,Item.h复制进你上传的文件中编译并运行。

评分标准

OJ评分占100%

hzhwcmhf commented 2 years ago

请具体解释一下考查的知识点,需要展示提供的代码核心部分 另外请注意两件事:

  1. 尽量不要在输入输出中出现中文,不同系统下默认编码不同,中文检测可能不太正常
  2. OOP主要考察设计模式和对象的封装,复杂的应用逻辑不是我们的考点,可以考虑适当简化
GengarQ commented 2 years ago

请具体解释一下考查的知识点,需要展示提供的代码核心部分 另外请注意两件事:

  1. 尽量不要在输入输出中出现中文,不同系统下默认编码不同,中文检测可能不太正常
  2. OOP主要考察设计模式和对象的封装,复杂的应用逻辑不是我们的考点,可以考虑适当简化

好的,谢谢助教,我会按照要求修改的。请问现在算proposal通过可以继续出题了吗,还是说需要重新提交proposal,因为proposal的ddl是明天,我怕难以完成相对全面的工作...

hzhwcmhf commented 2 years ago

目前还不确定这题符合我们的要求。你可以继续修改,在下周末前通过即可。但其中可能会有若干次的讨论,这些讨论最好在下周末前结束,所以还是尽早比较好。

GengarQ commented 2 years ago

目前还不确定这题符合我们的要求。你可以继续修改,在下周末前通过即可。但其中可能会有若干次的讨论,这些讨论最好在下周末前结束,所以还是尽早比较好。

好的没问题,谢谢助教。

GengarQ commented 2 years ago

目前还不确定这题符合我们的要求。你可以继续修改,在下周末前通过即可。但其中可能会有若干次的讨论,这些讨论最好在下周末前结束,所以还是尽早比较好。

助教好,我把题目基本完成了,请问可以加一下微信交流吗?

hzhwcmhf commented 2 years ago

如果对题目有进一步讨论,可以就在issue里交流。我的微信号和github一致,hzhwcmhf

GengarQ commented 2 years ago

知识点

类对象的创建与销毁、类的组合与继承、虚函数与多态、STL容器

题目描述

小明和李华很喜欢玩精灵宝可梦(Pokemon),他们在学习了OOP相关知识后,希望能自己模拟出一些简单的宝可梦对战情景。宝可梦对战(本题中仅说明1v1单打对战)规则的简要描述如下:

  1. 双方各派出一只宝可梦,每个宝可梦都有自己的HP值(初始为满),每回合结束后,若一方HP值为0,则判定该方被击败,对战结束。

  2. 每只宝可梦均有自己的属性(type)和技能(move)(技能也有属性),出于简化考虑,本题仅考虑攻击技能(即:所有技能的作用均是给对方造成伤害),若攻击技能的属性克制对方宝可梦的属性,该技能伤害翻倍,若被对方属性所抵抗,则伤害减半,若被对方属性所免疫,则不造成伤害。并伴随相应输出(详细参见示例)。属性相克表已给出(事实上,你并不需要这张表,因为本题已将属性相克关系存储在容器中,你只需要利用它构建出正确的映射)。 属性相克表(第二至第五世代)

  3. 每只宝可梦均可携带道具(item),出于简化考虑,道具仅分为回复道具、攻击道具。回复道具可以在每回合结束后给宝可梦回复HP,攻击道具可以增加宝可梦的技能伤害(在使用技能时)。这两种道具均有可能是消耗型的,即仅可使用一次,消耗后,道具将被销毁,并在之后的回合中无法使用。题目已给出道具基类Item,你需要完成这两种派生类的定义。

(其他细节参见代码注释和样例解释)

输入说明

输入样例1

Pikachu 400 Electric 2 Life Orb 1 1 0.3 Thunderbolt 90 Electric
Iron Tail 90 Steel Blastoise 540 Water 4 Leftovers 0 1 0.0625 Hydro Pump 110 Water Ice Beam 90 Ice Flash Cannon 80 Steel Earthquake 100 Ground 6 1 1 0 2 1 0 0 3 0 2 0 1

输出样例1

[Battle] XiaoMing sent out Pikachu! [Battle] LiHua sent out Blastoise!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Blastoise used Ice Beam! [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Blastoise used Flash Cannon! [Battle] It's not very effective... [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Blastoise used Hydro Pump! [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Blastoise used Earthquake! [Battle] It's super effective! [Battle] XiaoMing's Pikachu fainted!

LiHua defeated XiaoMing! Pikachu's HP: 0 Blastoise's HP: 55

样例解释1:

要求

提交格式

你应该提交打包提交除要求中不能修改的文件,包含Heal_item.h,Attack_item.h,Pokemon.cpp和Effect.cpp。 我们会将main.cpp,Item.h,Move.h,Effect.h,Pokemon.h复制进你上传的文件中编译并运行。

评分标准

OJ评分占100%

本题考查要点

  1. 本题首先考查同学们对STL容器的理解,需要正确理解set、map、tuple的用法才能正确构建两个map容器嵌套的映射关系。 (防hack说明:若选择看表而不是通过给定的tuple元组来构建映射,但由于表中信息繁杂,工作量大大增加。若选择利用tuple元组直接解题,实现难度相近,如有需要,可以再增加对给定的双重map嵌套容器的check来进行检验是否被hack)
  2. 本题考查了含有类成员的类对象的构造,同学们在编写Pokemon的构造函数时,易忽略子类的构造而造成报错,也易因忽视子类Item的不同派生类而出错。
  3. 本题考察了虚函数与多态,同学们易忽视Item基类是纯虚函数而导致错误,或因为没有正确实现派生类对应函数的重写而导致错误。
  4. 本题考查了类对象的析构,同学们容易忽视题目中“销毁道具”的条件而出错。
  5. 本题考查了向下类型转换,同学们若无法正确利用dynamic_cast将无法写出正确的代码。
  6. 本题考查了同学们对较复杂类对象的成员间逻辑的理解和运用,考验同学们灵活调用成员函数的能力。
  7. 本题考查了同学们通过阅读代码和输入输出来实现代码设计的能力,且没有在不必要的输出细节或题目背景的游戏逻辑上刁难同学。
hzhwcmhf commented 2 years ago
  1. 整体接口需要重新设计。

    • 目前程序中使用了很多全局变量,这种做法是不太合适的。特别是头文件中的全局变量,如果被多个cpp包含会导致链接错误。能使用局部变量时应使用局部变量。
    • 有些接口比较费解,比如pokemon_1->use_move(m1);会修改pokemon2的hp,这种设计不太直观
    • C++中能使用对象或引用的情况下尽量少用指针。
  2. 关于考点的问题

    • Item目前使用方法比较混乱,Item::use虚函数只用于恢复,攻击又在Pokemon::update_HP中实现。而且这里使用子类看起来并不能使代码更简洁
    • 从tuple容器转换为map看起来没什么必要,和题目本身功能无关,看起来是故意设计考点,推荐从文本读入
GengarQ commented 2 years ago

知识点

类对象的创建与销毁、类的组合与继承、虚函数与多态

题目描述

小明和李华很喜欢玩精灵宝可梦(Pokemon),他们在学习了OOP相关知识后,希望能自己模拟出一些简单的宝可梦对战情景。宝可梦对战(本题中仅说明1v1单打对战)规则的简要描述如下:

  1. 双方各派出一只宝可梦,每个宝可梦都有自己的HP值(初始为满),每回合结束后,若一方HP值为0,则判定该方倒下,对战结束。

  2. 每只宝可梦均有自己的属性(type)和技能(move)(技能也有属性),出于简化考虑,本题仅考虑攻击技能(即:所有技能的作用均是给对方造成伤害),若攻击技能的属性克制对方宝可梦的属性,该技能伤害翻倍,若被对方属性所抵抗,则伤害减半,若被对方属性所免疫,则不造成伤害。并伴随相应输出(详细参见示例)。属性相克表已给出(事实上,你并不需要这张表,因为本题已将属性相克关系存储在容器中,你只需要利用它构建出正确的映射)。 属性相克表(第二至第五世代)

  3. 每只宝可梦均可携带道具(item),出于简化考虑,道具仅分为回复道具、攻击道具。回复道具可以在每回合结束后给宝可梦回复HP,攻击道具可以增加宝可梦的技能伤害(在使用技能时)。 其中,攻击道具有两种,第一种不具有属性,对所有技能均有伤害加成作用;第二种攻击道具具有自己的属性,当且仅当使用技能的属性与道具属性相同时,才能有伤害加成。 回复道具也有两种,第一种可以回复固定常数的HP值;第二种可回复自身最大HP值一定比例的HP值。 这两种道具均有可能是消耗型的,即仅可使用一次,消耗后,道具将被销毁,并在之后的回合中无法使用。题目已给出道具类Item,攻击道具类atk_item,回复道具类heal_item,你需要完成不同种类的攻击道具和回复道具派生类的定义。

    (其他细节参见代码注释和样例解释)

输入说明

输入样例1

Pikachu 400 Electric 2 Life Orb 1 1 0.3 null Thunderbolt 90 Electric
Iron Tail 90 Steel Blastoise 540 Water 4 Leftovers 0 1 0.0625 Hydro Pump 110 Water Ice Beam 90 Ice Flash Cannon 80 Steel Earthquake 100 Ground 6 1 1 0 2 1 0 0 3 0 2 0 1

输出样例1

[Battle] XiaoMing sent out Pikachu! [Battle] LiHua sent out Blastoise!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Blastoise used Ice Beam! [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Blastoise used Flash Cannon! [Battle] It's not very effective... [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Blastoise used Hydro Pump! [Battle] Blastoise restored some HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Blastoise used Earthquake! [Battle] It's super effective! [Battle] XiaoMing's Pikachu fainted!

LiHua defeated XiaoMing! Pikachu's HP: 0 Blastoise's HP: 55

样例解释1:

要求

提交格式

你应该提交打包提交除要求中不能修改的文件,至少包含heal_item_1.h,heal_item_2.h,attack_item_1,attack_item_2.h,Pokemon.cpp,makefile。 我们会将main.cpp,Item.h,Move.h,Effect.h,Pokemon.h,atk_item.h,heal_item.h复制进你上传的文件中编译并运行。

评分标准

OJ评分占100%

hzhwcmhf commented 2 years ago
  1. 建议分离Pokemon和Item的初始化,即Pokemon的初始化不包含Item初始化,Item另外初始化。初始化时直接给出四种道具的类名,比如set_item(new Atk_Item_1(xx, xx, xx))。move同理。这样减少了Pokemon和技能、Item的耦合关系
  2. Item基类最好有些功能,而不是只储存属性。比如说如果有道具有多次有限的使用次数,基类可以处理。比如Item可以给一个can_use来判断是否能继续使用,use来减少使用次数。
  3. heal_item最好不是直接返回一个数,这样拓展性不好。可以考虑virtual void heal(Pokemon* pokemon),让heal_item直接修改pokemon的hp。
  4. 攻击道具同理。而且目前两种攻击道具在机制上变化不大,希望能有更大的区别。
  5. 建议再想想,如果之后再加一个更复杂的攻击道具类型(或者别的功能),是否容易添加。如果容易的话说明这个设计合理,否则这个设计就不够合理。
  6. new必须delete,main函数Pokemon就没有delete。
  7. C++一般推荐局部变量在使用前附近声明,main函数中局部变量可以放到不同的地方,看的更清楚
  8. Effect仍然包括全局变量,这个全局变量在头文件声明,如果被多个cpp include会导致链接错误。一般全局变量要放到cpp里声明,头文件是extern。但我更建议用类的static变量。
  9. 一些函数的命名需要修改。例如Move->Skill attk_item_1、s1、s2都可以找些有意义的名字。另外有些缩进挺怪的,最好调整一下
  10. 一些文件可以合并避免文件过多,例如item、atkitem、healitem可以合并一个头文件。
  11. 麻烦下次给我一份完整包含答案的文件,我觉得现在让同学们填的部分不是特别合适,可以看下需要填哪些
GengarQ commented 2 years ago

知识点

类对象的创建与销毁、类的组合与继承、虚函数与多态

题目描述

小明很喜欢玩精灵宝可梦(Pokemon),他在学习了OOP相关知识后,希望能自己模拟出一些简单的宝可梦对战情景。宝可梦对战(本题中仅说明1v1单打对战)规则的简要描述如下:

  1. 双方各派出一只宝可梦,每个宝可梦都有自己的HP值(初始为满),每回合结束后,若一方HP值为0,则判定该方倒下,对战结束。

  2. 每只宝可梦均有自己的属性(type)和技能(move)(技能也有属性),出于简化考虑,本题仅考虑攻击技能(即:所有技能的作用均是给对方造成伤害),若攻击技能的属性克制对方宝可梦的属性,该技能伤害翻倍,若被对方属性所抵抗,则伤害减半,若被对方属性所免疫,则不造成伤害。并伴随相应输出(详细参见示例)。属性相克表已给出(事实上,你并不需要这张表,因为本题已将属性相克关系存储在容器中,你只需要利用它构建出正确的映射)。 属性相克表(第二至第五世代)

  3. 每只宝可梦均可携带道具(item),出于简化考虑,道具仅分为回复道具、攻击道具。回复道具可以在每回合结束后给宝可梦回复HP,攻击道具可以增加宝可梦的技能伤害(在使用技能时)。 攻击道具可以有自己的属性,若不具有属性,对所有技能均有伤害加成作用,若有自己的属性,当且仅当使用技能的属性与道具属性相同时,才能有伤害加成。其中,攻击道具有两种,一种使用时不会给自己造成伤害,另一种使用时会给自己造成伤害。 回复道具也有两种,第一种可以回复固定常数的HP值;第二种可回复自身最大HP值一定比例的HP值。 这两种道具均有可能是消耗型的,即仅可使用一次,消耗后,道具将被销毁,并在之后的回合中无法使用。题目已给出道具类Item,攻击道具类atk_item,回复道具类heal_item,你需要完成不同种类的攻击道具和回复道具派生类的定义。

    (其他细节参见代码注释和样例解释)

输入说明

输入样例1

Ash Pikachu 400 Electric 2 Life Orb 1 1 1 0.3 null 0.1 Thunderbolt 90 Electric
Iron Tail 90 Steel Gary Blastoise 540 Water 4 Leftovers 0 1 0.0625 Hydro Pump 110 Water Ice Beam 90 Ice Flash Cannon 80 Steel Earthquake 100 Ground 6 1 1 0 2 1 0 0 3 0 2 0 1

输出样例1

[Battle] Ash sent out Pikachu! [Battle] Gary sent out Blastoise!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Pikachu is hurt by its Life Orb! [Battle] Blastoise used Ice Beam! [Battle] Blastoise restored a little HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Pikachu is hurt by its Life Orb! [Battle] Blastoise used Flash Cannon! [Battle] It's not very effective... [Battle] Blastoise restored a little HP using its Leftovers!

[Battle] Pikachu used Iron Tail! [Battle] It's not very effective... [Battle] Pikachu is hurt by its Life Orb! [Battle] Blastoise used Hydro Pump! [Battle] Blastoise restored a little HP using its Leftovers!

[Battle] Pikachu used Thunderbolt! [Battle] It's super effective! [Battle] Pikachu is hurt by its Life Orb! [Battle] Blastoise used Earthquake! [Battle] It's super effective! [Battle] Ash's Pikachu fainted!

Gary defeated Ash! BATTLE END! Pikachu's HP: 0 Blastoise's HP: 55

样例解释1:

要求

提交格式

你应该提交打包提交除要求中不能修改的文件,至少包含上述要求的文件。 我们会将main.cpp,Item.h,Move.h,Effect.h,Pokemon.h复制进你上传的文件中编译并运行。

评分标准

OJ评分占100%

hzhwcmhf commented 2 years ago

请将完整题面、数据(包括数据生成文件)、judger和答案程序,自行测试通过。完成之后发到邮箱 huangfei382@163.com。对于编写judger有问题可在小教员群(或找助教)讨论。 注意: