Python3学习实战——用类实现简单的猜拳游戏
前言
本笔记仅个人认知和见解,水平有限,还请见谅。
如有错误,还请指出,若有想法,欢迎共享!
内容不代表最优解决方案,甚至可能不是很好的方法,仅供参考。
文章目录
Python3学习实战——用类实现简单的猜拳游戏前言1.题目分析2.流程分析3.完整程序4.方法分析初始化类出拳方法判断输赢方法游戏主体逻辑1.5优化方向1.题目分析
原题:用类实现一个简单的猜拳游戏。
猜拳游戏:用户输入一个剪刀石头或布,机器输出一个剪刀石头或布,并判断输赢。
特殊需求:用类(创建自定义对象),简单的。
2.流程分析
主要流程:
提供选项->系统输出->获取用户输入->判断胜负->重新执行
由于这个程序比较简单,就做一个猜拳类,实现获取并处理用户输入的方法和判断胜负的的方法即可。
3.完整程序
#Run.pyimport randomclass GuessBox:'''机器随机出一个,并且问用户输入,然后判断胜负'''GuessW={0:'剪刀',1:'石头',2:'布'}def __init__(self):print('---猜拳小游戏---')def Player(self):#判断玩家输入的方法self.__Robot=random.randrange(3)#从0-2中随机抽取一个数print('1.剪刀\n2.石头\n3.布')print('轮到你了!')self.Players=input()print('----------------')if self.Players in ['1','剪刀','1.剪刀']:self.PlayerInput=0elif self.Players in ['2','石头','2.石头']:self.PlayerInput=1elif self.Players in ['3','布','3.布']:self.PlayerInput=2else:self.PlayerInput=-1def Outp(self):print('您的是——',self.GuessW.get(self.PlayerInput))print('电脑出——',self.GuessW.get(self.__Robot))def WinorNot(self):#判断输赢的方法if self.PlayerInput not in range(3):print('憋乱打')elif self.PlayerInput == self.__Robot:print('平手')elif (0 in [self.PlayerInput,self.__Robot]) and (2 in [self.PlayerInput,self.__Robot]):if self.PlayerInput > self.__Robot:print('你输了...')elif self.PlayerInput < self.__Robot:print('你赢了!')elif self.PlayerInput < self.__Robot:print('你输了...')elif self.PlayerInput > self.__Robot:print('你赢了!')#调用这个类gb=GuessBox()while True:gb.Player()gb.Outp()gb.WinorNot()print('----------------')
执行这个文件:
---猜拳小游戏---1.剪刀2.石头3.布轮到你了!1----------------您的是—— 剪刀电脑出—— 石头你输了...----------------1.剪刀2.石头3.布轮到你了!剪刀----------------您的是—— 剪刀电脑出—— 布你赢了!----------------1.剪刀2.石头3.布轮到你了!石头----------------您的是—— 石头电脑出—— 石头平手----------------1.剪刀2.石头3.布轮到你了!3.布----------------您的是—— 布电脑出—— 布平手----------------1.剪刀2.石头3.布轮到你了!
4.方法分析
初始化类
class GuessBox:'''机器随机出一个,并且问用户输入,然后判断胜负'''GuessW={0:'剪刀',1:'石头',2:'布'}def __init__(self):print('---猜拳小游戏---')
首先是要用类的方法,那就先创建一个类。然后创建一个类变量,预存一个猜拳的字典,方便以后调用时使用,而且也提醒我们0代表剪刀,1代表石头,2代表布。利用数字代表文字有利于后期判断胜负。然后构造函数加载一个标题,而这个标题仅加载一次。
出拳方法
def Player(self):#判断玩家输入的方法self.__Robot=random.randrange(3)#从0-2中随机抽取一个数print('1.剪刀\n2.石头\n3.布')print('轮到你了!')self.Players=input()print('----------------')if self.Players in ['1','剪刀','1.剪刀']:self.PlayerInput=0elif self.Players in ['2','石头','2.石头']:self.PlayerInput=1elif self.Players in ['3','布','3.布']:self.PlayerInput=2else:self.PlayerInput=-1
接着是出拳方法(电脑用户同时猜拳):利用random.randomrange(3)获得0-2这三个数中的随机一个代表电脑的输出,赋值给一个禁止外部直接访问的变量__Robot。然后获得用户的输入,鉴于用户输入形式随机,我提供了三种输入方式,无论是只利用数字或只利用名字,还是数字名字都用都可以正确识别用户的输入(我可以认为是多态吗),并给予一个用户输入的猜拳数字代表用户的输入。如果用户的输入是不正常的,那这个数字是-1,以便以后能够警告用户。
判断输赢方法
def WinorNot(self):#判断输赢的方法if self.PlayerInput not in range(3):print('憋乱打')elif self.PlayerInput == self.__Robot:print('平手')elif (0 in [self.PlayerInput,self.__Robot]) and (2 in [self.PlayerInput,self.__Robot]):if self.PlayerInput > self.__Robot:print('你输了...')elif self.PlayerInput < self.__Robot:print('你赢了!')elif self.PlayerInput < self.__Robot:print('你输了...')elif self.PlayerInput > self.__Robot:print('你赢了!')
最后是判断输赢的方法,首先判断用户的输入是不是合法的,如果不是合法的就给予一定的指引。合法,就比较用户和电脑的数字。在用数字代表猜拳的时候,刻意以剪刀石头布的顺序给定数字,这样就可以利用大于小于来判断输赢了,除了同时出现0和2需要特殊讨论外,数字大的一方胜利。而0和2同时出现,也只需要反其道而行之,数字小的胜利即可。
def Outp(self):print('您的是——',self.GuessW.get(self.PlayerInput))print('电脑出——',self.GuessW.get(self.__Robot))
另外还有个同时输出用户猜拳和电脑猜拳的方法,方便得到用户和电脑的猜拳结果。
游戏主体逻辑
gb=GuessBox()while True:gb.Player()gb.Outp()gb.WinorNot()print('----------------')
首先将类实例化,然后在一个死循环内不断地调用方法,先获取电脑和用户的猜拳结果,再同时展示给用户,最后判断输赢。
1.5优化方向
除了算法上可以优化,如游戏输赢的判断方法等,还可以从面向对象的角度优化类的结构。比如将类的功能打散,或者将PlayerInput这种处理过的结果封装起来等。如果从可扩展上来说,如果加入耍赖系统的话,比如强行反转输赢等,可能就要重写WinorNot的方法。
最后这个程序没给直接退出程序的方法,要手动关掉。