一、效果展示
通过Python实现一个电影订票系统,效果如下所示:
 
 
   二、整体结构图
 
 
   三、代码分解
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('+============================+')
      
     
- 
     
      
     
     
       
      
     
- 
     
      
     
     
      
        <br/># 实例化 Controller 类
      
     
- 
     
      
     
     
      
       s = Controller(infos)
      
     
  就分享到这里了,赶快上手试试吧!
转载:https://blog.csdn.net/longz_org_cn/article/details/129091594
查看评论
					 
					