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 和 lint 删除项目无用资源的方法
Dec 20 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
简单了解Python3里的一些新特性
Jul 13 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
基于python检查矩阵计算结果
May 21 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
Python Tornado核心及相关原理详解
Jun 24 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
Python使用DFA算法过滤内容敏感词
Apr 22 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实现用户在线时间统计详解
2011/10/08 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
jQuery.holdReady()使用方法
2014/05/20 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python和opencv实现抠图
2018/07/18 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python中按值来获取指定的键
2019/03/04 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
网络教育自我鉴定
2014/02/04 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
家长意见书
2015/06/04 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
工作后的感想
2015/08/07 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript