鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: jerryxjr1220

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

[复制链接]
发表于 2017-8-23 19:54:46 | 显示全部楼层
本帖最后由 yanchen1 于 2017-8-23 20:06 编辑

def gen_skill(boss_skill):
    time=0
    player_skill=[]
    boss=100
    player=100
    cure=0
    while player>0 and len(boss_skill)!=time:
        if cure>0:
            player+=10
        if boss_skill[time]=='斩杀':
            if player>45 and boss<10:
                boss-=10
                player_skill.append('攻击')
                print('攻击')
                if boss <=0:
                    break;
            elif player>55 and boss<20:
                player-=10
                boss-=20
                player_skill.append('搏命一击')
                print('搏命一击')
                if boss <=0:
                    break;     
            else:
                player_skill.append('躲闪')
                print('躲闪')
        else:
            if boss_skill[time]=='普通攻击':
                player-=15
            if boss_skill[time]=='致命一击':
                player-=25
            if player>35 :
                player-=10
                boss-=20
                player_skill.append('搏命一击')
                print('搏命一击')
                if boss <=0:
                    break;
            elif player>10 and boss<20:
                player-=10
                boss-=20
                player_skill.append('搏命一击')
                print('搏命一击')
                if boss <=0:
                    break;
            elif boss<10 :
                boss-=10
                player_skill.append('攻击')
                print('攻击')
                if boss <=0:
                    break;
            elif player<=25 and cure==0:
                player+=30
                cure=3
                player_skill.append('治疗')
                print('治疗')
            else :
                boss-=10
                player_skill.append('攻击')
                print('攻击')
                if boss <=0:
                    break;
        if cure>0:
            cure-=1
        boss+=3
        if boss>100:
            boss=100
        time+=1
        print(player)
        print(boss)
    if boss>0:
        print('lose')
    print(time)
    return player_skill
boss_skill =   ['致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击', '致命一击', '普通攻击', '致命一击', '斩杀', '致命一击', '斩杀', '普通攻击', '致命一击', '斩杀', '普通攻击']
player_skill=gen_skill(boss_skill)
print(player_skill)
#写的比较水,很多没想到的,希望大家能多提提意见,而且我最后一个示例30步没做出来

点评

#boss_skill_1: round 12, boss_skill_2: round 14, boss_skill_3: round 19, boss_skill_4: lose, boss_skill_5: draw  发表于 2017-8-23 22:14

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-24 10:43:43 | 显示全部楼层
本帖最后由 gunjang 于 2017-8-24 10:45 编辑

采用暴力法,采用广度优先
剪枝很简单,取BossHP相同时,playerHP最高的那个(考虑Buff)
这样每次结果的待选最高只有100种,可以接受
得到的结果肯定是最优解。。。
五种答案分别回合数是9 10 20 13 20,其中1 2 5比贪心法都少了一个回合
  1. def gen_skill(boss_skill):
  2.         bossDamage = {'普通攻击':15,'致命一击':25,'斩杀':45}
  3.         #A D E H
  4.         psDict ={'A':'攻击','D':'搏命一击','E':'躲闪','H':'治疗'}
  5.         currstate = [0 for x in range(101)] # index is BossHP
  6.         currstate[100] = ['',100, 0] # playskill HP Buff
  7.        
  8.         for bs in boss_skill:
  9.                 damage = bossDamage[bs]
  10.                 nextstate = [0 for x in range(101)] # index is BossHP
  11.                 for index in range(1, 101):
  12.                         if currstate[index] == 0:
  13.                                 continue

  14.                         curr = currstate[index]
  15.                         for pk in 'ADEH':
  16.                                 pHP = curr[1]
  17.                                 buff = curr[2]-1
  18.                                 if buff > 0: pHP += 10
  19.                                 pHP -= damage
  20.                                 bHP = index+3
  21.                                 if pk == 'A':
  22.                                         bHP -= 10
  23.                                 elif pk == 'D':
  24.                                         bHP -= 20
  25.                                         pHP -= 10
  26.                                 elif pk == 'H':
  27.                                         pHP += 30
  28.                                         buff = 3
  29.                                 if pHP > 100: pHP = 100
  30.                                 if bHP > 100: bHP = 100
  31.                                 #else: pass # ignore
  32.                                 if pHP <= 0:
  33.                                         continue
  34.                                 ps = curr[0]+pk
  35.                                 if bHP <= 0:
  36.                                         return [psDict[x] for x in ps] #, '{0} round'.format(len(ps)), bHP, pHP
  37.                                
  38.                                 if (nextstate[bHP] == 0) or (nextstate[bHP][1] < pHP):
  39.                                         nextstate[bHP] = [ps, pHP, buff]
  40.                                 elif (nextstate[bHP][1]==pHP) and (buff>1) and (buff > curr[2]):
  41.                                         nextstate[bHP] = [ps, pHP, buff]
  42.                 currstate = nextstate                               


  43.         return []
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-24 10:52:04 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-8-24 10:53 编辑
gunjang 发表于 2017-8-24 10:43
采用暴力法,采用广度优先
剪枝很简单,取BossHP相同时,playerHP最高的那个(考虑Buff)
这样每次结果的 ...


Boss Skill 3 最少可以19回合结束

贪心算法可以给出的最小回合数是9,10,19,13,20
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-24 10:55:59 | 显示全部楼层
jerryxjr1220 发表于 2017-8-24 10:52
Boss Skill 3 最少可以19回合结束

贪心算法可以给出的最小回合数是9,10,19,13,20

好吧,可能有小bug没发现。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-24 22:08:57 | 显示全部楼层
本帖最后由 达不六 于 2017-8-25 10:19 编辑
  1. # -*- coding: utf-8 -*-
  2. import time
  3. star = time.clock()

  4. def gen_skill(boss_skill):
  5.    
  6.     skill = {"普通攻击":15, "致命一击":25, "斩杀":45, "攻击":10, "搏命一击":20}
  7.     nm_pg = boss_skill.count('普通攻击')
  8.     nm_zm = boss_skill.count('致命一击')
  9.     nm_zs = boss_skill.count('斩杀')
  10.     hurt = (nm_pg*15+nm_zm*25+nm_zs*45)/30    # 技能列表中每个回合的平均伤害
  11.     if 15 <= hurt <25 :                       # 对技能列表的难度分为两级
  12.         e = 4
  13.     elif 25 <= hurt <35:
  14.         e = 3      
  15.     hp_boss = 100
  16.     hp_player = 100
  17.     buff = []
  18.     player = []

  19.     for r in range(len(boss_skill)):  
  20.         b = boss_skill[r]
  21.         if buff:
  22.             hp_player = min(hp_player+buff.pop(0),100)
  23.         hp_boss = min(hp_boss+3,100)  
  24.         if r == 0:                          # 第一回合
  25.             if b=='普通攻击' or '致命一击':    # 如果boss的技能不是斩杀
  26.                 player.append('搏命一击')
  27.                 hp_player -= skill[b]+10
  28.                 hp_boss -= 20
  29.                 print 'boss:',b
  30.                 print '玩家:','搏命击'
  31.             else:                             # 如果boss 的技能是斩杀
  32.                 player.append('治疗')
  33.                 hp_player = min(hp_player+30,100)
  34.                 buff = [10,10]
  35.                 hp_player -= 45
  36.                 print 'boss:',b
  37.                 print '玩家:','治疗一次'
  38.         else:                                # 第二回合以上
  39.             if b=='斩杀':
  40.                 player.append('躲闪')
  41.                 print 'boss:',b
  42.                 print '玩家:','躲闪一次'
  43.             elif r % e == 0 and player[r-1] != '治疗':   #每隔 e 回合治疗一次,如果上回合使用了治疗,则这个回合不用治疗                              
  44.                 player.append('治疗')
  45.                 hp_player = min(hp_player+30,100)
  46.                 buff = [10,10]
  47.                 hp_player -= skill[b]
  48.                 print 'boss:',b
  49.                 print '玩家:','治疗一次'
  50.             elif hp_player <=30 and player[r-1]!='治疗':   # 当血量小于30 时且上回合没有使用治疗时,治疗
  51.                 player.append('治疗')
  52.                 hp_player = min(hp_player+30,100)
  53.                 buff = [10,10]
  54.                 hp_player -= skill[b]
  55.                 print 'boss:',b
  56.                 print '玩家:','治疗一次'
  57.             else:                                    # 否则  玩家  使用 搏命一击
  58.                 player.append('搏命一击')
  59.                 hp_player -= skill[b]+10
  60.                 hp_boss -= 20
  61.                 print 'boss:',b
  62.                 print '玩家:','搏命一击'
  63.    
  64.         print('Round %d: Boss HP: %d, Player HP: %d' % \
  65.                 (r+1, hp_boss, hp_player))
  66.    
  67.         if hp_player <= 0:
  68.             return 'Player Lose! Round: %d' % (r+1),player
  69.         if hp_boss <= 0:
  70.             return 'Player Win! Round: %d' % (r+1),player
复制代码

[b][b][b]

五个boss技能列表,击杀boss所用回合分别为10,11,20,13,20
[/b][/b][/b]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-15 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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