交作业,同时想请教,如何能精简这部分代码

来源:8-13 划算还是不划算

不知不止不知

2019-02-20

下面是我写的代码
感觉有些地方逻辑好像还是有问题,但是自己不太能想出来了
而且觉得写的有点啰嗦,想请教下怎么能写的更精简。
大体逻辑就是
算出来 需要合成6级石头,的最小消耗,
额外消耗其实就,4级石头失败之后的损失
所以失败次数决定了 是否值得买
1. 先求得 4级石头,失败多少次,价格就会高于市场
2. 求得合成多少次4级石头,会失败一次
3. 经过计算的出结论
4. 同时也可以通过,调整成功率来求得划算与否,看成功率是什么值,会比较划算
给予这个逻辑写出了一下代码

'''
    定义一些通用变量
'''
gold = 1                #定义一个gold变量为1的系数
diamond = 0.05*gold     #定义一个diamond变量为0.05金的系数
vit = 1*gold            #定义一个vit体力变量系数为2金
l6_mark = 750           #定义一个6级石头市场购买的金额
rate_value = 0.4848     #定义一个成功率
'''
    1级石头定义
'''
l1_gold = gold*0.75                     #1颗1级石头消耗0.75金
l1_diamond = diamond*8                  #1颗1级石头还要消耗8颗钻石
l1_stone = l1_gold + l1_diamond         #1颗1级石头的金成本
'''
    3级石头定义
'''
l3_value = 12*l1_stone                          #l1到l3需要消耗12颗l1石头
l3_value_gold = 0.39*gold                       #l1到l3需要消耗0.39金
l3_vit = 10*vit                                 #l3石头需要消耗10体力
l3_stone =  l3_value + l3_value_gold + l3_vit   #1颗3级石头的金成本
'''
    4级石头定义
'''
l4_value = l1_stone*16          #1颗3级石头变成1颗4级石头,需要消耗16个1级石头
l4_value_gold = 0.897*gold      #1颗3级石头变成1颗4级石头,需要消耗0.897金
l4_vit = 10*vit                 #1颗3级石头变成1颗4级石头,需要消耗10vit
l4_rate = rate_value            #1颗3级石头变成1颗4级石头,成功率为48.78%并不是100%
                                #如果失败则金和16颗1级石头也将被扣除,但是不消耗体力
l4_stone_succes = l3_stone + l4_value + l4_value_gold + l4_vit
l4_stone_failed = l4_value_gold + l4_value
'''
    6级石头定义
'''
l6_value = 12*l4_stone_succes           #1颗1级石头变成6级石头,概率100%,则需要12颗4级石头
l6_gold = 19.75*gold                    #1颗1级石头变成6级石头消耗19.75金
l6_vit = 10*vit                         #消耗10体力
l6_stone = l6_value + l6_gold + l6_vit  #4级五行石每一次合成,都成功消耗的总金
'''
    定义4级五行石,失败多少次就大于市场价格的函数
'''
def times():                                     #定义一个times的函数
    global ts                                    #设置全局变量ts(方便后续比较用,ts=times的缩写)
    for ts in range(0,10):                       #循环11次,这里月可以设置一个参数来控制循环次数
        value = l6_stone + l4_stone_failed*ts    #value 计算的是 4级五行石合成失败n次后,6级五行石的消耗金额
        if value<l6_mark:
            pass
        else:
            return ts                            #times函数返回ts的值 这里ts的值是次之后 会不划算
            break

times() #执行times函数
'''
    定义一个 合成多少次 4级五行石 就会失败一次的函数
'''
def failed():                       #定义一个filed的函数
    global fd                       #设置一个全局变量fd(方便后续比较实用,fd=failed的缩写)
    for fd in range(1,10):          #循环30次,来判断多少次之后,成功率会很低 , 也可以设置一个参数来代替10
        percent = pow(l4_rate,fd)   #设置一个percent的变量,用循环次数做幂次,用4级石头成功率做底,求得多次之后的称功率
        if percent > 0.4:           #成功率大于 50%的时候 这个0.4可以设置为一个参数
            pass
        else:
            return fd               #返回一个fd的值,这个值,代表合成第n次时失败
            break                   #终止循环

failed() #执行failed函数
print('当合成4级合成石概率为' + str(l4_rate) + '计算时')  #展示合成4级五行石的成功率
print('每合成第' +str(fd) + '次,4级石,则失败一次')        #检测fd值
'''
    计算 根据上面的 failed函数求得 4级五行石 必须合成次数,所得到最终的6级五行石的金额
'''
l6_need_l4 = int(l6_stone/l4_stone_succes)               #6级五行石 最少需要消耗 多少颗 4级五行石
l4_merge_loop = int(l6_need_l4 / (fd-1))                 #4级五行石重复合成 的 次数
final_gold = l4_stone_failed*l4_merge_loop + l6_stone    #最终消耗金额

print('结论:')

if final_gold < l6_mark:  #比较最终消耗 和 市场购买
    print('比商店购买划算')
else:
    print('没有商店购买划算')

多谢指导

写回答

1回答

7七月

2019-02-20

我觉得这个题其实很简单,值得讨论的就是3级到4级的时候有失败的概率,那么你需要计算一个期望值,作为最终值,然后和市场购买的价格做比较。就这么简单。

2
1
不知不止不知
之前求了个 失败的平均值,算完差不多1000左右, 后来又考虑这样感觉不好,就像求,失败超过多少次次就会不值,5次需要768金所以直接就判断这个了, 感谢老师指点,多谢多谢
2019-02-20
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程