• 【Python】类的组合案例(模拟街道红绿灯)


    一,红绿灯揭示板案例思路

    1. 创建Traffic_light红绿灯类
    (1)静态属性 :
    <1> 绿灯时间,<2> 黄灯时间 , <3> 红灯时间, <4> 两块显示时间的电子屏
    
    (2)动态属性
    <1> 输入红黄绿时间函数(静态函数),<2> 红黄绿时间倒计时函数 ,
    <3> 构造电子屏数字的显示函数,<4> 显示两块电子屏绑定两位数的显示函数
    <5> 实例化对象展示电子屏函数
    
    2. 电子屏类的创建(Light): 
    python中没有数组,因此自己创建函数把获取到的值存放到数组中
    (存放内容: 20行,10列的布尔值)
    
    3. input_time(color:str)函数的创建
    <1>  导入colorama包并初始化实现windows命令行下颜色字体打印效果
    <2>  输入红黄绿时间的字体成对应的颜色
    <3>  通过colorama类方法实现输入的红黄绿时间为对应的颜色展示
    <4>  对输入的数字进行校验(必须为1-99之间的正数。因为一块电子屏只记录一位数字)
    <5>  返回相应的值
    
    4. Countdown数字倒计时函数的创建 
    <1>  通过while循环让三个灯的状态一直循环持续
    <2>  对于红黄绿灯输入的数字进行递减打印流程如下
          #流程: 清屏-->打印完后 -->暂停1秒钟-->清屏 -->数字减一后再打印-->再暂停1秒钟-->清屏-->再数字减一打印
    <3> 导入time,os,colorama等需要的包
         
    5.build_LED_number函数的创建 
    之前创建的电子屏是默认False的状态。分别构造0-9的状态在电子屏中True的状态的显示
    
    6.print_LED函数的创建
    两块电子屏,分别显示输入时间的第一位和第二位数字.如果数字为单数则前面用零补齐的方法显示。两块屏并排显示每一位数字,从而展示电子版的效果
    
    7.注意事项:
    因为我们用到了os,及colorama类。所以最终效果的展示不是在pycharm中展示。而是在windows的cmd命令行中展示。
    
    原因是因为我们代码中调用了os.system("cls")这个清屏命令。在pycharm中是很难做到清屏的效果。
    
    另外在pycharm中对于电子屏的展示效果也不如windows cmd中展示的效果俱佳。因此运行程序是请在windows命令行中运行。

     

    二,红绿灯揭示板代码的呈现

    import time
    import os
    from colorama import init,Fore,Back,Style
    #命令行模式字体颜色初始化
    init(autoreset=True)
    
    #电子屏类
    class Light:
        #构造函数
        def __init__(self):
            self.light = [] #存储行列数组的集合
    
            #自动初始化
            self.prepare_light()
    
        def prepare_light(self):
            """
            电子屏的创建
            python中没有数组.因此通过类,函数来创建数组得到一个20行10列的数组
            :return:
            """
            for row in range(20): #20行
                temp = [] # 临时存储每行10个圈
                for col in range(10): #10列
                    temp.append(False)  #默认灯都是不亮的因此通过布尔类型的False表示不亮的状态
                #把行列排的200个灯的状态存入到light集合中
                self.light.append(temp)
    
    #红绿灯类
    class Traffic_light:
        #构造函数,静态属性
        def __init__(self,green_time,yellow_time,rea_time):
            self.green_time = green_time  #绿灯时间
            self.yellow_time = yellow_time #黄灯时间
            self.red_time = rea_time  #红灯时间
    
            #通过类的组合调用Light类函数
            self.number01 = Light() #创建第一个电子屏
            self.number02 = Light() #创建第二个电子屏
    
        #红黄绿等时间倒计时函数
        def countdown(self):
            while True:
                #流程: 清屏-->打印完后 -->暂停1秒钟-->清屏 -->数字减一后再打印-->再暂停1秒钟-->清屏-->再数字减一打印
                for number in range(self.green_time,-1,-1):
                    #第一个-1代表取值到0,如果设置0则取值取不到0.第二个-1代表数字减一
                    os.system("cls") #清屏
                    self.start_display(number,"green") #调用start_display函数传数字及颜色
                    time.sleep(1) #停止一秒钟
    
            # 黄灯倒计时
                for number in range(self.yellow_time,-1,-1):
                    os.system("cls") #清屏
                    self.start_display(number,"yellow")
                    time.sleep(1) #停止一秒钟
    
    
            # 红灯倒计时
                for number in range(self.red_time,-1,-1):#第一个-1代表取值到0,如果设置0则取值取不到0.第二个-1代表数字减一
                    os.system("cls") #清屏
                    self.start_display(number,"red")
                    time.sleep(1) #停止一秒钟
    
        @staticmethod   #静态方法不需要初始化
        def input_time(color:str):
            # 设置全局变量(便于静态方法使用)
            time = ""
            while True:
                if color.lower() in ["green","绿色","绿","绿灯"]:
                    print(Fore.GREEN + "请输入绿灯的时间:",end="") #实现打印字体呈现颜色效果
                    time = input()
                if color.lower() in ["yellow", "黄色", "", "黄灯"]:
                    print(Fore.YELLOW + "请输入黄灯的时间:", end="")
                    time = input()
                if color.lower() in ["red", "红色", "", "红灯"]:
                    print(Fore.RED + "请输入红灯的时间:", end="")
                    time = input()
    
                #校验输入的是否合规
                if not time.isdigit():
                    print("输入的值不符合要求。【要求:必须是1-99之间的正数。】")
                    continue
                else:
                    time_number = int(time) # 因为time是字符串.拿到数字后转成Int类型再判断
                    if time_number < 1 or time_number > 99:
                        print("输入的值不符合要求。【要求:必须是1-99之间的正数。】")
                        continue
                    else:
                        return time_number
    
        def build_LED_number(self,char:str):
            """
            :param char: LED灯数字的构造
            :return: 返回temp_LED这个数组
            """
            temp_LED = Light() #临时创建新的数组
    
            if char == "0": #构造0
                for row in range(20):
                    for col in range(10):
                        if row < 2: #最上面两列
                            temp_LED.light[row][col] = True
                        if row > 17: #最下面两列
                            temp_LED.light[row][col] = True
                        if col < 2:#最左边两列
                            temp_LED.light[row][col] = True
                        if col > 7: #最后面两列
                            temp_LED.light[row][col] = True
    
            elif char == "1": #构造1
                for row in range(20):
                    for col in range(10):
                        if col > 7: #最后面两列
                            temp_LED.light[row][col] = True
    
            elif char == "2": #构造2
                for row in range(20):
                    for col in range(10):
                        if row < 2:  # 最上面两列
                            temp_LED.light[row][col] = True
                        if col > 7 and row < 9:  # 最后面两列
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:  # 中间两行
                            temp_LED.light[row][col] = True
    
                        if col < 2 and row >10: #左边列
                            temp_LED.light[row][col] = True
                        if row > 17:  # 最下面两列
                            temp_LED.light[row][col] = True
            elif char == "3": #构造3
                for row in range(20):
                    for col in range(10):
                        if row < 2:  # 最上面两列
                            temp_LED.light[row][col] = True
                        if col > 7 :  # 最后面两列
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:  # 中间两行
                            temp_LED.light[row][col] = True
                        if row > 17:  # 最下面两列
                            temp_LED.light[row][col] = True
            elif char == "4":  # 构造4
                for row in range(20):
                    for col in range(10):
                        if col < 2 and row <9:  # 最上面两列
                            temp_LED.light[row][col] = True
                        if col > 7:  # 最后面两列
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:  # 中间两行
                            temp_LED.light[row][col] = True
            elif char == "5":  # 构造5
                for row in range(20):
                    for col in range(10):
                        if row < 2:
                            temp_LED.light[row][col] = True
                        if col < 2 and row < 9:
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:
                            temp_LED.light[row][col] = True
                        if col > 7 and row > 10:
                            temp_LED.light[row][col] = True
                        if row > 17:
                            temp_LED.light[row][col] = True
            elif char == "6":  # 构造6
                for row in range(20):
                    for col in range(10):
                        if row < 2:
                            temp_LED.light[row][col] = True
                        if col < 2:
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:
                            temp_LED.light[row][col] = True
                        if col > 7 and row > 10:
                            temp_LED.light[row][col] = True
                        if row > 17:
                            temp_LED.light[row][col] = True
            elif char == "7":  # 构造7
                for row in range(20):
                    for col in range(10):
                        if row < 2:
                            temp_LED.light[row][col] = True
                        if col > 7:
                            temp_LED.light[row][col] = True
    
    
            elif char == "8": #构造8
                for row in range(20):
                    for col in range(10):
                        if row < 2: #最上面两列
                            temp_LED.light[row][col] = True
                        if row > 17: #最下面两列
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:  # 中间两行
                            temp_LED.light[row][col] = True
                        if col < 2:#最左边两列
                            temp_LED.light[row][col] = True
                        if col > 7: #最后面两列
                            temp_LED.light[row][col] = True
    
            elif char == "9":  # 构造9
                for row in range(20):
                    for col in range(10):
                        if row < 2:  # 最上面两列
                            temp_LED.light[row][col] = True
                        if col < 2 and row < 9:
                            temp_LED.light[row][col] = True
                        if row > 17:  # 最下面两列
                            temp_LED.light[row][col] = True
                        if row == 9 or row == 10:  # 中间两行
                            temp_LED.light[row][col] = True
                        if col > 7:  # 最后面两列
                            temp_LED.light[row][col] = True
    
            #返回值
            return temp_LED
    
        def print_LED(self,color:str):
            for row in range(20):
                #打印第一个数
                for col01 in range(10):
                    if self.number01.light[row][col01] == True:
                        if color == "green":
                            print(Fore.GREEN + "",end="")
                        elif color == "yellow":
                            print(Fore.YELLOW + "",end="")
                        elif color == "red":
                            print(Fore.RED + "",end="")
                    else:
                        print("  ",end="") # 两个全角空格 注释:○占用的字符相当于两个全角空格的占位
                print("	",end="")
                #打印第二个数
                for col02 in range(10):
                    if self.number02.light[row][col02] == True:
                        if color == "green":
                            print(Fore.GREEN + "",end="")
                        elif color == "yellow":
                            print(Fore.YELLOW + "",end="")
                        elif color == "red":
                            print(Fore.RED + "",end="")
                    else:
                        print("  ",end="")
                #换行
                print()
    
        def start_display(self,number:int,color:str):
            """
            电子屏展示
            :param number:电子屏上展示的数字
            :param color: 电子屏上展示的颜色
            :return:
            """
            number_str = "%02d" % number #传进来的数字2位显示
            self.number01 = self.build_LED_number(number_str[0]) #把数字的第一位给第一个电子屏
            self.number02 = self.build_LED_number(number_str[1]) #把数字的第二位给第二个电子屏
    
            #在电子屏上显示
            self.print_LED(color)
    
    if __name__ == "__main__":
       green_time = Traffic_light.input_time("绿灯")
       yellow_time = Traffic_light.input_time("黄灯")
       red_time = Traffic_light.input_time("红灯")
    
       #实例化
       traffic01 = Traffic_light(green_time,yellow_time,red_time)
       traffic01.countdown()
  • 相关阅读:
    让你的App飞一会
    Event in Backbone
    Event in Zepto
    【不怕坑】之 Node.js加密 C#解密
    结对项目:日程管理(四)
    结对项目:日程管理(三)
    结对项目:日程管理(二)
    结对项目:日程管理(一)
    当代大学生的痛点
    软件需求分析
  • 原文地址:https://www.cnblogs.com/liupengpengg/p/12882800.html
Copyright © 2020-2023  润新知