Python掷硬币函数异常:如何实现进攻方为Player时防守方自动设为Cpu
解决攻防方重复的问题
你的核心问题是两次独立调用了flip_coin()函数——每次调用都会重新执行硬币翻转逻辑,相当于抛了两次硬币,所以防守方的结果完全是随机的,自然可能和进攻方撞车。而且你函数里的Player和Cpu变量是局部变量,修改后不会影响全局的同名变量,所以靠它们判断也没用。
我给你两种修改方案,都能保证攻防方必然对立:
方案一:先获取进攻方,再推导防守方
只调用一次硬币翻转函数得到进攻方,然后直接根据进攻方的值确定防守方,这样就完全避免了重复随机的问题:
import random user = input("Please enter [H]eads or [T]ails: ") def flip_coin(user): # Flips coin to determine who has the ball first. COIN = ["H", "T"] coin = random.choice(COIN) print("Coin is on: " + str(coin)) return "Player" if coin == user else "Cpu" # 只调用一次翻转函数,得到进攻方 offence = flip_coin(user) # 根据进攻方直接推导防守方 defence = "Cpu" if offence == "Player" else "Player" print("Current Offence: " + offence) print("Current Defence: " + defence)
关键修改点:
- 移除了函数里的
Player和Cpu参数(因为没用,函数返回结果就足够了) - 只调用一次
flip_coin(),把结果存到offence变量中 - 用三元表达式直接推导
defence的值,确保攻防必然是对立的两个角色
方案二:让函数同时返回攻防双方
如果希望函数一次性给出结果,也可以让flip_coin直接返回进攻方和防守方的元组:
import random user = input("Please enter [H]eads or [T]ails: ") def flip_coin(user): COIN = ["H", "T"] coin = random.choice(COIN) print("Coin is on: " + str(coin)) if coin == user: return ("Player", "Cpu") else: return ("Cpu", "Player") # 一次性获取攻防双方 offence, defence = flip_coin(user) print("Current Offence: " + offence) print("Current Defence: " + defence)
这个方案更简洁,函数直接返回一组对应的攻防角色,调用一次就能拿到所有需要的信息。
测试一下,不管硬币结果是H还是T,输出的攻防方都会是Player和Cpu的组合,不会再出现两者相同的情况啦。
内容的提问来源于stack exchange,提问作者Caleb Murnan
相关产品推荐
相关产品推荐

