利用Python實現電影訂票系統

一、效果展示

通過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('+============================+')
 
 
# 實例化 Controller 類
s = Controller(infos)

到此這篇關於利用Python實現電影訂票系統的文章就介紹到這瞭,更多相關Python電影訂票系統內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: