利用Python實(shí)現(xiàn)電影訂票系統(tǒng)
一、效果展示
通過Python實(shí)現(xiàn)一個電影訂票系統(tǒng),效果如下圖所示:

二、整體結(jié)構(gòu)圖

三、代碼分解
3.1 infos.py
一部電影的詳細(xì)信息適合用 字典 結(jié)構(gòu)來存儲,我們可以給字典里添加多個鍵值對來保存電影的名稱、座位表和宣傳時用的字符畫,比如電影《泰坦尼克號》的詳細(xì)信息就可以按下面的形式保存到字典 titanic 中:
infos = [
? {
? ? 'name': '泰坦尼克號',
? ? 'symbol': '''
+==================== 泰坦尼克號 =====================+
? ▄▄▄▄▄? ? ▄▄▄▄▄ ?▄▄▄· ? ? ▄ ? ? ? ?▄▄·?
? ?██ ? ██ ??██ ? ?█ ?█ ??█▌?█ ?██ ??█ ▌?
? ?█.? ?█· ??█. ?▄█??█ ??█??▌ ??█· ██ ▄▄
? ?█▌ ·?█▌ ??█▌· ?█ ??▌ ██?█▌ ??█▌ ?███▌
? ??? ???? ???? ? ? ?? ??? █ ????? ·????
+===================== Titanic =====================+
''',
? ? 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '●', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '●', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '●', '○'],
? ? ? ? ? ? ? ['●', '○', '○', '○', '●', '●', '●', '●']]
? },
? {
? ? 'name': '雨人',
? ? 'symbol': '''
+====================== 雨人 =======================+
? ,---. ? ?.--. ?,-..-. .-. ? ? ? ? ? .--. ?.-. .-.?
? | .-.\ ?/ /\ \ |(|| ?\| | |\ ? ?/| / /\ \ | ?\| |?
? | `-'/ / /__\ \(_)| ? | | |(\ ?/ |/ /__\ \| ? | |?
? | ? ( ?| ?__ ?|| || |\ ?| (_)\/ ?|| ?__ ?|| |\ ?|?
? | |\ \ | | ?|)|| || | |)| | \ ?/ || | ?|)|| | |)|?
? |_| \)\|_| ?(_)`-'/( ?(_) | |\/| ||_| ?(_)/( ?(_)?
? ? ? (__) ? ? ? ? (__) ? ? '-' ?'-' ? ? ? (__) ? ??
+===================== Rain Man ====================+
''',
? ? 'seats': [['○', '○', '○', '○', '●', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '○', '●', '●', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '●', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○']]
? },
? {
? ? 'name': '卡門',
? ? 'symbol': '''
+======================= 卡門 =======================+
? ▄█▄ ? ?██ ? █▄▄▄▄ █?▄?█ ▄███▄ ? ? ?▄ ??
? █? ?▄ ?█ █ ?█ ?▄? █ █ █ █? ? ? ? ? ?█ ?
? █ ? ? ?█▄▄█ █??▌ ?█ ▄ █ ██▄▄ ? ?██ ? █?
? █▄ ?▄? █ ?█ █ ?█ ?█ ? █ █▄ ? ▄? █ █ ?█?
? ?███? ? ? █ ? █ ? ? ?█ ??███? ? █ ?█ █?
? ? ? ? ? ? █ ? ? ? ? ?? ? ? ? ? ? █ ? ██?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
+====================== Carmen =====================+
''',
? ? 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '●', '●', '○', '○', '●', '●'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '●', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '●', '○', '○', '○', '●']]
? },
? {
? ? 'name': '機(jī)器人總動員',
? ? 'symbol': '''
+==================== 機(jī)器人總動員 ===================+
? ?(`\ .-') /` ?('-. ? ? ? ? ? ? ? ? ? ? ? ? ? ('-. ??
? ? `.( OO ),' ( OO ).-. ? ? ? ? ? ? ? ? ? ? _( ?OO) ?
?,--./ ?.--. ? / . --. / ,--. ? ? ?,--. ? ? (,------.?
?| ? ? ?| ?| ? | \-. ?\ ?| ?|.-') ?| ?|.-') ?| ?.---'?
?| ?| ? | ?|,.-'-' ?| ?| | ?| OO ) | ?| OO ) | ?| ? ??
?| ?|.'.| ?|_)\| |_.' ?| | ?|`-' | | ?|`-' |(| ?'--. ?
?| ? ? ? ? | ? | ?.-. ?|(| ?'---.'(| ?'---.' | ?.--' ?
?| ? ,'. ? | ? | ?| | ?| | ? ? ?| ?| ? ? ?| ?| ?`---.?
?'--' ? '--' ? `--' `--' `------' ?`------' ?`------' ?
+====================== WALL·E =====================+
''',
? ? 'seats': [['●', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['●', '○', '○', '○', '○', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '●', '○', '●', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '●', '○', '○', '○'],
? ? ? ? ? ? ? ['●', '●', '○', '○', '○', '●', '○', '○']]
? },
? {
? ? 'name': '黑客帝國',
? ? 'symbol': '''
+===================== 黑客帝國 =====================+
? ?________ ? ? ? ? ? ?__ ?___ ? ? ?__ ? ? ? _ ? ??
? /_ ?__/ /_ ?___ ? ? / ?|/ ?/___ _/ /______(_) ?__
? ?/ / / __ \/ _ \ ? / /|_/ / __ `/ __/ ___/ / |/_/
? / / / / / / ?__/ ?/ / ?/ / /_/ / /_/ / ?/ /> ?< ?
?/_/ /_/ /_/\___/ ?/_/ ?/_/\__,_/\__/_/ ?/_/_/|_| ?
+==================== The Matrix ===================+
''',
? ? 'seats': [['○', '●', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '●', '●', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'],
? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '●'],
? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '○']]
? },
]3.2 seat_book.py
選座系統(tǒng),需要實(shí)現(xiàn)下面這兩樣需求:
- 展示所有座位的預(yù)訂狀態(tài),方便用戶查看哪些座位還可以預(yù)訂;
- 根據(jù)用戶輸入的座位號完成預(yù)訂。
可以把選座系統(tǒng)抽象成一個類:SeatBooking,這個類包含了兩種方法,check_bookings() 用于展示所有座位的預(yù)訂狀態(tài),book_seat() 用于完成預(yù)訂。
import time
?
class SeatBooking:
? # 展示所有座位的預(yù)訂信息
? def check_bookings(self, seats):
? ? print("正在為您查詢該場次電影的預(yù)訂狀態(tài)...")
? ? 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("預(yù)訂第幾排的座位呢?請輸入 1~6 之間的數(shù)字")
? ? valid_row = [str(i + 1) for i in range(6)]
?
? ? while input_row not in valid_row:
? ? ? input_row = input('沒有按要求輸入哦,請輸入 1~6 之間的數(shù)字')
?
? ? row = int(input_row) - 1
? ? return row
??
? # 獲取符合要求的列索引
? def get_col(self):
? ? input_column = input('預(yù)訂這一排的第幾座呢?請輸入 1~8 之間的數(shù)字')
? ? valid_column = [str(i + 1) for i in range(8)]
?
? ? while input_column not in valid_column:
? ? ? input_column = input('沒有按要求輸入哦,請輸入 1~8 之間的數(shù)字')
?
? ? column = int(input_column) - 1
? ? return column
?
? # 預(yù)訂指定座位
? def book_seat(self, seats):
? ? while True:
? ? ? row = self.get_row()
? ? ? column = self.get_col()
? ? ? # 指定座位沒有被預(yù)訂
? ? ? if seats[row][column] == '○':
? ? ? ? print("正在為您預(yù)訂指定座位...")
? ? ? ? time.sleep(0.7)
? ? ? ? seats[row][column] = '●'
? ? ? ? print("預(yù)訂成功!座位號:{}排{}座".format(row + 1, column + 1))
? ? ? ? break ?# 結(jié)束循環(huán),退出選座
? ? ? # 指定座位已經(jīng)被預(yù)訂了
? ? ? else:
? ? ? ? print("這個座位已經(jīng)被預(yù)訂了哦,試試別的吧")
? ? ? ? time.sleep(0.7)
?
? # 預(yù)訂最靠前的座位
? def book_seat_at_front(self, seats):
? ? print("正在為您預(yù)訂最靠前的座位...")
? ? time.sleep(0.7)
? ? # 外循環(huán):遍歷 seats 的行
? ? for row in range(6):
? ? ? # 內(nèi)循環(huán):遍歷 seats 的列
? ? ? for column in range(8):
? ? ? ? # 若碰到?jīng)]有被預(yù)訂的座位
? ? ? ? if seats[row][column] == '○':
? ? ? ? ? seats[row][column] = '●' # 預(yù)訂該座位
? ? ? ? ? print("預(yù)訂成功!座位號:{}排{}座".format(row + 1, column + 1))
? ? ? ? ? return # 結(jié)束函數(shù)的執(zhí)行,返回到它被調(diào)用的地方
? ? # 沒有在循環(huán)內(nèi)部結(jié)束程序,說明不存在沒有被預(yù)訂的座位
? ? print("非常抱歉??,所有座位都被訂滿了,無法為您保留座位")3.3 film_selector.py
先來解決ling一項(xiàng)任務(wù):電影選擇系統(tǒng)。出于人性化考慮,我們希望用戶既可以輸入序號選擇觀看電影,也可以輸入 x 選擇退出系統(tǒng)。為此,我們需要完成下面兩樣需求:
- 和選座系統(tǒng)一樣,我們可以把“選擇電影場次”功能抽象成一個類,稱為 電影選擇系統(tǒng)。
- 而根據(jù)用戶選擇,預(yù)訂某一場次的座位,實(shí)際上是先調(diào)用 電影選擇系統(tǒng) 選擇電影,再調(diào)用 選座系統(tǒng) 預(yù)訂座位。這中間涉及到多次類的實(shí)例化與方法調(diào)用,為了更清晰地組織代碼,我們將這部分內(nèi)容也抽象成一個類,稱為 控制系統(tǒng)。
import time
?
class FilmSelector:
? # 展示所有可選項(xiàng)
? def display_options(self, films):
? ? print("今日影院排片列表:")
? ? print('+================+')
? ? # 按行打印每部電影
? ? for i in range(len(films)):
? ? ? print('{} - {}'.format(i + 1, films[i]['name']))
? ? ? time.sleep(0.2)
? ? # 打印退出選項(xiàng)
? ? 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('你的選擇是?')
? ? # 當(dāng)不符合要求時,循環(huán)獲取新的選項(xiàng)
? ? while choice not in valid_choice:
? ? ? choice = input('沒有按照要求輸入哦,請重新輸入')
? ? # 返回用戶做出的選擇
? ? return choice3.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()
? ? # 根據(jù)用戶選擇,執(zhí)行不同流程
? ? if self.choice != 'x':
? ? ? # 為指定場次預(yù)訂座位
? ? ? self.choose_seat()
? ? # 打印結(jié)束語
? ? self.bye()
?
? # 用戶選擇想觀看的電影
? def choose_film(self):
? ? # 實(shí)例化 FilmSelector 類
? ? selector = FilmSelector()
? ? # 展示所有用戶可以選擇的選項(xiàng)
? ? selector.display_options(self.films)
? ? # 通過 get_choice() 方法獲取用戶選擇
? ? self.choice = selector.get_choice(self.films)
?
? # 為指定場次預(yù)訂座位
? def choose_seat(self):
? ? # 取出用戶所選擇的電影
? ? film = self.films[int(self.choice) - 1]
? ? # 取出所選擇電影的電影名、座位表、宣傳畫
? ? name = film['name']
? ? seats_list = film['seats']
? ? symbol = film['symbol']
?
? ? # 打印提示信息和電影宣傳畫
? ? print('正在為您預(yù)訂電影《{}》的座位...'.format(name))
? ? time.sleep(0.7)
? ? print(symbol)
? ? time.sleep(0.7)
?
? ? # 打印預(yù)訂座位的方法列表
? ? print('支持的座位預(yù)訂方式如下:')
? ? time.sleep(0.7)
? ? print('+==========================+')
? ? print("1 - 指定行列號預(yù)定座位")
? ? print("2 - 給我預(yù)訂一個最靠前的座位!")
? ? print('+==========================+')
? ? time.sleep(0.7)
? ? print('')
?
? ? # 獲取座位預(yù)訂方式
? ? method = input('請選擇座位預(yù)訂方式')
? ? # 定義符合要求輸入列表 valid_method
? ? valid_method = ['1','2']
? ? # 當(dāng)不符合要求時,循環(huán)獲取新的選項(xiàng)
? ? while method not in valid_method:
? ? ? method = input('沒有按照要求輸入哦,請重新輸入')
?
? ? # 實(shí)例化 SeatBooking 類
? ? booking = SeatBooking()
? ? # 打印所有座位的預(yù)訂信息
? ? booking.check_bookings(seats_list)
? ? # 方法 1:指定行列號
? ? if method == '1':
? ? ? booking.book_seat(seats_list)
? ? # 方法 2:預(yù)訂最靠前的座位
? ? else:
? ? ? booking.book_seat_at_front(seats_list)
?
? # 打印歡迎語
? def welcome(self):
? ? print('+============================+')
? ? print('+ ? ? ?歡迎來到時光電影院 ? ? ? +')
? ? print('+============================+')
? ? print('')
? ? time.sleep(0.7)
?
? # 打印結(jié)束語
? def bye(self):
? ? print('')
? ? time.sleep(0.7)
? ? print('+============================+')
? ? print('+ ? ?已經(jīng)退出系統(tǒng),下次見!?? ? ?+')
? ? print('+============================+')
?
?
# 實(shí)例化 Controller 類
s = Controller(infos)
到此這篇關(guān)于利用Python實(shí)現(xiàn)電影訂票系統(tǒng)的文章就介紹到這了,更多相關(guān)Python電影訂票系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于python多進(jìn)程中的常用方法詳解
這篇文章主要介紹了關(guān)于python多進(jìn)程中的常用方法詳解,python中的多線程其實(shí)并不是真正的多線程,如果想要充分地使用多核CPU資源,在python中大部分情況需要使用多進(jìn)程,需要的朋友可以參考下2023-07-07
Python項(xiàng)目打包并部署到Docker詳細(xì)步驟
這篇文章主要介紹了如何使用Docker將Python項(xiàng)目打包成鏡像并部署為容器,包括準(zhǔn)備工作、Python項(xiàng)目結(jié)構(gòu)、編寫Dockerfile、構(gòu)建Docker鏡像、運(yùn)行容器、優(yōu)化鏡像大小、自動化部署以及總結(jié),需要的朋友可以參考下2025-03-03
python使用requests庫爬取拉勾網(wǎng)招聘信息的實(shí)現(xiàn)
這篇文章主要介紹了python使用requests庫爬取拉勾網(wǎng)招聘信息的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
基于PyQt5實(shí)現(xiàn)狀態(tài)欄(statusBar)顯示和隱藏功能
這篇文章主要為大家詳細(xì)介紹了如何利用PyQt5實(shí)現(xiàn)狀態(tài)欄顯示和隱藏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-08-08

