首页 > 编程语言 >Python——石头剪刀布(附源码+多模式二改优化版)

Python——石头剪刀布(附源码+多模式二改优化版)

时间:2024-10-31 17:49:46浏览次数:7  
标签:computer score Python choice player 源码 print input 二改

编程初学者通常会从简单的项目开始,以建立基础并增强信心。石头剪刀布游戏是一个很好的起点,因为它涉及到基本的逻辑判断、用户输入处理和随机数生成。本文将详细介绍如何使用Python编写一个石头剪刀布游戏,并提供完整的代码和解释。

目录

一、游戏介绍

二、基本代码解析与实现

2.1代码解释

三、多模式版代码实现与解析

3.1导入模块

3.2安装numpy模块的函数

3.3检查并安装numpy模块的函数

3.4显示选择的函数

3.5获取玩家选择的函数

3.6判断胜负的函数

3.7显示进度条的函数

3.8锦标赛模式的函数

3.9单局游戏模式的函数

3.10主函数

3.11程序入口

3.12完整代码

四、实现原理

五、总结


一、游戏介绍

石头剪刀布是一种两人游戏,玩家通过选择石头、剪刀或布来相互竞争。在这个Python实现的版本中,玩家将与计算机对战,计算机会随机选择一个手势,然后根据石头剪刀布的规则判断胜负。

二、基本代码解析与实现

以下是实现石头剪刀布游戏的Python代码,我们将逐步解析每个部分。

import subprocess
import sys
import random

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

def check_numpy():
    try:
        import numpy
    except ImportError:
        print("numpy 未安装,正在安装...")
        install("numpy")
        print("numpy 安装完成!")

def display_choices():
    print("请选择:")
    print("1. 石头")
    print("2. 剪刀")
    print("3. 布")
    print("输入 '0' 退出游戏")

def get_player_choice():
    while True:
        player_input = input("请输入你的选择(1/2/3):")
        if player_input in ['0', '1', '2', '3']:
            return player_input
        print("无效的选择,请输入 '1'、'2' 或 '3'。")

def determine_winner(player_choice, computer_choice):
    if player_choice == computer_choice:
        return "平局!", 0
    elif (player_choice == "石头" and computer_choice == "剪刀") or \
         (player_choice == "剪刀" and computer_choice == "布") or \
         (player_choice == "布" and computer_choice == "石头"):
        return "你赢了!", 1
    else:
        return "你输了!", -1

def rock_paper_scissors():
    print("欢迎来到石头、剪刀、布游戏!")
    choices = ["石头", "剪刀", "布"]
    score = 0
    rounds = 0

    display_choices()

    while True:
        player_input = get_player_choice()

        if player_input == '0':
            print("感谢你玩这个游戏!再见!")
            print(f"你的总得分是:{score}")
            break
        
        player_choice = choices[int(player_input) - 1]
        computer_choice = random.choice(choices)
        
        print(f"你选择了:{player_choice}")
        print(f"计算机选择了:{computer_choice}")

        result, round_score = determine_winner(player_choice, computer_choice)
        score += round_score
        rounds += 1
        
        print(result)
        print(f"当前得分:{score}(共 {rounds} 轮)")
        print()  # 输出空行以便于可读性

if __name__ == "__main__":
    check_numpy()
    rock_paper_scissors()

2.1代码解释

  1. 导入模块:我们导入了subprocesssysrandom模块。subprocess用于执行系统命令,sys用于获取Python解释器的路径,random用于生成随机数。

  2. 安装依赖install函数用于安装缺失的Python包,这里用于安装numpy库,虽然在本游戏中并未直接使用numpy,但这个函数展示了如何管理依赖。

  3. 检查numpy库check_numpy函数检查numpy库是否已安装,如果未安装,则自动安装。

  4. 显示选择display_choices函数显示游戏的选择菜单,告知玩家可以选择的手势和退出游戏的选项。

  5. 获取玩家选择get_player_choice函数获取玩家的输入,并检查输入是否有效。如果输入无效,会提示玩家重新输入。

  6. 判断胜负determine_winner函数根据石头剪刀布的规则判断玩家和计算机的胜负,并返回结果和本轮得分。

  7. 游戏主函数rock_paper_scissors函数是游戏的主函数,负责游戏流程的控制。它首先显示选择菜单,然后进入一个循环,直到玩家选择退出。在每一轮中,玩家输入他们的选择,计算机随机生成一个选择,然后判断胜负并更新得分。

  8. 程序入口if __name__ == "__main__":部分是程序的入口点,它首先检查numpy库是否安装,然后调用rock_paper_scissors函数开始游戏。

三、多模式版代码实现与解析

这段代码是一个简单的石头、剪刀、布游戏,它包含了两个模式:单局游戏和锦标赛模式。下面是对代码的解析和原理解释:

3.1导入模块

import subprocess
import sys
import random
import time

这段代码导入了四个Python模块:

  • subprocess:用于执行外部命令。
  • sys:提供了一些与Python解释器和它的环境有关的函数。
  • random:用于生成随机数。
  • time:提供了各种与时间相关的函数。

3.2安装numpy模块的函数

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

这个函数接受一个参数package,使用subprocess模块来调用pip安装指定的包。

3.3检查并安装numpy模块的函数

def check_numpy():
    try:
        import numpy
    except ImportError:
        print("numpy 未安装,正在安装...")
        install("numpy")
        print("numpy 安装完成!")

这个函数尝试导入numpy模块,如果导入失败(即numpy未安装),则调用install函数来安装numpy

3.4显示选择的函数

def display_choices():
    print("请选择:")
    print("1. 石头")
    print("2. 剪刀")
    print("3. 布")
    print("输入 '0' 退出游戏")

这个函数打印出玩家可以选择的选项。

3.5获取玩家选择的函数

def get_player_choice():
    while True:
        player_input = input("请输入你的选择(1/2/3):")
        if player_input in ['0', '1', '2', '3']:
            return player_input
        print("无效的选择,请输入 '1' 到 '3'。")

这个函数通过无限循环获取玩家的输入,并检查输入是否有效。如果输入是0123,则返回输入值;否则,提示玩家重新输入。

3.6判断胜负的函数

def determine_winner(player_choice, computer_choice):
    rules = {
        "石头": ["剪刀"],
        "剪刀": ["布"],
        "布": ["石头"]
    }
    
    if player_choice == computer_choice:
        return "平局!", 0
    elif computer_choice in rules[player_choice]:
        return "你赢了!", 1
    else:
        return "你输了!", -1

这个函数根据游戏规则判断玩家和计算机的胜负,并返回结果和分数变化。

3.7显示进度条的函数

def show_progress_bar(total_rounds, current_round):
    progress = (current_round / total_rounds) * 100

    # 进度条样式
    bar_length = 30
    block = int(round(bar_length * progress / 100))
    
    # 使用 ANSI 转义序列来改变颜色
    bar = f"\033[92m{'█' * block}\033[0m" + '-' * (bar_length - block)  # 绿色的块
    sys.stdout.write(f"\r进度: |{bar}| {progress:.2f}%")
    sys.stdout.flush()
    time.sleep(0.1)  # 控制进度条的速度

这个函数显示一个进度条,用于锦标赛模式中显示当前轮次的进度。

3.8锦标赛模式的函数

def tournament_mode():
    print("欢迎来到锦标赛模式!")
    rounds = 8  # 固定轮次
    print("锦标赛共八轮")
    player_score = 0
    computer_score = 0

    # 显示进度条
    print("准备开始比赛,请稍等...")
    for round_num in range(1, rounds + 1):
        show_progress_bar(rounds, round_num)
    print("\n进度条完成,开始比赛!\n")

    for round_num in range(1, rounds + 1):
        print(f"\n第 {round_num} 轮:")
        display_choices()  # 在每轮中显示选项
        player_input = get_player_choice()
        
        if player_input == '0':
            print("感谢你玩这个游戏!再见!")
            break
        
        choices = ["石头", "剪刀", "布"]
        player_choice = choices[int(player_input) - 1]
        computer_choice = random.choice(choices)
        
        print(f"你选择了:{player_choice}")
        print(f"计算机选择了:{computer_choice}")

        result, round_score = determine_winner(player_choice, computer_choice)
        if round_score == 1:
            player_score += 1
        elif round_score == -1:
            computer_score += 1
        
        print(result)
        print(f"当前得分 - 你:{player_score},计算机:{computer_score}")

    if player_score > computer_score:
        print("\n恭喜你,赢得了锦标赛!")
    elif player_score < computer_score:
        print("\n很遗憾,你输了锦标赛!")
    else:
        print("\n锦标赛平局!")

这个函数实现了锦标赛模式,玩家需要进行8轮游戏,每轮结束后更新得分,并在最后判断胜负。

3.9单局游戏模式的函数

def single_game_mode():
    print("欢迎来到单局游戏!")
    display_choices()
    
    player_input = get_player_choice()
    if player_input == '0':
        print("感谢你玩这个游戏!再见!")
        return
    
    choices = ["石头", "剪刀", "布"]
    player_choice = choices[int(player_input) - 1]
    computer_choice = random.choice(choices)
    
    print(f"你选择了:{player_choice}")
    print(f"计算机选择了:{computer_choice}")

    result, _ = determine_winner(player_choice, computer_choice)
    print(result)

这个函数实现了单局游戏模式,玩家和计算机进行一次石头、剪刀、布的对决,并判断胜负。

3.10主函数

def rock_paper_scissors():
    print("欢迎来到石头、剪刀、布游戏!")
    print("IT·小灰灰")

    while True:
        print("\n选择游戏模式:")
        print("1. 单局游戏")
        print("2. 锦标赛模式")
        print("输入 '0' 退出游戏")
        
        mode_input = input("请选择模式(1/2):")
        if mode_input == '0':
            print("感谢你玩这个游戏!再见!")
            break
        elif mode_input == '1':
            single_game_mode()
        elif mode_input == '2':
            tournament_mode()
        else:
            print("无效的选择,请输入 '1' 或 '2'。")

这个函数是游戏的主函数,它提供了一个循环,允许玩家选择游戏模式,并根据选择调用相应的函数。

3.11程序入口

if __name__ == "__main__":
    check_numpy()
    rock_paper_scissors()

这是程序的入口点。首先检查numpy是否安装,如果未安装则安装它,然后调用rock_paper_scissors函数开始游戏。

3.12完整代码

import subprocess
import sys
import random
import time

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

def check_numpy():
    try:
        import numpy
    except ImportError:
        print("numpy 未安装,正在安装...")
        install("numpy")
        print("numpy 安装完成!")

def display_choices():
    print("请选择:")
    print("1. 石头")
    print("2. 剪刀")
    print("3. 布")
    print("输入 '0' 退出游戏")

def get_player_choice():
    while True:
        player_input = input("请输入你的选择(1/2/3):")
        if player_input in ['0', '1', '2', '3']:
            return player_input
        print("无效的选择,请输入 '1' 到 '3'。")

def determine_winner(player_choice, computer_choice):
    rules = {
        "石头": ["剪刀"],
        "剪刀": ["布"],
        "布": ["石头"]
    }
    
    if player_choice == computer_choice:
        return "平局!", 0
    elif computer_choice in rules[player_choice]:
        return "你赢了!", 1
    else:
        return "你输了!", -1

def show_progress_bar(total_rounds, current_round):
    progress = (current_round / total_rounds) * 100

    # 进度条样式
    bar_length = 30
    block = int(round(bar_length * progress / 100))
    
    # 使用 ANSI 转义序列来改变颜色
    bar = f"\033[92m{'█' * block}\033[0m" + '-' * (bar_length - block)  # 绿色的块
    sys.stdout.write(f"\r进度: |{bar}| {progress:.2f}%")
    sys.stdout.flush()
    time.sleep(0.1)  # 控制进度条的速度

def tournament_mode():
    print("欢迎来到锦标赛模式!")
    rounds = 8  # 固定轮次
    print("锦标赛共八轮")
    player_score = 0
    computer_score = 0

    # 显示进度条
    print("准备开始比赛,请稍等...")
    for round_num in range(1, rounds + 1):
        show_progress_bar(rounds, round_num)
    print("\n进度条完成,开始比赛!\n")

    for round_num in range(1, rounds + 1):
        print(f"\n第 {round_num} 轮:")
        display_choices()  # 在每轮中显示选项
        player_input = get_player_choice()
        
        if player_input == '0':
            print("感谢你玩这个游戏!再见!")
            break
        
        choices = ["石头", "剪刀", "布"]
        player_choice = choices[int(player_input) - 1]
        computer_choice = random.choice(choices)
        
        print(f"你选择了:{player_choice}")
        print(f"计算机选择了:{computer_choice}")

        result, round_score = determine_winner(player_choice, computer_choice)
        if round_score == 1:
            player_score += 1
        elif round_score == -1:
            computer_score += 1
        
        print(result)
        print(f"当前得分 - 你:{player_score},计算机:{computer_score}")

    if player_score > computer_score:
        print("\n恭喜你,赢得了锦标赛!")
    elif player_score < computer_score:
        print("\n很遗憾,你输了锦标赛!")
    else:
        print("\n锦标赛平局!")

def single_game_mode():
    print("欢迎来到单局游戏!")
    display_choices()
    
    player_input = get_player_choice()
    if player_input == '0':
        print("感谢你玩这个游戏!再见!")
        return
    
    choices = ["石头", "剪刀", "布"]
    player_choice = choices[int(player_input) - 1]
    computer_choice = random.choice(choices)
    
    print(f"你选择了:{player_choice}")
    print(f"计算机选择了:{computer_choice}")

    result, _ = determine_winner(player_choice, computer_choice)
    print(result)

def rock_paper_scissors():
    print("欢迎来到石头、剪刀、布游戏!")
    print("IT·小灰灰")

    while True:
        print("\n选择游戏模式:")
        print("1. 单局游戏")
        print("2. 锦标赛模式")
        print("输入 '0' 退出游戏")
        
        mode_input = input("请选择模式(1/2):")
        if mode_input == '0':
            print("感谢你玩这个游戏!再见!")
            break
        elif mode_input == '1':
            single_game_mode()
        elif mode_input == '2':
            tournament_mode()
        else:
            print("无效的选择,请输入 '1' 或 '2'。")

if __name__ == "__main__":
    check_numpy()
    rock_paper_scissors()

无需手动安装库,代码中会自动安装。

四、实现原理

  1. 用户交互:通过input函数获取用户输入,根据用户的选择执行不同的游戏模式。
  2. 随机选择:使用random.choice函数让计算机随机选择石头、剪刀或布。
  3. 游戏规则:通过一个字典rules定义了游戏的胜负规则。
  4. 进度条:在锦标赛模式中使用进度条显示当前的进度。
  5. 得分统计:在锦标赛模式中统计玩家和计算机的得分,并在最后判断胜负。

五、总结

通过这个详细的指南,我们不仅学习了如何用Python编写一个石头剪刀布游戏,还了解了如何处理用户输入、随机事件以及基本的程序逻辑。

当然,希望你喜欢这个简单的石头、剪刀、布游戏。它虽然简单,但包含了基本的游戏逻辑和用户交互。如果你对编程感兴趣,可以尝试自己修改和扩展这个游戏,比如添加新的游戏模式、改进用户界面或者增加网络对战功能。编程的世界充满无限可能,愿你在探索中找到乐趣!记得,无论你的代码多么复杂,始终保持代码的清晰和可维护性是非常重要的。祝你编程愉快!点我入群一起交流
 

标签:computer,score,Python,choice,player,源码,print,input,二改
From: https://blog.csdn.net/m0_72606784/article/details/143350076

相关文章

  • Python之pyserial模块 串口通信
    python之pyserial模块原文链接:https://www.cnblogs.com/sureZ-learning/p/17054481.htmlpyserial模块封装了对串口的访问,兼容各种平台(Windows、Linux、MACOS等)。其支持的特性如下:所有平台基于类的接口相同端口可以通过python来设置支持不同数据长度、停止位、奇偶校验位、流......
  • Python深度学习进阶与前沿应用(注意力机制详解、生成式模型详解、自监督学习模型详解、
    近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型(BERT、GPT-1/2/3/3.5/4、DETR、ViT、SwinTransformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Di......
  • ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、农业
    在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。原文链接:ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、......
  • Ubuntu24安装Gitlab源码管理系统
    Ubuntu20.04LTS,22.04LTS,24.04LTS安装和配置所需的依赖sudoapt-getupdatesudoapt-getinstall-ycurlopenssh-serverca-certificatestzdataperl(可选)如果要使用Postfix来发送电子邮件通知,执行以下安装命令。sudoapt-getinstall-ypostfix如果您想使用......
  • 使用MicroPython开发ESP32系列单片机程序入门
    请参考网络ESP32教程地址:https://www.itprojects.cn/coursecenter-hardware.html以ESP32-S3为例讲述烧录固件过程1、下载Micropython固件。首次使用ESP32时,需要将micropython固件烧录到ESP32内。不同芯片,Micropython固件不同。固件下载地址 为:https://micropython.org/dow......
  • centos安装最新Python
    1.卸载现有Python版本sudoyumremovepython2.安装开发工具sudoyumgroupinstall"DevelopmentTools"-ysudoyuminstallopenssl-develbzip2-devellibffi-devel-y3.下载Python源代码curl-Ohttps://www.python.org/ftp/python/3.11.4/Python-......
  • socket在python下的使用
    socket在python下的使用-创建套接字对象-套接字对象方法-socket缓冲区与阻塞-粘包(数据的无边界性)-案例之模拟ssh命令-案例之文件上传1.1创建套接字对象Linux中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket也可以视为一个文件对象,也有文件描述符。im......
  • UcOs-III 源码阅读: os_mutex.c
    //作用:管理互斥量的代码/***********************************************************************************************************uC/OS-III*TheReal-TimeKernel**......
  • Python GUI编程 tkinter编程
    tkinter编程思路比喻对于tkinter编程,主要用两个比喻来描述,重点理解容器、组件和布局管理器。 第一个,作画。我们都见过美术生写生的情景,先支一个画架,放上画板,蒙上画布,构思内容,用铅笔画草图,组织结构和比例,调色板调色,最后画笔勾勒。相应的,对应到tkinter编程,那么我们的显示屏就是支......
  • 斐波那契时间序列,精准捕捉市场拐点 MT4免费公式源码!
    指标名称:斐波那契时间序列版本:MT4ver.2.01斐波那契时间序列是一种技术分析工具,通过将斐波那契数列(如1,2,3,5,8,13等)应用于时间轴上,用于预测市场价格的时间周期拐点。斐波那契时间序列在股票、外汇和其他市场分析中常用,帮助预测趋势反转或调整发生的时间节点。斐波那......