1、游戏场景设定
石头、剪子、布是我们经常玩的一个小游戏,在一些事情的决定上,为了解决争议,也会使用石头、剪子、布决出胜负。
游戏的具体规则是:石头赢剪子、布赢石头、剪子赢布。
游戏的玩家有两个,玩家在同一时间喊出石头、剪子、布的任何一个词语,按照游戏规则胜出的赢。
在本案例中,玩家分别是用户和程序,用户输入石头、剪子、布的任何一个游戏词语,程序随机产生一个1至3范围内的数字,数字1表示石头、数字2表示剪子、数字3表示布。
程序判断用户是否胜出:若用户胜出,程序输出“很棒,你赢了”,程序结束;若平局,程序输出“平局,再来一次”,用户可再次输入石头、剪子、布的任何一个游戏词语;若用户输了,程序输出“你输了,再来一次”,用户可再次输入石头、剪子、布的任何一个游戏词语。
2、编程思路
从案例程序需求来看,程序要处理用户和程序之间的博弈。用户可以随意输入石头、剪子、布的任何一个游戏词语,程序将游戏词语转换为介于1至3范围内对应的数字,同时程序也会创建一个介于1至3范围内的随机数,程序按照游戏规则对比两个数字,就可以判断出用户和程序谁胜出。

上图是数据流图模型,程序需要处理的数据为:用户喊出的石头、剪子、布、程序创建的随机数。
根据数据流向,程序可以划分为三个处理过程:
数字化处理过程将用户输入的石头、剪子、布游戏词语进行数字化处理,将游戏词语转换为介于1至3范围内对应的数字。
创建随机数处理过程会创建一个介于1至3范围内对应的随机数,该随机数为程序一方喊出的石头、剪子、布。
判断输赢处理过程判断双方的输赢,判断方式是按照游戏规则进行判断,并返回输赢结果。
3、程序流程图

(1)提示用户输入游戏词语;
(2)判断游戏词语的正确性;
(3)对用户输入的游戏词语进行数字化处理,将游戏词语转换为介于1至3范围内对应的数字;
(4)调用输赢判断函数,在输赢判断函数内部创建一个介于1至3范围内的随机数,用该随机数和函数传入的数字进行判断,判断方式是按照游戏规则进行判断,并返回判断结果;
(5)如果函数返回的ret为“0”,输出“很棒,你赢了”,程序结束;否则输出ret,跳转到步骤(1)。

digit函数将用户输入的游戏词语转换为介于1至3范围内的数字,具体转换规则是:“石头”转换为数字1;“剪子”转换为数字2;“布”转换为数字3。
输赢判断函数就不给出流程图了,输赢判断函数的判断规则相对比较复杂,感兴趣的同学可自行绘制流程图。
4、程序代码及解读
代码如下:
'''
程序文件:main.py
功能描述:石头剪子布
代码编写时间:2020/05/11
作者:编程训练营
游戏词语的数字化表示
1:石头
2:剪子
3:布
'''
# 导入random模块
import random as rm
# 创建随机数
def random_number():
# 创建1至3范围内的随机数
num = rm.randint(1,3)
return num
# 判断输赢
# n1:用户输入 n2:随机数
def judge(n1,n2):
# 若n1==n2,返回平局
if n1 == n2:
return "平局"
# 用户赢
elif n1 == 1 and n2 == 2:
return "0"
# 用户赢
elif n1 == 2 and n2 == 3:
return "0"
# 用户赢
elif n1 == 3 and n2 == 1:
return "0"
# 计算机赢
else:
return "你输了,再来一次"
# 游戏词语数字化
def digit(word):
if word == "石头":
return 1
elif word == "剪子":
return 2
elif word == "布":
return 3
else:
return "error"
# 程序入口
if __name__ == '__main__':
# 输出提示内容
print("和计算机玩石头、剪子、布游戏")
while(True):
# 要求用户输入一个数
word = input("请输入石头或剪子或布:")
# 调用digit函数
n1 = digit(word)
# 如果用户输入正确
if n1 != "error":
# 创建随机数
n2 = random_number()
# 调用judge函数判断输赢
ret = judge(n1,n2)
if ret == "0":
print("很棒,你赢了")
break;
elif ret == "平局":
print("打了平手,继续努力")
else:
print("你输了,再来一次")
else:
print("输入错误,请重新输入")代码解读
代码定义了random_number函数、judge函数和digit函数。
random_number函数创建1至3范围内的随机数,用来模拟程序一方喊出的游戏词语。
digit函数将用户输入的游戏词语数字化为1至3范围的数字,并对用户的输入进行判断,当用户输入错误时,返回error。
judge函数按照游戏规则判断双方的输赢,judge函数需要传入n1和n2两个参数,n1是用户喊出的游戏词语的数字表示,n2是程序喊出游戏词语的数字表示。
主体代码使用while循环来执行游戏过程。在游戏过程中,用户输入一个游戏词语,代码调用digit函数将游戏词语数字化,如果digit函数返回error,说明用户输入错误,提示用户重新输入。
在用户输入正确的情况下,digit函数返回游戏词语的数字化表示,然后代码调用random_number函数创建一个介于1至3范围内的随机数,该随机数用于模拟计算机喊出的游戏词语,最后调用judge函数判断双方的输赢。
