Python通过类的组合模拟街道红绿灯


Posted in Python onSeptember 16, 2020

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

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("\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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 Python
python 3.6.7实现端口扫描器
Sep 04 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
如何在sublime编辑器中安装python
May 20 Python
Python pyecharts绘制条形图详解
Apr 02 Python
python如何绘制疫情图
Sep 16 #Python
如何用Python绘制3D柱形图
Sep 16 #Python
Python Merge函数原理及用法解析
Sep 16 #Python
简单了解Python字典copy与赋值的区别
Sep 16 #Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 #Python
pycharm2020.2 配置使用的方法详解
Sep 16 #Python
python Matplotlib模块的使用
Sep 16 #Python
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
PHP经典面试题集锦
2015/03/19 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python实现RSA加密(解密)算法
2016/02/17 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
python变量的存储原理详解
2019/07/10 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python文件操作方法详解
2020/02/09 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
数据库连接池的工作原理
2012/09/26 面试题
法学院毕业生求职信
2014/06/25 职场文书
工程项目合作意向书
2015/05/08 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
详细介绍python类及类的用法
2021/05/31 Python