石头剪刀布这个小游戏我们在学习Scratch的时候已经写过了,这次我们用Python来实现它,并复习前面学习的Python知识。
程序分析
石头剪刀布游戏的规则很简单,其实就是两个变量的比较和判断问题,其中一个变量从计算机从“石头”、“剪刀”、”布“中随机挑选的,另一个是玩家挑选的,因此我们可以想到,把”石头“、”剪刀“、”布“放到一个列表中,计算机可以使用前面我们学习的random库提供的choice方法从中随机选一个,再提示玩家输入石头、剪刀、布中的一个,那如果玩家输入的不是这三个选项当中的一个呢?就提示重新输入,然后对两个变量进行判断就可以了。
第一个版本的程序
我们按照刚才分析的逻辑把程序写出来:
import random
# 出拳
punches = ['石头','剪刀','布']
computer_choice = random.choice(punches)
user_choice = ''
user_choice = input('请出拳:(石头、剪刀、布)') # 请用户输入选择
while user_choice not in punches: # 当用户输入错误,提示错误,重新输入
print('输入有误,请重新出拳')
user_choice = input()
# 亮拳
print('————战斗过程————')
print('电脑出了:%s' % computer_choice)
print('你出了:%s' % user_choice)
# 胜负
print('—————结果—————')
if user_choice == computer_choice: # 使用if进行条件判断
print('平局!')
elif (user_choice == '石头' and computer_choice == '剪刀') or (user_choice == '剪刀' and computer_choice == '布') or (user_choice == '布' and computer_choice == '石头'):
print('你赢了!')
else:
print('你输了!')
简化的方法
在上面的程序中,最后的判断特别长,即(user_choice == '石头' and computer_choice == '剪刀') or (user_choice == '剪刀' and computer_choice == '布') or (user_choice == '布' and computer_choice == '石头')
这个条件。我们能否想办法把它简化一下呢?
请仔细观察 ['石头','剪刀','布']
这个列表,你会发现前一个正好克制后一个。也就是如果我的选择在列表中的索引比计算机小一,我就会胜利。比如我计算机出剪刀,剪刀在列表中的索引是1,我出石头,在列表中索引是0,正好克制剪刀。你可能会说不对啊,石头的索引是0,布的索引是2,虽然布克制石头,但石头的前一项不等于是布的索引2呀。是的,但你可能忘记了,列表是可以倒序索引的。石头的索引是0,用0-1得到-1,正好是布的索引!是不是很奇妙!
所以,我们在判断的时候,只要把计算机选择项的索引减一,以此为索引找出列表项,如果正好等于玩家的选择,那就是玩家胜利了。
代码如下:
import random
# 出拳
punches = ['石头','剪刀','布']
computer_choice = random.choice(punches)
user_choice = ''
user_choice = input('请出拳:(石头、剪刀、布)') # 请用户输入选择
while user_choice not in punches: # 当用户输入错误,提示错误,重新输入
print('输入有误,请重新出拳')
user_choice = input()
# 亮拳
print('————战斗过程————')
print('电脑出了:%s' % computer_choice)
print('你出了:%s' % user_choice)
# 胜负
print('—————结果—————')
if user_choice == computer_choice: # 使用if进行条件判断
print('平局!')
# 电脑的选择有3种,索引位置分别是:0石头、1剪刀、2布。
# 假设在电脑索引位置上减1,对应:-1布,0石头,1剪刀,皆胜。
elif user_choice == punches[punches.index(computer_choice)-1]:
print('你赢了!')
else:
print('你输了!')
总结
通过这个小游戏的制作,你复习了分支和循环的使用、random库的使用以及如何巧妙地利用列表索引来判断胜负。在Python中还存在许多像这样的小技巧,你可以在以后的学习中留心记忆,有时候会起到事半功倍的效果。