当前位置:首页 > 编程知识 > 正文

Python石头剪刀布——知乎上的交互练习

Python石头剪刀布是一种简单的Python交互式练习,通过向用户展示石头、剪刀、布三个选项,要求用户选择一种选项,然后与计算机进行比较,最后根据胜负情况输出结果。本文从功能实现、代码解析和优化三方面详细阐述Python石头剪刀布。

一、功能实现

Python石头剪刀布主要实现以下三个功能:

1. 展示选项并提示用户选择

在程序开始运行时,需要展示出三个选项:石头、剪刀、布。代码如下:

option = ['石头', '剪刀', '布']
for i in range(len(option)):
    print(f"{i + 1}. {option[i]}")
input_str = input("请输入选项的编号:")

运行结果如下图所示:

图1:运行结果

用户需要输入选项的编号,程序接收到输入后,需要进行检查,必须是1到3的数字,代码如下:

if input_str.isdigit() and 1 <= int(input_str) <= 3: # 输入合法
    option_user = option[int(input_str) - 1]
else: # 输入不合法
    print("您的输入有误,请按照提示重新输入!")
    continue

如果输入不合法,则需要返回上一步并重新执行。

2. 随机生成计算机的选项

当用户确定了自己的选项后,程序需要生成计算机的选项。代码如下:

computer = random.choice(option)
print(f"计算机选择了:{computer}")

运行结果如下图所示:

图2:运行结果

3. 根据胜负情况输出结果

最后需要根据用户和计算机的选项比较结果,输出胜负情况。代码如下:

if option_user == computer: # 平局
    print("平局")
elif (option_user == '石头' and computer == '剪刀') or (option_user == '剪刀' and computer == '布') or (option_user == '布' and computer == '石头'): # 用户胜利
    print("恭喜你,你赢了!")
else: # 计算机胜利
    print("很遗憾,你输了!")

运行结果如下图所示:

图3:运行结果

二、代码解析

Python石头剪刀布的代码其实非常简单,主要包括以下几个部分:

1. 导入模块

使用随机数生成计算机的选项需要用到random模块,代码如下:

import random

2. 定义选项

石头、剪刀、布三个选项,可以使用列表进行定义,代码如下:

option = ['石头', '剪刀', '布']

3. 展示选项并提示用户选择

使用for循环遍历选项列表,并输出选项的编号和对应的字符串。使用input函数等待用户输入,并进行校验,代码如下:

for i in range(len(option)):
    print(f"{i + 1}. {option[i]}")
input_str = input("请输入选项的编号:")
if input_str.isdigit() and 1 <= int(input_str) <= 3:
    option_user = option[int(input_str) - 1]
else:
    print("您的输入有误,请按照提示重新输入!")
    continue

4. 随机生成计算机的选项

使用random模块的choice函数,从选项列表中随机选择一个选项,作为计算机的选项,代码如下:

computer = random.choice(option)

5. 根据胜负情况输出结果

通过比较用户的选项和计算机的选项,判断胜负情况,根据胜负情况输出结果,代码如下:

if option_user == computer:
    print("平局")
elif (option_user == '石头' and computer == '剪刀') or (option_user == '剪刀' and computer == '布') or (option_user == '布' and computer == '石头'):
    print("恭喜你,你赢了!")
else:
    print("很遗憾,你输了!")

三、优化策略

虽然Python石头剪刀布是一个简单的程序,但是也可以运用一些优化策略来提高程序的可读性和运行效率。

1. 使用枚举类型的形式定义选项

使用枚举类型来定义选项,可以使代码更加清晰明了,避免出现不合法的选项编号。代码如下:

from enum import Enum
class Option(Enum):
    STONE = 1
    SCISSORS = 2
    CLOTH = 3

之后在输出选项列表时,可以使用enum类中的values()函数来进行遍历输出,代码如下:

for opt in Option:
    print(f"{opt.value}. {opt.name}")

2. 使用字典来判断胜负情况

使用字典可以避免出现过多的if判断,提高代码的可读性。代码如下:

wins = {'石头':'剪刀', '剪刀':'布', '布':'石头'}
computer = random.choice(list(wins.keys()))
if wins[option_user] == computer:
    print("恭喜你,你赢了!")
elif wins[computer] == option_user:
    print("很遗憾,你输了!")
else:
    print("平局")

3. 添加用户选择的次数和胜利次数

添加用户选择的次数和胜利次数的统计,可以使程序更加完善。代码如下:

option_user_total, option_user_win = 0, 0 # 用户选择的次数和胜利的次数
while True:
    # 展示选项
    for opt in Option:
        print(f"{opt.value}. {opt.name}")
    # 提示用户选择
    input_str = input("请输入选项的编号:")
    if input_str.isdigit() and 1 <= int(input_str) <= 3:
        option_user_total += 1
        option_user = Option(int(input_str))
    else:
        print("您的输入有误,请按照提示重新输入!")
        continue
    # 随机生成计算机的选项
    computer = random.choice(list(Option))
    # 比较用户和计算机的选项
    if option_user == computer:
        print("平局")
    elif wins[option_user.name] == computer.name:
        print("恭喜你,你赢了!")
        option_user_win += 1
    else:
        print("很遗憾,你输了!")
    # 输出胜利率
    print(f"您已经进行了{option_user_total}局游戏,胜率为:{option_user_win/option_user_total:.2%}")

四、完整代码示例

import random
from enum import Enum

# 定义选项
class Option(Enum):
    STONE = 1
    SCISSORS = 2
    CLOTH = 3

# 获胜情况
wins = {'石头':'剪刀', '剪刀':'布', '布':'石头'}

# 初始化统计数据
option_user_total, option_user_win = 0, 0

# 游戏开始
while True:
    # 展示选项
    for opt in Option:
        print(f"{opt.value}. {opt.name}")
    # 提示用户选择
    input_str = input("请输入选项的编号:")
    if input_str.isdigit() and 1 <= int(input_str) <= 3:
        option_user_total += 1
        option_user = Option(int(input_str))
    else:
        print("您的输入有误,请按照提示重新输入!")
        continue
    # 随机生成计算机的选项
    computer = random.choice(list(Option))
    # 比较用户和计算机的选项
    if option_user == computer:
        print("平局")
    elif wins[option_user.name] == computer.name:
        print("恭喜你,你赢了!")
        option_user_win += 1
    else:
        print("很遗憾,你输了!")
    # 输出胜利率
    print(f"您已经进行了{option_user_total}局游戏,胜率为:{option_user_win/option_user_total:.2%}")