大神们看看这个题目如何设计 有思路的可以一起交流

benpaodelvzi 2014-05-28 04:14:50
英雄PK模拟器
三个英雄角色参与PK
每个英雄具有以下几个属性:生命值(为0时英雄倒下)、攻击力(每次攻击时扣除对方的生命值点数)、攻击间隔(每次攻击过后都要等待间隔时间才能进行下次攻击,首次攻击之前也要先等待间隔时间)
另外,每个英雄都拥有两个技能:攻击技能和防御技能,攻击技能在攻击对方时有一定概率发动,防御技能在被对方攻击时有一定概率发动,具体参数如下

BM:
生命650 攻击力40 攻击间隔1.5s
攻击技能(跳劈):每次攻击时有30%几率造成双倍伤害
防御技能(反弹):每次被攻击时有30%几率把我方受到的伤害反弹给对方,例如我方被攻击,对方攻击力30,扣除我方30点生命值,如果技能发动,则对方也要扣除30点生命值,伤害只能反弹一次(两个BM相互PK的时候不出现连续反弹)

DH:生命600 攻击力30 攻击间隔1s
攻击技能(吸血):每次攻击时有30%几率把造成的伤害转变为自己的生命值(对被攻击者造成伤害,并且将攻击伤害转变成自己的生命值),但不能超过上限,例如我方攻击,扣除对方30的生命值,同时给自己增加30点生命值
防御技能(闪避):每次被攻击时有30%几率闪避不受伤害

MK:
生命700 攻击力50 攻击间隔2.5s
攻击技能(重击):每次攻击时有30%几率造成对方眩晕3s的效果(对方受到伤害后附加眩晕),对方英雄眩晕期间不能发起攻击,只能挨打,被攻击时也不能发起防御技能,且眩晕结束后对方英雄要重新等待攻击间隔,眩晕时间不能叠加,如果对方已经处于眩晕,我方又发动攻击技能,那么对方眩晕时间重新开始计算
防御技能(天神):每次被攻击时有60%的几率防御一半伤害,例如我方被攻击,对方攻击力为40,如果技能发动,则只扣除我方20点生命值

1.程序启动后,监听控制台输入
2.输入任意两个英雄名称(逗号分隔)发起PK,格式:BM,DH
3.系统输出PK详细过程,直到有一方胜出,格式如下:
BM攻击DH,BM发动攻击技能,DH未发动防御技能,BM:350->350,DH:280->200
....
BM胜出

怎样去合理的设计类呢 用抽象类 还是接口?
要开几个线程呢?
我毫无头绪 你们有什么思路么
...全文
165 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rtdb 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 benpaodelvzi 的回复:
我希望设计的更正规一点 更符合面向对象的思想 不过 一个基类 派生三个类怎么做?
一个基类就是人物了, 记录生命,攻击力,攻击间隔 加个方法 :攻击(另一个人物) 派生三个类分别描述三个英雄 这就是最正规的面向对象的思想
liuxingfffff 2014-05-28
  • 打赏
  • 举报
回复
让我想起了,我以前玩一个页游。 想知道自己的武将 有多大几率 攻下一个城池 写的程序。
jimil 2014-05-28
  • 打赏
  • 举报
回复
好吧,以前想过该类问题,所以有自己的想法,其主要难点在于时间线,即什么时候轮到a攻击,什么时候轮到b攻击,完全有可能当a攻击两次时b才攻击,而且如果伤害过小,而导致信息庞大,这就完全没必要了,比如a攻击b一次只少1点血,b攻击a只一点血,而ab都有几百点血,总不可能信息保存个几百个回合吧,这必须得有个度,设定时间线的好处就是,总攻击是多少,超出总攻击即判定打和了。 讲到这里,你可以把时间线看成一条x轴,上面有很多攻击回合,但你只取nn个,时间线的制作当然不可能是真实时间线,不然间隔是2秒,50回合不是打到100秒去了,它只是一个模拟,你可以以当前时间为点,建立一个datatable,分别插入50次a对b的攻击和b对a的攻击,列分别为, a生命 b生命 发生时间 技能攻击描述 然后排序一下,然后循环,到50行或a or b的生命<=0 就break;掉,看,就这么简单,当然,这只是初步构造,其优化的空间还非常大,只需要再根据自己的需求再优化优化,你的战斗过程就完成了。 回答了你的问题,我真伤心,知识真是廉价啊,打了这么多字,给了整个过程模拟,才50分,快点去赚分吧,别让我再伤心一次了。
benpaodelvzi 2014-05-28
  • 打赏
  • 举报
回复
引用 3 楼 jimil 的回复:
你只需要模拟战斗过程,即时得到结果,然后过程结果各自存库就OK了,需要时调出过程即可。 开1个线程即可,然后bm和dh的战斗时,线程计算 0秒双方互殴,技能各自运算,然后开始根据间隔值模拟各自出手顺序,设定最大回合数为50,按间隔最短的人为50回合为止,再根据时间线开始模拟 然后,50分就是没下文了,哈哈,再加分给思路,不然也太不值钱了,你对知识的欲望也就值50分,这样不太好吧,哈哈
你看看我剩余3分 倾家荡产了啊
jimil 2014-05-28
  • 打赏
  • 举报
回复
你只需要模拟战斗过程,即时得到结果,然后过程结果各自存库就OK了,需要时调出过程即可。 开1个线程即可,然后bm和dh的战斗时,线程计算 0秒双方互殴,技能各自运算,然后开始根据间隔值模拟各自出手顺序,设定最大回合数为50,按间隔最短的人为50回合为止,再根据时间线开始模拟 然后,50分就是没下文了,哈哈,再加分给思路,不然也太不值钱了,你对知识的欲望也就值50分,这样不太好吧,哈哈
benpaodelvzi 2014-05-28
  • 打赏
  • 举报
回复
我希望设计的更正规一点 更符合面向对象的思想 不过 一个基类 派生三个类怎么做?
rtdb 2014-05-28
  • 打赏
  • 举报
回复
呵呵, 不要线程, 不用抽象类 还是接口 一个基类, 3个派生类就够了

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧