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中对于电子屏的展示效果也不如windowscmd中展示的效果俱佳。因此运行程序是请在windows命令行中运行。
二,红绿灯揭示板代码的呈现
importtime importos fromcoloramaimportinit,Fore,Back,Style #命令行模式字体颜色初始化 init(autoreset=True) #电子屏类 classLight: #构造函数 def__init__(self): self.light=[]#存储行列数组的集合 #自动初始化 self.prepare_light() defprepare_light(self): """ 电子屏的创建 python中没有数组.因此通过类,函数来创建数组得到一个20行10列的数组 :return: """ forrowinrange(20):#20行 temp=[]#临时存储每行10个圈 forcolinrange(10):#10列 temp.append(False)#默认灯都是不亮的因此通过布尔类型的False表示不亮的状态 #把行列排的200个灯的状态存入到light集合中 self.light.append(temp) #红绿灯类 classTraffic_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()#创建第二个电子屏 #红黄绿等时间倒计时函数 defcountdown(self): whileTrue: #流程:清屏-->打印完后-->暂停1秒钟-->清屏-->数字减一后再打印-->再暂停1秒钟-->清屏-->再数字减一打印 fornumberinrange(self.green_time,-1,-1): #第一个-1代表取值到0,如果设置0则取值取不到0.第二个-1代表数字减一 os.system("cls")#清屏 self.start_display(number,"green")#调用start_display函数传数字及颜色 time.sleep(1)#停止一秒钟 #黄灯倒计时 fornumberinrange(self.yellow_time,-1,-1): os.system("cls")#清屏 self.start_display(number,"yellow") time.sleep(1)#停止一秒钟 #红灯倒计时 fornumberinrange(self.red_time,-1,-1):#第一个-1代表取值到0,如果设置0则取值取不到0.第二个-1代表数字减一 os.system("cls")#清屏 self.start_display(number,"red") time.sleep(1)#停止一秒钟 @staticmethod#静态方法不需要初始化 definput_time(color:str): #设置全局变量(便于静态方法使用) time="" whileTrue: ifcolor.lower()in["green","绿色","绿","绿灯"]: print(Fore.GREEN+"请输入绿灯的时间:",end="")#实现打印字体呈现颜色效果 time=input() ifcolor.lower()in["yellow","黄色","黄","黄灯"]: print(Fore.YELLOW+"请输入黄灯的时间:",end="") time=input() ifcolor.lower()in["red","红色","红","红灯"]: print(Fore.RED+"请输入红灯的时间:",end="") time=input() #校验输入的是否合规 ifnottime.isdigit(): print("输入的值不符合要求。【要求:必须是1-99之间的正数。】") continue else: time_number=int(time)#因为time是字符串.拿到数字后转成Int类型再判断 iftime_number<1ortime_number>99: print("输入的值不符合要求。【要求:必须是1-99之间的正数。】") continue else: returntime_number defbuild_LED_number(self,char:str): """ :paramchar:LED灯数字的构造 :return:返回temp_LED这个数组 """ temp_LED=Light()#临时创建新的数组 ifchar=="0":#构造0 forrowinrange(20): forcolinrange(10): ifrow<2:#最上面两列 temp_LED.light[row][col]=True ifrow>17:#最下面两列 temp_LED.light[row][col]=True ifcol<2:#最左边两列 temp_LED.light[row][col]=True ifcol>7:#最后面两列 temp_LED.light[row][col]=True elifchar=="1":#构造1 forrowinrange(20): forcolinrange(10): ifcol>7:#最后面两列 temp_LED.light[row][col]=True elifchar=="2":#构造2 forrowinrange(20): forcolinrange(10): ifrow<2:#最上面两列 temp_LED.light[row][col]=True ifcol>7androw<9:#最后面两列 temp_LED.light[row][col]=True ifrow==9orrow==10:#中间两行 temp_LED.light[row][col]=True ifcol<2androw>10:#左边列 temp_LED.light[row][col]=True ifrow>17:#最下面两列 temp_LED.light[row][col]=True elifchar=="3":#构造3 forrowinrange(20): forcolinrange(10): ifrow<2:#最上面两列 temp_LED.light[row][col]=True ifcol>7:#最后面两列 temp_LED.light[row][col]=True ifrow==9orrow==10:#中间两行 temp_LED.light[row][col]=True ifrow>17:#最下面两列 temp_LED.light[row][col]=True elifchar=="4":#构造4 forrowinrange(20): forcolinrange(10): ifcol<2androw<9:#最上面两列 temp_LED.light[row][col]=True ifcol>7:#最后面两列 temp_LED.light[row][col]=True ifrow==9orrow==10:#中间两行 temp_LED.light[row][col]=True elifchar=="5":#构造5 forrowinrange(20): forcolinrange(10): ifrow<2: temp_LED.light[row][col]=True ifcol<2androw<9: temp_LED.light[row][col]=True ifrow==9orrow==10: temp_LED.light[row][col]=True ifcol>7androw>10: temp_LED.light[row][col]=True ifrow>17: temp_LED.light[row][col]=True elifchar=="6":#构造6 forrowinrange(20): forcolinrange(10): ifrow<2: temp_LED.light[row][col]=True ifcol<2: temp_LED.light[row][col]=True ifrow==9orrow==10: temp_LED.light[row][col]=True ifcol>7androw>10: temp_LED.light[row][col]=True ifrow>17: temp_LED.light[row][col]=True elifchar=="7":#构造7 forrowinrange(20): forcolinrange(10): ifrow<2: temp_LED.light[row][col]=True ifcol>7: temp_LED.light[row][col]=True elifchar=="8":#构造8 forrowinrange(20): forcolinrange(10): ifrow<2:#最上面两列 temp_LED.light[row][col]=True ifrow>17:#最下面两列 temp_LED.light[row][col]=True ifrow==9orrow==10:#中间两行 temp_LED.light[row][col]=True ifcol<2:#最左边两列 temp_LED.light[row][col]=True ifcol>7:#最后面两列 temp_LED.light[row][col]=True elifchar=="9":#构造9 forrowinrange(20): forcolinrange(10): ifrow<2:#最上面两列 temp_LED.light[row][col]=True ifcol<2androw<9: temp_LED.light[row][col]=True ifrow>17:#最下面两列 temp_LED.light[row][col]=True ifrow==9orrow==10:#中间两行 temp_LED.light[row][col]=True ifcol>7:#最后面两列 temp_LED.light[row][col]=True #返回值 returntemp_LED defprint_LED(self,color:str): forrowinrange(20): #打印第一个数 forcol01inrange(10): ifself.number01.light[row][col01]==True: ifcolor=="green": print(Fore.GREEN+"●",end="") elifcolor=="yellow": print(Fore.YELLOW+"●",end="") elifcolor=="red": print(Fore.RED+"●",end="") else: print("",end="")#两个全角空格注释:○占用的字符相当于两个全角空格的占位 print("\t",end="") #打印第二个数 forcol02inrange(10): ifself.number02.light[row][col02]==True: ifcolor=="green": print(Fore.GREEN+"●",end="") elifcolor=="yellow": print(Fore.YELLOW+"●",end="") elifcolor=="red": print(Fore.RED+"●",end="") else: print("",end="") #换行 print() defstart_display(self,number:int,color:str): """ 电子屏展示 :paramnumber:电子屏上展示的数字 :paramcolor:电子屏上展示的颜色 :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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。