用Python做一个电影订票系统

简介: 大家好,今天咱们一起来实现一个简易的电影订票系统,所谓麻雀虽小五脏俱全,跟着完成下来还是能学习到很多知识的

一、效果展示


通过Python实现一个电影订票系统,效果如下所示:



31.png

文章链接


二、整体结构图


32.png


三、代码分解


3.1 infos.py


一部电影的详细信息适合用 字典 结构来存储,我们可以给字典里添加多个键值对来保存电影的名称、座位表和宣传时用的字符画,比如电影《泰坦尼克号》的详细信息就可以按下面的形式保存到字典 titanic 中:


infos = [
  {
    'name': '泰坦尼克号',
    'symbol': '''
+==================== 泰坦尼克号 =====================+
  ▄▄▄▄▄▪   ▄▄▄▄▄  ▄▄▄·   ▐ ▄ ▪      ▄▄· 
  •██   ██  •██   ▐█ ▀█  •█▌▐█  ██  ▐█ ▌▪
  ▐█.▪ ▐█·  ▐█. ▪▄█▀▀█  ▐█▐▐▌  ▐█· ██ ▄▄
  ▐█▌ ·▐█▌  ▐█▌· ▐█ ▪▐▌ ██▐█▌  ▐█▌ ▐███▌
  ▀▀▀  ▀▀▀  ▀▀▀   ▀  ▀  ▀▀ █  ▪▀▀▀ ·▀▀▀ 
+===================== Titanic =====================+
''',
    'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '●', '○', '○', '●'],
              ['○', '○', '●', '○', '●', '○', '○', '○'],
              ['○', '○', '●', '○', '○', '○', '○', '●'],
              ['○', '○', '●', '○', '○', '○', '●', '○'],
              ['●', '○', '○', '○', '●', '●', '●', '●']]
  },
  {
    'name': '雨人',
    'symbol': '''
+====================== 雨人 =======================+
  ,---.    .--.  ,-..-. .-.           .--.  .-. .-. 
  | .-.\  / /\ \ |(||  \| | |\    /| / /\ \ |  \| | 
  | `-'/ / /__\ \(_)|   | | |(\  / |/ /__\ \|   | | 
  |   (  |  __  || || |\  | (_)\/  ||  __  || |\  | 
  | |\ \ | |  |)|| || | |)| | \  / || |  |)|| | |)| 
  |_| \)\|_|  (_)`-'/(  (_) | |\/| ||_|  (_)/(  (_) 
      (__)         (__)     '-'  '-'       (__)     
+===================== Rain Man ====================+
''',
    'seats': [['○', '○', '○', '○', '●', '○', '○', '●'],
              ['○', '○', '○', '●', '●', '○', '○', '○'],
              ['○', '●', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '●', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '○']]
  },
  {
    'name': '卡门',
    'symbol': '''
+======================= 卡门 =======================+
  ▄█▄    ██   █▄▄▄▄ █▀▄▀█ ▄███▄      ▄   
  █▀ ▀▄  █ █  █  ▄▀ █ █ █ █▀   ▀      █  
  █   ▀  █▄▄█ █▀▀▌  █ ▄ █ ██▄▄    ██   █ 
  █▄  ▄▀ █  █ █  █  █   █ █▄   ▄▀ █ █  █ 
  ▀███▀     █   █      █  ▀███▀   █  █ █ 
            █   ▀      ▀           █   ██ 
+====================== Carmen =====================+
''',
    'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '●', '●', '○', '○', '●', '●'],
              ['○', '○', '○', '○', '○', '○', '●', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '●', '○', '○', '○', '●']]
  },
  {
    'name': '机器人总动员',
    'symbol': '''
+==================== 机器人总动员 ===================+
   (`\ .-') /`  ('-.                           ('-.   
    `.( OO ),' ( OO ).-.                     _(  OO)  
 ,--./  .--.   / . --. / ,--.      ,--.     (,------. 
 |      |  |   | \-.  \  |  |.-')  |  |.-')  |  .---' 
 |  |   |  |,.-'-'  |  | |  | OO ) |  | OO ) |  |     
 |  |.'.|  |_)\| |_.'  | |  |`-' | |  |`-' |(|  '--.  
 |         |   |  .-.  |(|  '---.'(|  '---.' |  .--'  
 |   ,'.   |   |  | |  | |      |  |      |  |  `---. 
 '--'   '--'   `--' `--' `------'  `------'  `------'  
+====================== WALL·E =====================+
''',
    'seats': [['●', '○', '○', '○', '○', '○', '○', '○'],
              ['●', '○', '○', '○', '○', '○', '○', '●'],
              ['○', '○', '●', '○', '●', '○', '●', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '●'],
              ['○', '○', '○', '○', '●', '○', '○', '○'],
              ['●', '●', '○', '○', '○', '●', '○', '○']]
  },
  {
    'name': '黑客帝国',
    'symbol': '''
+===================== 黑客帝国 =====================+
   ________            __  ___      __       _     
  /_  __/ /_  ___     /  |/  /___ _/ /______(_)  __
   / / / __ \/ _ \   / /|_/ / __ `/ __/ ___/ / |/_/
  / / / / / /  __/  / /  / / /_/ / /_/ /  / />  <  
 /_/ /_/ /_/\___/  /_/  /_/\__,_/\__/_/  /_/_/|_|  
+==================== The Matrix ===================+
''',
    'seats': [['○', '●', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '●', '●', '○', '○', '●'],
              ['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '○'],
              ['○', '○', '○', '○', '○', '○', '○', '●'],
              ['○', '○', '●', '○', '○', '○', '○', '○']]
  },
]


3.2 seat_book.py


选座系统,需要实现下面这两样需求:

  • 展示所有座位的预订状态,方便用户查看哪些座位还可以预订;
  • 根据用户输入的座位号完成预订。

可以把选座系统抽象成一个类:SeatBooking,这个类包含了两种方法,check_bookings() 用于展示所有座位的预订状态,book_seat() 用于完成预订。


import time
class SeatBooking:
  # 展示所有座位的预订信息
  def check_bookings(self, seats):
    print("正在为您查询该场次电影的预订状态...")
    time.sleep(0.7)
    print('从上到下为 1~6 排,从左至右为 1~8 座')
    print("======================")
    for row in seats:
      time.sleep(0.1)
      print('  '.join(row))
    print("======================")
    time.sleep(0.7)
  # 获取符合要求的行索引
  def get_row(self):
    input_row = input("预订第几排的座位呢?请输入 1~6 之间的数字")
    valid_row = [str(i + 1) for i in range(6)]
    while input_row not in valid_row:
      input_row = input('没有按要求输入哦,请输入 1~6 之间的数字')
    row = int(input_row) - 1
    return row
  # 获取符合要求的列索引
  def get_col(self):
    input_column = input('预订这一排的第几座呢?请输入 1~8 之间的数字')
    valid_column = [str(i + 1) for i in range(8)]
    while input_column not in valid_column:
      input_column = input('没有按要求输入哦,请输入 1~8 之间的数字')
    column = int(input_column) - 1
    return column
  # 预订指定座位
  def book_seat(self, seats):
    while True:
      row = self.get_row()
      column = self.get_col()
      # 指定座位没有被预订
      if seats[row][column] == '○':
        print("正在为您预订指定座位...")
        time.sleep(0.7)
        seats[row][column] = '●'
        print("预订成功!座位号:{}排{}座".format(row + 1, column + 1))
        break  # 结束循环,退出选座
      # 指定座位已经被预订了
      else:
        print("这个座位已经被预订了哦,试试别的吧")
        time.sleep(0.7)
  # 预订最靠前的座位
  def book_seat_at_front(self, seats):
    print("正在为您预订最靠前的座位...")
    time.sleep(0.7)
    # 外循环:遍历 seats 的行
    for row in range(6):
      # 内循环:遍历 seats 的列
      for column in range(8):
        # 若碰到没有被预订的座位
        if seats[row][column] == '○':
          seats[row][column] = '●' # 预订该座位
          print("预订成功!座位号:{}排{}座".format(row + 1, column + 1))
          return # 结束函数的执行,返回到它被调用的地方
    # 没有在循环内部结束程序,说明不存在没有被预订的座位
    print("非常抱歉🥺,所有座位都被订满了,无法为您保留座位")

3.3 film_selector.py

先来解决ling一项任务:电影选择系统。出于人性化考虑,我们希望用户既可以输入序号选择观看电影,也可以输入 x 选择退出系统。为此,我们需要完成下面两样需求:

  • 和选座系统一样,我们可以把“选择电影场次”功能抽象成一个类,称为 电影选择系统。
  • 而根据用户选择,预订某一场次的座位,实际上是先调用 电影选择系统 选择电影,再调用 选座系统 预订座位。这中间涉及到多次类的实例化与方法调用,为了更清晰地组织代码,我们将这部分内容也抽象成一个类,称为 控制系统。
import time
class FilmSelector:
  # 展示所有可选项
  def display_options(self, films):
    print("今日影院排片列表:")
    print('+================+')
    # 按行打印每部电影
    for i in range(len(films)):
      print('{} - {}'.format(i + 1, films[i]['name']))
      time.sleep(0.2)
    # 打印退出选项
    print('x - 退出')
    print('+================+')
    time.sleep(0.7)
  # 获取用户的选择
  def get_choice(self, films):
    # 符合要求的输入列表
    valid_choice = [str(i + 1) for i in range(len(films))]
    valid_choice.append('x')
    choice = input('你的选择是?')
    # 当不符合要求时,循环获取新的选项
    while choice not in valid_choice:
      choice = input('没有按照要求输入哦,请重新输入')
    # 返回用户做出的选择
    return choice

3.4 main.py

import time
from infos import infos
from film_selector import FilmSelector
from seat_booking import SeatBooking
class Controller:
  def __init__(self, infos):
    self.films = infos  # 电影库所有电影
    # 打印欢迎语
    self.welcome()
    # 用户选择想观看的电影
    self.choose_film()
    # 根据用户选择,执行不同流程
    if self.choice != 'x':
      # 为指定场次预订座位
      self.choose_seat()
    # 打印结束语
    self.bye()
  # 用户选择想观看的电影
  def choose_film(self):
    # 实例化 FilmSelector 类
    selector = FilmSelector()
    # 展示所有用户可以选择的选项
    selector.display_options(self.films)
    # 通过 get_choice() 方法获取用户选择
    self.choice = selector.get_choice(self.films)
  # 为指定场次预订座位
  def choose_seat(self):
    # 取出用户所选择的电影
    film = self.films[int(self.choice) - 1]
    # 取出所选择电影的电影名、座位表、宣传画
    name = film['name']
    seats_list = film['seats']
    symbol = film['symbol']
    # 打印提示信息和电影宣传画
    print('正在为您预订电影《{}》的座位...'.format(name))
    time.sleep(0.7)
    print(symbol)
    time.sleep(0.7)
    # 打印预订座位的方法列表
    print('支持的座位预订方式如下:')
    time.sleep(0.7)
    print('+==========================+')
    print("1 - 指定行列号预定座位")
    print("2 - 给我预订一个最靠前的座位!")
    print('+==========================+')
    time.sleep(0.7)
    print('')
    # 获取座位预订方式
    method = input('请选择座位预订方式')
    # 定义符合要求输入列表 valid_method
    valid_method = ['1','2']
    # 当不符合要求时,循环获取新的选项
    while method not in valid_method:
      method = input('没有按照要求输入哦,请重新输入')
    # 实例化 SeatBooking 类
    booking = SeatBooking()
    # 打印所有座位的预订信息
    booking.check_bookings(seats_list)
    # 方法 1:指定行列号
    if method == '1':
      booking.book_seat(seats_list)
    # 方法 2:预订最靠前的座位
    else:
      booking.book_seat_at_front(seats_list)
  # 打印欢迎语
  def welcome(self):
    print('+============================+')
    print('+      欢迎来到时光电影院       +')
    print('+============================+')
    print('')
    time.sleep(0.7)
  # 打印结束语
  def bye(self):
    print('')
    time.sleep(0.7)
    print('+============================+')
    print('+    已经退出系统,下次见!👋    +')
    print('+============================+')
# 实例化 Controller 类
s = Controller(infos)


如果本文对你有帮助的话,请不要吝啬你的赞,谢谢!

相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
173 55
|
1月前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品安全追溯系统的深度学习模型
使用Python实现智能食品安全追溯系统的深度学习模型
65 4
|
2天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
90 66
|
24天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
129 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
4天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
36 5
|
25天前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
37 4
基于Python深度学习的果蔬识别系统实现
|
2月前
|
机器学习/深度学习 传感器 存储
使用 Python 实现智能地震预警系统
使用 Python 实现智能地震预警系统
142 61
|
1月前
|
弹性计算 数据管理 数据库
从零开始构建员工管理系统:Python与SQLite3的完美结合
本文介绍如何使用Python和Tkinter构建一个图形界面的员工管理系统(EMS)。系统包括数据库设计、核心功能实现和图形用户界面创建。主要功能有查询、添加、删除员工信息及统计员工数量。通过本文,你将学会如何结合SQLite数据库进行数据管理,并使用Tkinter创建友好的用户界面。
69 2
从零开始构建员工管理系统:Python与SQLite3的完美结合
|
1月前
|
Python
Python之音乐专辑管理系统
音乐专辑管理系统是一款用于管理和维护音乐专辑信息的应用程序,支持添加、删除、修改和查询专辑详情(如专辑名、艺术家、发行日期及曲目列表)。系统运行需Python 3.x环境,硬件要求较低,适合个人及小型团队使用。
60 4
|
1月前
|
Python
Python实现摇号系统
本文介绍了如何使用Python构建一个简单的摇号系统,包括用户输入、随机抽取、结果展示和日志记录等功能。通过导入`random`、`datetime`和`logging`模块,实现了从参与者名单中随机抽取中奖者,并记录每次摇号的结果,方便后续查看和审计。完整代码示例提供了从功能实现到主程序调用的全过程。
37 2