Python趣味案例——剪刀石头布小游戏改进版(自由实现三局两胜五局三胜七局四胜。。。)

前言

最近看了这篇知乎文章,深受启发:
Python之石头剪刀布小游戏(史上最详细步骤) - 真小凡的文章 - 知乎

Python中实现剪刀石头布游戏的方式有很多种,这个博主允许直接输入石头、剪刀、布,执行起来丝滑许多。但目前一局定胜负、三局两胜、五局三胜都是固定的游戏模式,我想加入一个功能,允许用户自行选择游戏局数。

所以,我这篇文章直接在博主的基础上扩充啦!

一、游戏模式说明

1、输入总局数,只能为奇数。若输入的不是奇数,就提示重新输入。
获胜规则:
(1)石头打赢剪刀,剪刀打赢布,布打赢石头;
(2)每一轮电脑随机出拳
(3)【新增】若用户或者电脑获胜次数>总局数/2的整数部分,如,总局数为5,则单方获胜次数>2时游戏结束;
(4)【新增】若所有局都正常结束,则在结束以后根据胜负次数判断最终输赢。
2、出拳阶段
3、亮拳阶段
4、本局胜负判定
5、【新增】游戏最终胜负判定
6、【新增】每一次游戏结束后,都可以选择再玩一次

二、加M局N胜制——参考代码

import random
N=5
# 剪刀石头布
punches = ['石头','剪刀','布']
user_choice = ''
computer_choice = ''
win = 0
lose = 0

mode = int(input("这是一个猜拳游戏,请输入总局数,要求必须是奇数:"))
# 这里只允许输入正整数和奇数,不限制次数上限
while mode<0 or mode%2==0:
    print("输入有误,请重新输入!")
    mode = input("请输入总局数,要求必须是奇数:")
# //符号为取整,比如输入mode=3,mode/2=1.5,mode//2就是1;若输入mode=5,mode//2就是2,这里标明几局几胜更清楚
print("您选择了%d局%d胜制" % (game_mode, game_mode // 2 + 1))

# 这里加入循环,输入几局最多就能玩几局,若中途提前分出胜负则break跳出循环
for i in range(mode):
    # 出拳
    computer_choice = random.choice(punches)
    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 == '石头'):
        # 若要指定游戏模式,就要累计输赢次数
        win = win +1
        print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win, lose))
    else:
        # 若要指定游戏模式,就要累计输赢次数
        lose = lose +1
        print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win, lose))


    # 若输赢次数已经超过一半,已经分出胜负,循环要提前结束
    if win > mode//2:
        break
    elif lose > mode//2:
        break

# 只有循环结束,才会判定最终结果
if win > lose:
    print("========最终结果========\n恭喜你赢了!")
elif lose > win:
    print("========最终结果========\n很遗憾你输了!")
else:
    print("========最终结果========\n势均力敌,平局!")

三、 改为函数版——参考代码

import random

# 剪刀石头布

def mode():
    game_mode = int(input("这是一个猜拳游戏,请输入总局数,要求必须是奇数:"))
    while game_mode < 0 or game_mode % 2 == 0:
        print("输入有误,请重新输入!")
        game_mode = input("请输入总局数,要求必须是奇数:")
    print("您选择了%d局%d胜制" % (game_mode, game_mode // 2 + 1))
    return game_mode


def punches():
    punches = ['石头', '剪刀', '布']
    computer_choice = random.choice(punches)
    user_choice = input('请出拳:(石头、剪刀、布)')  # 请用户输入选择
    while user_choice not in punches:
        print('输入有误,请重新出拳')  # 当用户输入错误,提示错误,重新输入
        user_choice = input()
    print('你出了:%s VS 电脑出了:%s' % (user_choice, computer_choice))
    return user_choice, computer_choice


def judge(user_choice, computer_choice, win_time, lose_time):
    # 本局胜负
    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 == '石头'):
        win_time = win_time + 1
        print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))
    else:
        lose_time = lose_time + 1
        print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))
    return win_time, lose_time


my_mode = mode()
lose = 0
win = 0
for i in range(my_mode):
    # 双方出拳
    user_choice, computer_choice = punches()
    win, lose = judge(user_choice, computer_choice, win, lose)

    # 提前终止
    if win > my_mode // 2:
        break
    elif lose > my_mode // 2:
        break

if win > lose:
    print("—————最终结果—————\n恭喜你赢了!")
elif lose > win:
    print("—————最终结果—————\n很遗憾你输了!")
else:
    print("—————最终结果—————\n势均力敌,平局!")

四、加入“是否下一轮”逻辑

import random

# 剪刀石头布

def mode():
    game_mode = int(input("这是一个猜拳游戏,请输入总局数,要求必须是奇数:"))
    while game_mode < 0 or game_mode % 2 == 0:
        print("输入有误,请重新输入!")
        game_mode = input("请输入总局数,要求必须是奇数:")
    print("您选择了%d局%d胜制" % (game_mode, game_mode // 2 + 1))
    return game_mode


def punches():
    punches = ['石头', '剪刀', '布']
    computer_choice = random.choice(punches)
    user_choice = input('请出拳:(石头、剪刀、布)')  # 请用户输入选择
    while user_choice not in punches:
        print('输入有误,请重新出拳')  # 当用户输入错误,提示错误,重新输入
        user_choice = input()
    print('你出了:%s VS 电脑出了:%s' % (user_choice, computer_choice))
    return user_choice, computer_choice


def judge(user_choice, computer_choice, win_time, lose_time):
    # 本局胜负
    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 == '石头'):
        win_time = win_time + 1
        print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))
    else:
        lose_time = lose_time + 1
        print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))
    return win_time, lose_time

# 在最前面立个flag,设为1,再加个循环,只要flag为1,就进行游戏,这样的话,只要你不强行改动flag的值,while循环中的内容就会一直执行下去。
flag=1
while flag==1:
    my_mode = mode()
    lose = 0
    win = 0
    for i in range(my_mode):
        # 双方出拳
        user_choice, computer_choice = punches()
        win, lose = judge(user_choice, computer_choice, win, lose)

        # 提前终止
        if win > my_mode // 2:
            break
        elif lose > my_mode // 2:
            break

    if win > lose:
        print("—————最终结果—————\n恭喜你赢了!")
    elif lose > win:
        print("—————最终结果—————\n很遗憾你输了!")
    else:
        print("—————最终结果—————\n势均力敌,平局!")

	# 以下为控制是否下一轮的代码,这里只接受Y和N两种输入方式
    next_game=input("是否进行下一轮?Y/N\n")
    if next_game == 'Y':
        print('新一轮游戏开始啦!\n———————————————')
    elif next_game == 'N':
        flag=0
        print('游戏结束!')
    else:
        print('输入错误,游戏结束!')


五、更正

  • 在加是否下一轮逻辑的时候,出现了一个问题TypeError: ‘int’ object is not callable
    百度了一下,说是变量名和函数名冲撞了,因此原代码中的变量mode我改名为my_mode,就可以了。
    这里不能也叫game_mode,原则上函数内部的变量名和也要有唯一性,才符合规范。

新手学习,如有疏漏,欢迎指正!

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值