一、设计思路

本文打算构造三个类,分别为用户类(User),电脑类(Robot),以及裁判类(Referee)来实现剪刀石头布游戏的核心逻辑。
用户类(User):实现读取用户的选择
电脑类(Robot):实现电脑随机做出选择
裁判类(Referee):实现对用户输入的异常处理,以及整个游戏过程中需要的判断以及输出

二、实现过程

2.1 用户类(User)实现

首先初始化属性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

2.2 电脑类(Robot)实现

与用户类相似,初始化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

2.3 裁判类(Referee)实现

裁判类将把用户类(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 "你"

2.3 主程序编写

首先实例化电脑(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)

三、程序运行截图

3.1 输入对局规则

Python 安装 blender库 python blender游戏_游戏

3.2 输入用户选择

Python 安装 blender库 python blender游戏_游戏_02


Python 安装 blender库 python blender游戏_开发语言_03

3.3 整场游戏结果

三局两胜:

Python 安装 blender库 python blender游戏_代码规范_04


五局三胜:

Python 安装 blender库 python blender游戏_Python 安装 blender库_05

3.4 用户错误输入

Python 安装 blender库 python blender游戏_游戏_06


Python 安装 blender库 python blender游戏_代码规范_07

四、程序汇总

# -*- 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)