鱼C论坛

 找回密码
 立即注册
楼主: jerryxjr1220

[技术交流] 鱼C论坛Python精英挑战赛(第二季05期)

[复制链接]
发表于 2017-8-21 22:58:54 | 显示全部楼层
楼主,有几个问题需要确认一下:
1、这个谁先谁后结果应该不一样吧?如果是BOSS先手或者后手,加血的策略是完全不同的,比如BOSS本回合用斩击,如果是先手,那自己后手加血是完全合理的,如果BOSS后手,那肯定是要攻击的
2、这个是写一个统一的程序吗?一个程序应对5个AI?不同AI策略差别很大。。。目前看第5个AI过于IMBA,平均输出已经达到26.5每回合,平均6回合的输出为159,这样只有5回合都加血才能抵御,考虑到BOSS的爆发,加血的回合数甚至需要更多,而且BOSS还有回血,6回合回血明显大于我们的输出,可以说等于无解。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-21 23:43:01 | 显示全部楼层
xiewen1235 发表于 2017-8-21 22:58
楼主,有几个问题需要确认一下:
1、这个谁先谁后结果应该不一样吧?如果是BOSS先手或者后手,加血的策略 ...

回答你的问题,
1. 这个是回合制计算的,即每一个回合Boss和玩家都可以有1次操作,回合结束时会统一统计,也就是说在同一回合内不存在先手和后手的问题,在同一回合内的加血和承受的伤害都会在回合结束时一并加减。
2. 你说的Boss输出高确实是的,但是玩家有“闪避”,可以闪避任何伤害,包括“斩杀”。所以,不能只单单考虑治疗回血,还需要结合“闪避”来避免承受高伤害的攻击。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 08:22:13 | 显示全部楼层
jerryxjr1220 发表于 2017-8-21 09:30
Boss回血无回合限制,每回合开始就会回5 HP。
玩家第一次使用治疗,马上就会回30 HP,在下2个回合内,每 ...

一开始没看懂规则,现在反复看懂了,实际上补血最大周期是2回合,第二回合也补血的话,实际损失的只有第三回合的buff
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 08:30:57 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-8-22 08:33 编辑
gunjang 发表于 2017-8-22 08:22
一开始没看懂规则,现在反复看懂了,实际上补血最大周期是2回合,第二回合也补血的话,实际损失的只有第 ...


是的,玩过“魔兽”这种网游的应该很好理解,“补血”的同时刷新了一个周期回血的“Buff”,这个“Buff”的周期是2回合,“Buff”只能被刷新,而不能叠加。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 08:38:29 | 显示全部楼层
xiewen1235 发表于 2017-8-21 22:58
楼主,有几个问题需要确认一下:
1、这个谁先谁后结果应该不一样吧?如果是BOSS先手或者后手,加血的策略 ...

其实,这道题可以用“贪心策略”和“状态机”组合方法来解,因为玩家已经预先知道了BOSS的出招表而且在任意回合都有“闪避”技能,所以准确来说,玩家其实是“无敌”的,问题只是应该如何以最短的回合击败BOSS。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 08:49:17 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-8-22 08:38
其实,这道题可以用“贪心策略”和“状态机”组合方法来解,因为玩家已经预先知道了BOSS的出招表而且在任 ...

这是要写五个程序吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 08:51:22 From FishC Mobile | 显示全部楼层
xiewen1235 发表于 2017-8-22 08:49
这是要写五个程序吗?

哦,理解了,是根据已知的boss序列生成自己的序列~~~提问可以无视
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 09:37:19 | 显示全部楼层
xiewen1235 发表于 2017-8-22 08:51
哦,理解了,是根据已知的boss序列生成自己的序列~~~提问可以无视

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 11:10:43 | 显示全部楼层
本帖最后由 小锟 于 2017-8-22 21:31 编辑
  1. #因为不用求最优解,就多加了很多条件
  2. #条件一 :boss用斩杀,player就闪避
  3. #条件二 :只要血量允许,就用搏命一击,否则就治疗,除非最后一下攻击就可以打死



  4. boss_skill_1 = ['普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击',
  5.                 '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击']

  6. boss_skill_2 = ['普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击']
  7. boss_skill_3 = ['普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀']
  8. boss_skill_4 = ['普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击']
  9. boss_skill_5 = ['致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击']

  10. def gen_skill(boss_skill):
  11.     count = 0
  12.     player_skill = []
  13.     boss_hp = player_hp = 100
  14.     boss_skills = {'普通攻击': 15, '致命一击': 25, '斩杀': 45}

  15.     while len(boss_skill) and boss_hp > 0:
  16.         if boss_hp <= 100:
  17.             boss_hp += 3
  18.         if boss_hp > 100 :
  19.             boss_hp = 100
  20.         if count > 0:
  21.             player_hp += 10
  22.             count -= 1
  23.         i = boss_skill.pop(0)
  24.         if i == '斩杀':
  25.             player_skill.append('躲闪')
  26.             #print('player:', player_hp, '     boss', i, boss_hp)
  27.             continue
  28.         player_hp -= boss_skills[i]

  29.         if 0 < player_hp and boss_hp <= 10:
  30.             player_skill.append('攻击')
  31.             boss_hp -= 10
  32.             #print('最后一击boss', boss_hp)
  33.             continue

  34.         if player_hp <= 10:
  35.             player_skill.append('治疗')
  36.             count = 2
  37.             player_hp += 30

  38.         elif boss_hp <= 10:
  39.             player_skill.append('攻击')
  40.             boss_hp -= 10

  41.         elif boss_hp > 10:
  42.             player_skill.append('搏命一击')
  43.             player_hp -= 10
  44.             boss_hp -= 20

  45.         #print('player:', player_hp,'     boss',i ,boss_hp)


  46.     return player_skill#,len(player_skill)


  47. for i in [boss_skill_1, boss_skill_2, boss_skill_3, boss_skill_4, boss_skill_5]:
  48.     print(gen_skill(i))


复制代码





  1. #输出结果
  2. ['搏命一击', '搏命一击', '搏命一击', '治疗', '搏命一击', '搏命一击', '治疗', '搏命一击', '攻击']
  3. ['搏命一击', '搏命一击', '搏命一击', '治疗', '搏命一击', '治疗', '搏命一击', '治疗', '搏命一击', '攻击']
  4. ['搏命一击', '搏命一击', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击']
  5. ['搏命一击', '搏命一击', '搏命一击', '躲闪', '治疗', '搏命一击', '治疗', '搏命一击', '躲闪', '治疗', '搏命一击', '治疗', '搏命一击']
  6. ['搏命一击', '搏命一击', '搏命一击', '躲闪', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击', '治疗', '治疗', '搏命一击', '躲闪', '治疗', '躲闪', '搏命一击', '治疗', '躲闪', '搏命一击']
复制代码

头大
想问下楼主什么是状态机啊,我这算贪心算法吗
搞不懂

点评

我很赞同!: 1.0
#boss_skill_1: round 9, boss_skill_2: round 10, boss_skill_3: round 19, boss_skill_4: round 13, boss_skill_5: round 20  发表于 2017-8-22 21:48
我把测试程序放上来了,你们可以自行用测试程序调试。  发表于 2017-8-22 20:11
我很赞同!: 1
实际测试结果: #boss_skill_1: round 9, boss_skill_2: round 11, boss_skill_3: lose, boss_skill_4: lose, boss_skill_5: lose  发表于 2017-8-22 19:58

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 14:12:29 From FishC Mobile | 显示全部楼层
小锟 发表于 2017-8-22 11:10
头大
想问下楼主什么是状态机啊,我这算贪心算法吗
搞不懂


按你的描述是“贪心算法”的逻辑,不过实际的程序还不够“贪心”,真正的贪心算法应该是只要player不死就尽可能的按最大攻击输出,当血量降到阈值以下就用治疗回血。
然后把所有的行动状态,血量状态和buff状态排列组合,形成对应的响应动作表,这就是状态机。
这和下棋是一个原理,也是棋类博弈软件设计的基础。下次可以专门开一帖讲解一下,你也可以自己百度一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 15:37:00 From FishC Mobile | 显示全部楼层
楼主,想请教下,如果该回合有buff,且使用治疗,是不是相当于buff和回血加在一起,也就是有40的回血呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 15:39:49 | 显示全部楼层
xiewen1235 发表于 2017-8-22 15:37
楼主,想请教下,如果该回合有buff,且使用治疗,是不是相当于buff和回血加在一起,也就是有40的回血呢?

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 15:45:49 | 显示全部楼层
为什么不隐藏回帖,我想发布来着
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 16:33:10 | 显示全部楼层
本帖最后由 撒法空间 于 2017-8-22 16:46 编辑
  1. #!/usr/bin/python
  2. #coding:utf-8



  3. def gen_skill(boss_skill):

  4.     boss = {'普通攻击':15,'致命一击':25,'斩杀':45,'回血':3}
  5.     player = {'攻击':10,'搏命一击':20,'躲闪':0,'治疗':30,}
  6.     boss_hp = 100
  7.     player_hp = 100
  8.     player_skill = []
  9.     count = 0
  10.     buff = 0

  11.     for b in boss_skill:
  12.         if b == '普通攻击':
  13.             if boss_hp <= 97:
  14.                 boss_hp += boss['回血']
  15.             else:
  16.                 boss_hp = 100
  17.             if buff:
  18.                 if player_hp <= 90:
  19.                     player_hp += 10
  20.                     buff -= 1
  21.                 else:
  22.                     player_hp = 100
  23.                     buff -= 1
  24.             player_hp -= boss[b]
  25.             if boss_hp <=20 and player_hp > 10:
  26.                 boss_hp -= player['搏命一击']
  27.                 player_hp -= 10
  28.                 count += 1
  29.                 player_skill.append('搏命一击')
  30.                 break
  31.             else:
  32.                 if player_hp <= 26:
  33.                     player_hp += player['治疗']
  34.                     buff = 2
  35.                     player_skill.append('治疗')
  36.                 else:
  37.                     boss_hp -= player['搏命一击']
  38.                     player_hp -= 10
  39.                     player_skill.append('搏命一击')
  40.                 count += 1
  41.                 if boss_hp <= 0 and player_hp > 0:
  42.                     break
  43.                 elif boss_hp > 0 and player_hp <= 0:
  44.                     print('在第%d回合时,玩家失败!!!'%count)
  45.                     break
  46.                 elif boss_hp <= 0 and player_hp <= 0:
  47.                     print('在第%d回合时,玩家失败!!!'%count)
  48.                     break
  49.         elif b == '致命一击':
  50.             if boss_hp <= 97:
  51.                 boss_hp += boss['回血']
  52.             else:
  53.                 boss_hp = 100
  54.             if buff:
  55.                 if player_hp <= 90:
  56.                     player_hp += 10
  57.                     buff -= 1
  58.                 else:
  59.                     player_hp = 100
  60.                     buff -= 1
  61.             player_hp -= boss[b]
  62.             if boss_hp <=20 and player_hp > 10:
  63.                 boss_hp -= player['搏命一击']
  64.                 player_hp -= 10
  65.                 count += 1
  66.                 player_skill.append('搏命一击')
  67.                 break
  68.             else:
  69.                 if player_hp >= 26:
  70.                     boss_hp -= player['搏命一击']
  71.                     player_hp -= 10
  72.                     player_skill.append('搏命一击')
  73.                 else:
  74.                     player_hp += player['治疗']
  75.                     buff = 2
  76.                     player_skill.append('治疗')
  77.                 count += 1
  78.                 if boss_hp <= 0 and player_hp > 0:
  79.                     break
  80.                 elif boss_hp > 0 and player_hp <= 0:
  81.                     print('在第%d回合时,玩家失败!!!'%count)
  82.                     break
  83.                 elif boss_hp <= 0 and player_hp <= 0:
  84.                     print('在第%d回合时,玩家失败!!!'%count)
  85.                     break
  86.         elif b == '斩杀':
  87.             if boss_hp <= 97:
  88.                 boss_hp += 3
  89.             else:
  90.                 boss_hp = 100
  91.             if buff:
  92.                 if player_hp <= 90:
  93.                     player_hp += 10
  94.                     buff -= 1
  95.                 else:
  96.                     player_hp = 100
  97.                     buff -= 1
  98.             if boss_hp <=20 and player_hp > 10:
  99.                 boss_hp -= player['搏命一击']
  100.                 player_hp -= 10
  101.                 count += 1
  102.                 player_skill.append('搏命一击')
  103.                 break
  104.             else:
  105.                 player_hp -= player['躲闪']
  106.                 player_skill.append('躲闪')
  107.                 count += 1
  108.                 if boss_hp <= 0 and player_hp > 0:
  109.                     break
  110.                 elif boss_hp > 0 and player_hp <= 0:
  111.                     print('在第%d回合时,玩家失败!!!'%count)
  112.                     break
  113.                 elif boss_hp <= 0 and player_hp <= 0:
  114.                     print('在第%d回合时,玩家失败!!!'%count)
  115.                     break


  116.     print('共用了%d回合击败boss'%count)
  117.     print('玩家剩余血量:%d'%player_hp,'boss剩余血量:%d'%boss_hp)
  118.     return player_skill



  119. boss_skill_4 = ['普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击']
  120. boss_skill_1 = ['普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击']
  121. boss_skill_2 = ['普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击']
  122. boss_skill_5 = ['致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击']
  123. boss_skill_3 = ['普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀']

  124. print(gen_skill(boss_skill_5))
复制代码


代码比较多,不过很容易理解。如果哪里有规则上的不匹配请告知。我改进。

点评

我很赞同!: 1.0
我很赞同!: 1
实测结果: boss_skill_1: round 10, boss_skill_2: round 11, boss_skill_3: lose, boss_skill_4: round 13, boss_skill_5: lose  发表于 2017-8-22 20:08

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励,代码还未测试,晚上去跑跑看

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 16:37:37 | 显示全部楼层
撒法空间 发表于 2017-8-22 16:33
代码比较多,不过很容易理解。如果哪里有规则上的不匹配请告知。我改进。

可惜只能写成一个函数,不然我可以把重复代码封装成另一个函数。这样就容易看多了

点评

我很赞同!: 5.0
我把测试程序放上来了,你们可以自行用测试程序进行调试。  发表于 2017-8-22 20:10
我很赞同!: 5
可以写子函数的。  发表于 2017-8-22 20:09
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 21:54:39 | 显示全部楼层
本帖最后由 xiewen1235 于 2017-8-22 22:57 编辑

代码只实现了逻辑分支的判断,因为按照自己的想法,单纯的状态机算法实在难以做到极限输出,所以代码看起来有点丑陋。。。说下思路:
1、显然,由于BOSS具备回血,且存在多种高输出方式,搏命一击的效率大大高于普通攻击

2、收尾采用了计算能否两回合杀死BOSS的方式,代码虽然并不美观,但是为之后的逻辑判断带来极大简化:
a.使得顶着斩击强杀BOSS成为可能,如果只有一回合判断,当斩击到来时很难采用躲避之外的命令,经过两回合杀死BOSS条件的过滤,遇到斩击可以毫不犹豫的执行躲避操作
b.可以在保证在充沛血量的基础上,收尾回合仍然保有较高的输出,降低血量浪费

3、治疗的判断,15的最低触发条件是为了防止次回合致命一击所导致的连续治疗,如果15还不进行治疗,使用搏命一击的情况下,下回合遇到致命一击会导致生命值下降为-20,使用治疗后也只有10,次回合20的血量将无法抵挡BOSS的攻击和搏命一击的连续发生,这时的连续治疗是性能很低的策略。至于斩击60的触发条件,是为了保证血量不溢出的情况下,尽可能具有最大的血量,为之后连续多回合的搏命一击做准备



  1. def gen_skill(boss_skill):
  2.     player_skill = []   #玩家技能列表
  3.     boss_health = 100  # BOSS血量
  4.     player_health = 100  # 玩家血量

  5.     boss_dict = {'普通攻击': 15, '致命一击': 25, '斩杀': 45}
  6.     total_len = len(boss_skill)     #BOSS总技能长度

  7.     health_times = 0

  8.     for i in range(total_len - 1):          #循环总技能
  9.         if health_times > 0:                #提前判定是否具有恢复BUFF
  10.             player_health += 10             #有BUFF,血量+10.buff回合-1
  11.             health_times -= 1

  12.         player_hurt = boss_dict[boss_skill[i]]      #判定BOSS伤害
  13.         player_hurt2 = player_hurt + boss_dict[boss_skill[i]] - 10 * health_times   #判定BOSS两回合伤害
  14.         if boss_health <= 34 and player_health > player_hurt:  # 存在两步杀死BOSS之可能
  15.             if boss_health <= 7:
  16.                 player_skill.append('攻击')  # 杀死BOSS
  17.                 break
  18.             elif boss_health <= 24 and player_health > (player_hurt + 10):
  19.                 if boss_health <= 17:
  20.                     player_skill.append('搏命一击')  # 搏命一击杀死BOSS
  21.                     break
  22.                 else:
  23.                     if player_health > (player_hurt2 + 10):
  24.                         player_skill.append('搏命一击')
  25.                         player_skill.append('攻击')  # 2连击杀死BOSS
  26.                         break
  27.             elif player_health > (player_hurt2 + 20):
  28.                 player_skill.append('搏命一击')
  29.                 player_skill.append('搏命一击')  # 2搏命击杀死BOSS
  30.                 break

  31.         if boss_skill[i] == '斩杀':  # 斩杀必躲闪(前边的两步杀BOSS判断使得这里的判断变得无脑)
  32.             player_skill.append('躲闪')
  33.             boss_health += 3
  34.             #print('躲闪后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d' % (player_health, boss_health, health_times))
  35.         else:
  36.             player_health -= player_hurt
  37.             if player_health <= 15 or (boss_skill[i + 1] == '斩杀' and health_times == 0 and player_health <= 60):    #重要:治疗条件非常关键,帖子已进行分析
  38.                 player_skill.append('治疗')
  39.                 player_health += 30
  40.                 boss_health += 3
  41.                 health_times = 2
  42.                 #print('治疗后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d' % (player_health, boss_health, health_times))
  43.             else:
  44.                 player_skill.append('搏命一击')
  45.                 player_health -= 10
  46.                 boss_health -= 17
  47.                 #print('搏命一击后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d' % (player_health, boss_health, health_times))
  48.     else:
  49.         player_skill.append('攻击')

  50.     return player_skill

  51. if __name__ == "__main__":
  52.     boss_skill_1 = ['致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击']
  53.     player_skill_1 = gen_skill(boss_skill_1)
  54.     print(player_skill_1)
复制代码

点评

我很赞同!: 1.0
我很赞同!: 1
注意,当player和boss同时血量<=0时,也判定player失败。 另外,可以用首页的测试程序进行调试。  发表于 2017-8-22 22:13

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励,可是测试没通过,我把测试程序放.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 23:29:45 | 显示全部楼层
LZ我楼上的代码已经修改了,是BOSS普通伤害应该是15,我写成10了,只是根据你的测试代码,目前还至少有发现两个问题:
1、BOSS的回血判定是发生在回合最开始
2、玩家的加血操作先于BOSS的攻击操作
而你之前回复我的信息是不分先后,统一结算,这两点造成我们的统计结果产生差异
1、我初始搏杀考虑BOSS回血,BOSS会是83的血量,而你的是80
2、我补血的时候由于已经考虑到BOSS的攻击,即75-25+30=80
      而你的操作是在最开始,即min(75+30,100)-25=75
这和你之前回复我的信息不太一样,如果按照你的代码,而不是你的回复的话,我只好重新思考自己的策略了。。。。

点评

我很赞同!: 5.0
我很赞同!: 5
你讲得是对的,可能是我表述得不够清楚,所以我把判定程序放上来了,这样可以避免很多表述的问题。 哎呀,从小语文没学好......  发表于 2017-8-22 23:49
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 23:42:52 | 显示全部楼层
本帖最后由 gunjang 于 2017-8-22 23:43 编辑
  1. def gen_skill(boss_skill):
  2.         bossDamage = {'普通攻击':15,'致命一击':25,'斩杀':45}
  3.         player_skill = []
  4.         buff = 0
  5.         bosshp = 100
  6.         playerhp = 100

  7.         index = 0
  8.         while index < len(boss_skill):
  9.                 bs = boss_skill[index]
  10.                 #buff & heal
  11.                 buff -= 1
  12.                 if buff > 0: playerhp += 10
  13.                 bosshp += 3
  14.                
  15.                 if (bosshp < 20) and (playerhp - bossDamage[bs]-10) > 0: #最后一击
  16.                         player_skill.append('搏命一击')
  17.                         playerhp -= 10+bossDamage[bs]
  18.                         bosshp -= 20                       
  19.                         break               

  20.                 if playerhp + 30 - bossDamage[bs] <= 0: #have no time to heal
  21.                         player_skill.append('躲闪')
  22.                 elif (playerhp < 25) or (playerhp - bossDamage[bs] <= 10): #low HP or may die
  23.                         #heal
  24.                         player_skill.append('治疗')
  25.                         buff = 3
  26.                         playerhp += 30-bossDamage[bs]
  27.                         #有可能会死,比如连续的斩杀,第一次失血15(45-30),以后每次5(45-30-10)
  28.                         if (bs=='斩杀') and (index != len(boss_skill)-1) and (boss_skill[index+1]=='斩杀'):
  29.                                 #next round
  30.                                 #来不及回血,采用躲闪       
  31.                                 player_skill.append('躲闪')
  32.                                 bosshp += 3
  33.                                 if bosshp > 100: bosshp = 100
  34.                                 playerhp += 10
  35.                                 buff -= 1
  36.                                 index += 1
  37.                 else:
  38.                         #搏命一击
  39.                         player_skill.append('搏命一击')
  40.                         playerhp -= 10+bossDamage[bs]
  41.                         bosshp -= 20
  42.                                        
  43.                 index += 1
  44.                 if playerhp > 100: playerhp = 100
  45.                 if bosshp > 100: bosshp = 100
  46.                 #print(bosshp, playerhp)
  47.         #print(bosshp, playerhp)
  48.         return player_skill
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
实测结果: boss_skill_1: round 10, boss_skill_2: round 11, boss_skill_3: round 20, boss_skill_4: round 13, boss_skill_5: round 21  发表于 2017-8-23 00:29

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 23:57:19 | 显示全部楼层
好吧,根据LZ测试代码的要求又改了一版,步数增加了不少。。。放上再说了╮(╯▽╰)╭
反正代码都跑赢了,更好的法子回头再想想去

  1. def gen_skill(boss_skill):
  2.     player_skill = []   #玩家技能列表
  3.     boss_health = 97  # BOSS血量
  4.     player_health = 100  # 玩家血量

  5.     boss_dict = {'普通攻击': 15, '致命一击': 25, '斩杀': 45}
  6.     total_len = len(boss_skill)     #BOSS总技能长度

  7.     health_times = 0

  8.     for i in range(total_len - 1):          #循环总技能
  9.         if health_times > 0:                #提前判定是否具有恢复BUFF
  10.             player_health += 10             #有BUFF,血量+10.buff回合-1
  11.             health_times -= 1

  12.         player_hurt = boss_dict[boss_skill[i]]      #判定BOSS伤害
  13.         player_hurt2 = player_hurt + boss_dict[boss_skill[i+1]] - 10 * health_times   #判定BOSS两回合伤害
  14.         if boss_health <= 34 and player_health > player_hurt:  # 存在两步杀死BOSS之可能
  15.             if boss_health <= 7:
  16.                 player_skill.append('攻击')  # 杀死BOSS
  17.                 break
  18.             elif boss_health <= 24 and player_health > (player_hurt + 10):
  19.                 if boss_health <= 17:
  20.                     player_skill.append('搏命一击')  # 搏命一击杀死BOSS
  21.                     break
  22.                 else:
  23.                     if player_health > (player_hurt2 + 10):
  24.                         player_skill.append('搏命一击')
  25.                         player_skill.append('攻击')  # 2连击杀死BOSS
  26.                         break
  27.             elif player_health > (player_hurt2 + 20):
  28.                 player_skill.append('搏命一击')
  29.                 player_skill.append('搏命一击')  # 2搏命击杀死BOSS
  30.                 break

  31.         if boss_skill[i] == '斩杀':  # 斩杀必躲闪(前边的两步杀BOSS判断使得这里的判断变得无脑)
  32.             player_skill.append('躲闪')
  33.             boss_health += 3
  34.             print('躲闪后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d' % (player_health, boss_health, health_times))
  35.         else:

  36.             if (player_health - player_hurt) <= 10 or (boss_skill[i + 1] == '斩杀' and health_times == 0 and player_health <= 70):    #重要:治疗条件非常关键,帖子已进行分析
  37.                 player_skill.append('治疗')
  38.                 player_health += 30
  39.                 boss_health += 3
  40.                 health_times = 2
  41.                 print('治疗后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d' % (player_health - player_hurt, boss_health, health_times))
  42.             else:
  43.                 player_skill.append('搏命一击')
  44.                 player_health -= 10
  45.                 boss_health -= 17
  46.                 print('搏命一击后,玩家的血量是 %d,boss血量是 %d,可恢复次数是 %d ' % (player_health - player_hurt, boss_health, health_times))

  47.             player_health -= player_hurt
  48.     else:
  49.         player_skill.append('攻击')

  50.     return player_skill

  51. if __name__ == "__main__":
  52.     boss_skill_1 = ['普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击',
  53.                     '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击',
  54.                     '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击', '普通攻击']
  55.     boss_skill_2 = ['普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击',
  56.                     '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击',
  57.                     '普通攻击', '普通攻击', '致命一击', '普通攻击', '普通攻击', '致命一击']
  58.     boss_skill_3 = ['普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击',
  59.                     '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击',
  60.                     '斩杀', '普通攻击', '致命一击', '斩杀']
  61.     boss_skill_4 = ['普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击',
  62.                     '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击', '致命一击', '普通攻击', '斩杀', '致命一击', '普通攻击',
  63.                     '致命一击', '普通攻击', '斩杀', '致命一击']
  64.     boss_skill_5 = ['致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击',
  65.                     '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀',
  66.                     '普通攻击', '致命一击', '斩杀', '普通攻击']
  67.     player_skill_1 = gen_skill(boss_skill_1)
  68.     player_skill_2 = gen_skill(boss_skill_2)
  69.     player_skill_3 = gen_skill(boss_skill_3)
  70.     player_skill_4 = gen_skill(boss_skill_4)
  71.     player_skill_5 = gen_skill(boss_skill_5)
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
实测结果: boss_skill_1: round 9, boss_skill_2: round 10, boss_skill_3: round 19, boss_skill_4: round 13, boss_skill_5: round 20  发表于 2017-8-23 00:26
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 19:50:46 | 显示全部楼层
我把代码放在哪里哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 09:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表