1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Python趣味案例——剪刀石头布小游戏改进版(自由实现三局两胜五局三胜七局四胜。。。)

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

时间:2022-03-18 00:26:56

相关推荐

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

前言

最近看了这篇知乎文章,深受启发:

Python之石头剪刀布小游戏(史上最详细步骤) - 真小凡的文章 - 知乎

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

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

一、游戏模式说明

1、输入总局数,只能为奇数。若输入的不是奇数,就提示重新输入。

获胜规则:

(1)石头打赢剪刀,剪刀打赢布,布打赢石头;

(2)每一轮电脑随机出拳

(3)【新增】若用户或者电脑获胜次数>总局数/2的整数部分,如,总局数为5,则单方获胜次数>2时游戏结束;

(4)【新增】若所有局都正常结束,则在结束以后根据胜负次数判断最终输赢。

2、出拳阶段

3、亮拳阶段

4、本局胜负判定

5、【新增】游戏最终胜负判定

6、【新增】每一次游戏结束后,都可以选择再玩一次

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

import randomN=5# 剪刀石头布punches = ['石头','剪刀','布']user_choice = ''computer_choice = ''win = 0lose = 0mode = 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 +1print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win, lose))else:# 若要指定游戏模式,就要累计输赢次数lose = lose +1print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win, lose))# 若输赢次数已经超过一半,已经分出胜负,循环要提前结束if win > mode//2:breakelif 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_modedef 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_choicedef 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 + 1print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))else:lose_time = lose_time + 1print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))return win_time, lose_timemy_mode = mode()lose = 0win = 0for i in range(my_mode):# 双方出拳user_choice, computer_choice = punches()win, lose = judge(user_choice, computer_choice, win, lose)# 提前终止if win > my_mode // 2:breakelif lose > my_mode // 2:breakif 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_modedef 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_choicedef 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 + 1print('这一局你赢了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))else:lose_time = lose_time + 1print('这一局你输了!玩家积分:%d VS 系统积分:%d' % (win_time, lose_time))return win_time, lose_time# 在最前面立个flag,设为1,再加个循环,只要flag为1,就进行游戏,这样的话,只要你不强行改动flag的值,while循环中的内容就会一直执行下去。flag=1while flag==1:my_mode = mode()lose = 0win = 0for i in range(my_mode):# 双方出拳user_choice, computer_choice = punches()win, lose = judge(user_choice, computer_choice, win, lose)# 提前终止if win > my_mode // 2:breakelif lose > my_mode // 2:breakif 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=0print('游戏结束!')else:print('输入错误,游戏结束!')

五、更正

在加是否下一轮逻辑的时候,出现了一个问题TypeError: ‘int’ object is not callable

百度了一下,说是变量名和函数名冲撞了,因此原代码中的变量mode我改名为my_mode,就可以了。

这里不能也叫game_mode,原则上函数内部的变量名和也要有唯一性,才符合规范。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。