利用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!