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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。