鱼C论坛

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

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

[复制链接]
发表于 2017-8-23 19:50:46 | 显示全部楼层
我把代码放在哪里哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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比贪心法都少了一个回合
def gen_skill(boss_skill):
        bossDamage = {'普通攻击':15,'致命一击':25,'斩杀':45}
        #A D E H
        psDict ={'A':'攻击','D':'搏命一击','E':'躲闪','H':'治疗'}
        currstate = [0 for x in range(101)] # index is BossHP
        currstate[100] = ['',100, 0] # playskill HP Buff 
        
        for bs in boss_skill:
                damage = bossDamage[bs]
                nextstate = [0 for x in range(101)] # index is BossHP
                for index in range(1, 101):
                        if currstate[index] == 0:
                                continue

                        curr = currstate[index]
                        for pk in 'ADEH':
                                pHP = curr[1]
                                buff = curr[2]-1
                                if buff > 0: pHP += 10
                                pHP -= damage
                                bHP = index+3
                                if pk == 'A':
                                        bHP -= 10
                                elif pk == 'D':
                                        bHP -= 20
                                        pHP -= 10
                                elif pk == 'H':
                                        pHP += 30
                                        buff = 3
                                if pHP > 100: pHP = 100
                                if bHP > 100: bHP = 100
                                #else: pass # ignore
                                if pHP <= 0:
                                        continue
                                ps = curr[0]+pk
                                if bHP <= 0:
                                        return [psDict[x] for x in ps] #, '{0} round'.format(len(ps)), bHP, pHP
                                
                                if (nextstate[bHP] == 0) or (nextstate[bHP][1] < pHP):
                                        nextstate[bHP] = [ps, pHP, buff]
                                elif (nextstate[bHP][1]==pHP) and (buff>1) and (buff > curr[2]):
                                        nextstate[bHP] = [ps, pHP, buff]
                currstate = nextstate                                


        return []
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

好吧,可能有小bug没发现。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

    for r in range(len(boss_skill)):  
        b = boss_skill[r]
        if buff:
            hp_player = min(hp_player+buff.pop(0),100)
        hp_boss = min(hp_boss+3,100)  
        if r == 0:                          # 第一回合
            if b=='普通攻击' or '致命一击':    # 如果boss的技能不是斩杀
                player.append('搏命一击')
                hp_player -= skill[b]+10
                hp_boss -= 20
                print 'boss:',b
                print '玩家:','搏命击'
            else:                             # 如果boss 的技能是斩杀
                player.append('治疗')
                hp_player = min(hp_player+30,100)
                buff = [10,10]
                hp_player -= 45
                print 'boss:',b
                print '玩家:','治疗一次'
        else:                                # 第二回合以上
            if b=='斩杀': 
                player.append('躲闪')
                print 'boss:',b
                print '玩家:','躲闪一次'
            elif r % e == 0 and player[r-1] != '治疗':   #每隔 e 回合治疗一次,如果上回合使用了治疗,则这个回合不用治疗                               
                player.append('治疗')
                hp_player = min(hp_player+30,100)
                buff = [10,10]
                hp_player -= skill[b]
                print 'boss:',b
                print '玩家:','治疗一次'
            elif hp_player <=30 and player[r-1]!='治疗':   # 当血量小于30 时且上回合没有使用治疗时,治疗
                player.append('治疗')
                hp_player = min(hp_player+30,100)
                buff = [10,10]
                hp_player -= skill[b]
                print 'boss:',b
                print '玩家:','治疗一次'
            else:                                    # 否则  玩家  使用 搏命一击
                player.append('搏命一击')
                hp_player -= skill[b]+10
                hp_boss -= 20
                print 'boss:',b
                print '玩家:','搏命一击'
    
        print('Round %d: Boss HP: %d, Player HP: %d' % \
                (r+1, hp_boss, hp_player))
    
        if hp_player <= 0:
            return 'Player Lose! Round: %d' % (r+1),player
        if hp_boss <= 0:
            return 'Player Win! Round: %d' % (r+1),player
[b][b][b]

五个boss技能列表,击杀boss所用回合分别为10,11,20,13,20
[/b][/b][/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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