本文打算构造三个类,分别为用户类(User),电脑类(Robot),以及裁判类(Referee)来实现剪刀石头布游戏的核心逻辑。
用户类(User):实现读取用户的选择
电脑类(Robot):实现电脑随机做出选择
裁判类(Referee):实现对用户输入的异常处理,以及整个游戏过程中需要的判断以及输出
、
首先初始化属性cur为None,以保存当前用户所做出的选择。再构造make_decision方法实现了对用户选择的读取,如果用户的输入不为“剪刀”“石头”“布”其中之一,则继续要求用户输入。
from random import randint
decision = ['石头','剪刀','布']
class User:
def __init__(self):
self.cur = None
def make_decision(self):
self.cur = input("请问你要出什么:")
if self.cur not in decision:
print("输入有误,请重新输入")
return self.make_decision()
return self.cur
与用户类相似,初始化cur属性保存当前电脑做出的选择。构造make_decision方法,使用randint()函数,使电脑随机做出选择。
class Robot:
def __init__(self):
self.cur = None
def make_decision(self):
self.cur = decision[randint(0,2)]
return self.cur
裁判类将把用户类(User)和电脑类(Robot)的实例化对象作为参数传入裁判类(Referee)中,以方便获取当前用户和电脑的选择。再初始化以下属性,cur_res用于保存当前对局的结果,robot_score和user_score分别用于保存电脑和用户的当前得分,cur_count用于保存当前为第几场对局。
class Referee:
def __init__(self,robot,user):
self.robot = robot
self.user = user
self.cur_res = None
self.robot_score = 0
self.user_score = 0
self.cur_count = 1
构造input_count()方法,读取用户所选择的规则,并判断用户输入是否为数字,以及是否为大于0的奇数,如果不满足,则让用户重新输入。
def input_count(self):
try:
self.count = int(input('请输入局数(奇数):'))
except:
print('输入有误,请再次输入')
return self.input_count()
if self.count % 2 != 0 and self.count > 0:
return self.count
else:
print('输入有误,请再次输入')
return self.input_count()
构造who_win()方法,用于判断用户和电脑谁输谁赢,获胜方加一分,对局数也+1
def who_win(self):
if self.robot.cur == self.user.cur:
self.cur_res = '平局'
elif (self.user.cur == '石头' and self.robot.cur == '剪刀') or \
(self.user.cur == '剪刀' and self.robot.cur == '布')or \
(self.user.cur == '布' and self.robot.cur == '石头'):
self.cur_res = '您胜利了'
self.user_score += 1
else:
self.cur_res = '您输了'
self.robot_score += 1
self.cur_count += 1
构造is_finish()方法,判断是否达到本场比赛结束条件,即某一方先获得规定分数。若达到结束条件,返回1,未达到条件返回0
def is_finish(self):
win_score = self.count // 2 + 1
if self.robot_score == win_score or self.user_score == win_score:
return 1
else: return 0
构造get_result()函数,通过比较电脑和用户的分数,得到最终的获胜方。
def get_result(self):
if self.robot_score > self.user_score:
return "电脑"
else:
return "你"
首先实例化电脑(Robot)、用户(User)、裁判(Referee)三个对象。调用裁判对象中的input_count()函数让用户选择规则并输入,输出用户所选规则。
进入对局循环,用is_start变量作为循环条件。
首先输出当前对局的局数,并让用户做出选择。
再让电脑随机做出选择,判断谁为赢家并输出当前对局cur_res结果。
计算得分并输出,判断是否有一方达到结束本场游戏条件,如果有则使用get_result()获取本场游戏结果并输出。
if __name__ == '__main__':
robot = Robot() # 实例化电脑对象
user = User() # 实例化用户对象
referee = Referee(robot,user) #实例化裁判对象
count = referee.input_count()
print('选择规则为{}局{}胜'.format(count,count//2+1))
is_start = True
while(is_start):
print('*'*25+'当前为第{}局'.format(referee.cur_count)+'*'*25)
user_decision = user.make_decision() # 用户做出选择
robot_decision = robot.make_decision() # 电脑做出选择
print('你选择出:{}\n电脑选择出:{}'.format(user.cur,robot.cur))
referee.who_win() # 判断赢家
print('结果:{}'.format(referee.cur_res))
print('电脑得分:您的得分 = {}:{}'.format(referee.robot_score,\
referee.user_score))
is_finish = referee.is_finish()
if referee.is_finish(): # 判断是否有一方达到结束条件
result = referee.get_result()
is_start = False
print('*'*25+'比赛结束'+'*'*25)
print('*'*25+'获胜方为:'+result+'*'*25)
# -*- coding: utf-8 -*-
"""
Created on Tues Aug 30 15:35:56 2022
@author: ZTBrilly
"""
from random import randint
decision = ['石头','剪刀','布']
class Robot:
def __init__(self):
self.cur = None
def make_decision(self):
self.cur = decision[randint(0,2)]
return self.cur
class User:
def __init__(self):
self.cur = None
def make_decision(self):
self.cur = input("请问你要出什么:")
if self.cur not in decision:
print("输入有误,请重新输入")
return self.make_decision()
return self.cur
class Referee:
def __init__(self,robot,user):
self.robot = robot
self.user = user
self.cur_res = None
self.robot_score = 0
self.user_score = 0
self.cur_count = 1
def input_count(self):
try:
self.count = int(input('请输入局数(奇数):'))
except:
print('输入有误,请再次输入')
return self.input_count()
if self.count % 2 != 0 and self.count > 0:
return self.count
else:
print('输入有误,请再次输入')
return self.input_count()
def who_win(self):
if self.robot.cur == self.user.cur:
self.cur_res = '平局'
elif (self.user.cur == '石头' and self.robot.cur == '剪刀') or \
(self.user.cur == '剪刀' and self.robot.cur == '布')or \
(self.user.cur == '布' and self.robot.cur == '石头'):
self.cur_res = '您胜利了'
self.user_score += 1
else:
self.cur_res = '您输了'
self.robot_score += 1
self.cur_count += 1
def is_finish(self):
win_score = self.count // 2 + 1
if self.robot_score == win_score or self.user_score == win_score:
return 1
else: return 0
def get_result(self):
if self.robot_score > self.user_score:
return "电脑"
else:
return "你"
if __name__ == '__main__':
robot = Robot() # 创建机器人对象
user = User() # 创建用户对象
referee = Referee(robot,user) #创建裁判对象
count = referee.input_count()
print('选择规则为{}局{}胜'.format(count,count//2+1))
is_start = True
while(is_start):
print('*'*25+'当前为第{}局'.format(referee.cur_count)+'*'*25)
user_decision = user.make_decision() # 用户做出选择
robot_decision = robot.make_decision() # 电脑做出选择
print('你选择出:{}\n电脑选择出:{}'.format(user.cur,robot.cur))
referee.who_win() # 判断赢家
print('结果:{}'.format(referee.cur_res))
print('电脑得分:您的得分 = {}:{}'.format(referee.robot_score,\
referee.user_score))
is_finish = referee.is_finish()
if referee.is_finish(): # 判断是否有一方达到结束条件
result = referee.get_result()
is_start = False
print('*'*25+'比赛结束'+'*'*25)
print('*'*25+'获胜方为:'+result+'*'*25)