本文最后更新于 590 天前,其中的信息可能已经有所发展或是发生改变。
前言
这一开始仅为一个简单题目,使用 random.choice
实现石头剪刀布的出招,无需判断,就像下面这样:
from random import choice
gList = ['石头','剪刀','布']
for _ in range(10):
print(choice(gList),choice(gList))
强行判断
留着如此一题,不加以完善十足可以,那为何不对出拳结果加以判断呢?
这看起来很容易,做起来也很容易,只需要像下面这样:
from random import choice
gList = ['石头','剪刀','布']
c = 100
w_a = 0
w_b = 0
def win(a,b):
if a == b:
return 0
elif a == '石头':
if b == '剪刀':
return 1
elif b == '布':
return 2
else:
return
elif a == '剪刀':
if b == '石头':
return 2
elif b == '布':
return 1
else:
return
elif a == '布':
if b == '石头':
return 1
elif b == '剪刀':
return 2
else:
return
else:
return
for _ in range(c):
a = choice(gList)
b = choice(gList)
print(f'A:{a} B:{b}',end=' ')
w = win(a,b)
if w == 1:
print('A胜')
w_a += 1
elif w == 2:
print('B胜')
w_b += 1
else:
print('平局')
print(f'共{c}局')
print(f'A胜{w_a}局, 胜率{"%0.5f"%(w_a/c)}')
print(f'B胜{w_b}局, 胜率{"%0.5f"%(w_b/c)}')
如此一来,谁胜谁负,一目了然。
但这,是否显得太过冗长?
巧妙判断
先来做一些假定:
$ 石头 = 1 $
$ 剪刀 = 2 $
$ 布 = 3 $
作出上述假定之后,让我们对出招及胜负情况进行分析:
A | B | A-B | 胜负 |
石头 | 石头 | 0 | 平 |
石头 | 剪刀 | -1 | A |
石头 | 布 | -2 | B |
剪刀 | 石头 | 1 | B |
剪刀 | 剪刀 | 0 | 平 |
剪刀 | 布 | -1 | A |
布 | 石头 | 2 | A |
布 | 剪刀 | 1 | B |
布 | 布 | 0 | 平 |
由上分析可知:
- 若A赢,则 A-B 为 -1 或 2
- 若B赢,则 A-B 为 1 或 -2
- 若平局,则 A-B 为 0
那么,上述判断过程即可简化:
from random import choice
gList = ['石头','剪刀','布']
wList ={'石头':1,'剪刀':2,'布':3}
for _ in range(10):
a,b = choice(gList),choice(gList)
w = wlist[a] - wList[b]
print(f'A:{a} B:{b}',end=' ')
if w == 0:
print('平')
elif w == -1 or w == 2:
print('A胜')
elif w == 1 or w == -2:
print('B胜')
显然,这种判断方式与强制判断相比更高效、更简洁。