我想做一个石头剪刀布的人机对战,就是按照每局电脑出电脑和玩家上次没出的拳的规则,但是一直在第二局会出现
Traceback (most recent call last):
File "D:\***-智能棋手练习1&2作业(石头剪刀布).py", line 18, in <module>
a.remove(computer)
ValueError: list.remove(x): x not in list
的报错结果,这是源代码:
import random
frequency=0
a=["石头","剪刀","布"]
while True:
a=["石头","剪刀","布"]
if frequency<2 or len(a)!=1:
computer = random.randint(0, 2) #定义范围
computer = a[computer]
else:
if len(a)==1:
computer=a[0]
#提醒用户按指示输入
person=input("请输入石头,剪刀,布,退出按回车:")
#判断输入,当输入为空时退出
if person =="":
exit(0)
a.remove(person)
a.remove(computer)
frequency+=1
print("玩家出"+person+",电脑出"+computer,end=",")
#枚举玩家胜时的情况
if ((person == "石头") and (computer == "剪刀")) or ((person == "剪刀") and (computer == "布")) or (
(person == "布") and (computer == "石头")):
print("玩家胜")
elif person == computer:
print("平局")
else:
print("电脑胜")
求指点
1.首先你的逻辑设计就有问题:按照你的代码玩家和电脑的出拳应该是用两个变量保存,而你用了同一个
因为你是先获取了电脑的出拳,然后再用户输入,如果用户输入的和电脑是一样的在第二次去remove的时候就会报错
2.逻辑设计建议:
可选内容用一个集合保存永远不变,用另一个集合记住上次玩家出拳和电脑出拳,然后在两个集合的差集中取一个作为电脑的出拳
注意:a.在取差集后清除保存上次出拳的集合,然后添加电脑和玩家
b.将集合转列表再取随机值
c.差集只有一个时不用随机
3.建议不同的变量用不同的名字去保存,变量混用很容易导致问题
第17行,18行的意义在哪,第17行把人出的拳从列表里面删除了,如果这个时候人和电脑出的拳是一样的话,那么你已经删除了一个了,当然没办法再删除一次了,你先搞清楚17,18行是干啥的,放在这到底有用没有,我觉得删了就行。