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统计日志ip访问数的方法
Jul 06 Python
python用户管理系统的实例讲解
Dec 23 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
python的内存管理和垃圾回收机制详解
May 18 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
python实现UDP协议下的文件传输
Mar 20 Python
python列表的逆序遍历实现
Apr 20 Python
python的Jenkins接口调用方式
May 12 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
python实现图片转字符画的完整代码
Feb 21 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
python简单获取数组元素个数的方法
2015/07/13 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
初中作文评语大全
2014/04/23 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
服务员态度差检讨书
2014/10/28 职场文书
先进个人推荐材料
2014/12/29 职场文书
个人求职意向书
2015/05/11 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
nginx常用配置conf的示例代码详解
2022/03/21 Servers