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入门
May 08 Python
python dlib人脸识别代码实例
Apr 04 Python
【python】matplotlib动态显示详解
Apr 11 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
python 实现任务管理清单案例
Apr 25 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
Python Selenium操作Cookie的实例方法
Feb 28 Python
Matplotlib绘制混淆矩阵的实现
May 27 Python
Python音乐爬虫完美绕过反爬
Aug 30 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
使用php实现截取指定长度
2013/08/06 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php实现简单爬虫的开发
2016/03/28 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
简述jQuery Easyui一些用法
2017/08/01 jQuery
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vue实现图片上传功能
2020/05/28 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
办公室主任职责范文
2013/11/08 职场文书
心得体会怎么写
2013/12/30 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
见习报告的格式
2014/11/04 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
校园广播站开场白
2015/06/01 职场文书
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers