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 timeimport osfrom 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之间的正数。】') continueelse: 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('t',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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章: