利用Python實(shí)現(xiàn)電影訂票系統(tǒng)
一、效果展示
通過Python實(shí)現(xiàn)一個(gè)電影訂票系統(tǒng),效果如下圖所示:
二、整體結(jié)構(gòu)圖
三、代碼分解
3.1 infos.py
一部電影的詳細(xì)信息適合用 字典 結(jié)構(gòu)來存儲(chǔ),我們可以給字典里添加多個(gè)鍵值對(duì)來保存電影的名稱、座位表和宣傳時(shí)用的字符畫,比如電影《泰坦尼克號(hào)》的詳細(xì)信息就可以按下面的形式保存到字典 titanic 中:
infos = [ ? { ? ? 'name': '泰坦尼克號(hào)', ? ? 'symbol': ''' +==================== 泰坦尼克號(hào) =====================+ ? ▄▄▄▄▄? ? ▄▄▄▄▄ ?▄▄▄· ? ? ▄ ? ? ? ?▄▄·? ? ?██ ? ██ ??██ ? ?█ ?█ ??█▌?█ ?██ ??█ ▌? ? ?█.? ?█· ??█. ?▄█??█ ??█??▌ ??█· ██ ▄▄ ? ?█▌ ·?█▌ ??█▌· ?█ ??▌ ██?█▌ ??█▌ ?███▌ ? ??? ???? ???? ? ? ?? ??? █ ????? ·???? +===================== Titanic =====================+ ''', ? ? 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '●', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '●', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '●', '○'], ? ? ? ? ? ? ? ['●', '○', '○', '○', '●', '●', '●', '●']] ? }, ? { ? ? 'name': '雨人', ? ? 'symbol': ''' +====================== 雨人 =======================+ ? ,---. ? ?.--. ?,-..-. .-. ? ? ? ? ? .--. ?.-. .-.? ? | .-.\ ?/ /\ \ |(|| ?\| | |\ ? ?/| / /\ \ | ?\| |? ? | `-'/ / /__\ \(_)| ? | | |(\ ?/ |/ /__\ \| ? | |? ? | ? ( ?| ?__ ?|| || |\ ?| (_)\/ ?|| ?__ ?|| |\ ?|? ? | |\ \ | | ?|)|| || | |)| | \ ?/ || | ?|)|| | |)|? ? |_| \)\|_| ?(_)`-'/( ?(_) | |\/| ||_| ?(_)/( ?(_)? ? ? ? (__) ? ? ? ? (__) ? ? '-' ?'-' ? ? ? (__) ? ?? +===================== Rain Man ====================+ ''', ? ? 'seats': [['○', '○', '○', '○', '●', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '○', '●', '●', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '●', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○']] ? }, ? { ? ? 'name': '卡門', ? ? 'symbol': ''' +======================= 卡門 =======================+ ? ▄█▄ ? ?██ ? █▄▄▄▄ █?▄?█ ▄███▄ ? ? ?▄ ?? ? █? ?▄ ?█ █ ?█ ?▄? █ █ █ █? ? ? ? ? ?█ ? ? █ ? ? ?█▄▄█ █??▌ ?█ ▄ █ ██▄▄ ? ?██ ? █? ? █▄ ?▄? █ ?█ █ ?█ ?█ ? █ █▄ ? ▄? █ █ ?█? ? ?███? ? ? █ ? █ ? ? ?█ ??███? ? █ ?█ █? ? ? ? ? ? ? █ ? ? ? ? ?? ? ? ? ? ? █ ? ██? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +====================== Carmen =====================+ ''', ? ? 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '●', '●', '○', '○', '●', '●'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '●', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '●', '○', '○', '○', '●']] ? }, ? { ? ? 'name': '機(jī)器人總動(dòng)員', ? ? 'symbol': ''' +==================== 機(jī)器人總動(dòng)員 ===================+ ? ?(`\ .-') /` ?('-. ? ? ? ? ? ? ? ? ? ? ? ? ? ('-. ?? ? ? `.( OO ),' ( OO ).-. ? ? ? ? ? ? ? ? ? ? _( ?OO) ? ?,--./ ?.--. ? / . --. / ,--. ? ? ?,--. ? ? (,------.? ?| ? ? ?| ?| ? | \-. ?\ ?| ?|.-') ?| ?|.-') ?| ?.---'? ?| ?| ? | ?|,.-'-' ?| ?| | ?| OO ) | ?| OO ) | ?| ? ?? ?| ?|.'.| ?|_)\| |_.' ?| | ?|`-' | | ?|`-' |(| ?'--. ? ?| ? ? ? ? | ? | ?.-. ?|(| ?'---.'(| ?'---.' | ?.--' ? ?| ? ,'. ? | ? | ?| | ?| | ? ? ?| ?| ? ? ?| ?| ?`---.? ?'--' ? '--' ? `--' `--' `------' ?`------' ?`------' ? +====================== WALL·E =====================+ ''', ? ? 'seats': [['●', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['●', '○', '○', '○', '○', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '●', '○', '●', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '●', '○', '○', '○'], ? ? ? ? ? ? ? ['●', '●', '○', '○', '○', '●', '○', '○']] ? }, ? { ? ? 'name': '黑客帝國(guó)', ? ? 'symbol': ''' +===================== 黑客帝國(guó) =====================+ ? ?________ ? ? ? ? ? ?__ ?___ ? ? ?__ ? ? ? _ ? ?? ? /_ ?__/ /_ ?___ ? ? / ?|/ ?/___ _/ /______(_) ?__ ? ?/ / / __ \/ _ \ ? / /|_/ / __ `/ __/ ___/ / |/_/ ? / / / / / / ?__/ ?/ / ?/ / /_/ / /_/ / ?/ /> ?< ? ?/_/ /_/ /_/\___/ ?/_/ ?/_/\__,_/\__/_/ ?/_/_/|_| ? +==================== The Matrix ===================+ ''', ? ? 'seats': [['○', '●', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '●', '●', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '○'], ? ? ? ? ? ? ? ['○', '○', '○', '○', '○', '○', '○', '●'], ? ? ? ? ? ? ? ['○', '○', '●', '○', '○', '○', '○', '○']] ? }, ]
3.2 seat_book.py
選座系統(tǒng),需要實(shí)現(xiàn)下面這兩樣需求:
- 展示所有座位的預(yù)訂狀態(tài),方便用戶查看哪些座位還可以預(yù)訂;
- 根據(jù)用戶輸入的座位號(hào)完成預(yù)訂。
可以把選座系統(tǒng)抽象成一個(gè)類:SeatBooking
,這個(gè)類包含了兩種方法,check_bookings()
用于展示所有座位的預(yù)訂狀態(tài),book_seat()
用于完成預(yù)訂。
import time ? class SeatBooking: ? # 展示所有座位的預(yù)訂信息 ? def check_bookings(self, seats): ? ? print("正在為您查詢?cè)搱?chǎng)次電影的預(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ù)訂第幾排的座位呢?請(qǐng)輸入 1~6 之間的數(shù)字") ? ? valid_row = [str(i + 1) for i in range(6)] ? ? ? while input_row not in valid_row: ? ? ? input_row = input('沒有按要求輸入哦,請(qǐng)輸入 1~6 之間的數(shù)字') ? ? ? row = int(input_row) - 1 ? ? return row ?? ? # 獲取符合要求的列索引 ? def get_col(self): ? ? input_column = input('預(yù)訂這一排的第幾座呢?請(qǐng)輸入 1~8 之間的數(shù)字') ? ? valid_column = [str(i + 1) for i in range(8)] ? ? ? while input_column not in valid_column: ? ? ? input_column = input('沒有按要求輸入哦,請(qǐng)輸入 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ù)訂成功!座位號(hào):{}排{}座".format(row + 1, column + 1)) ? ? ? ? break ?# 結(jié)束循環(huán),退出選座 ? ? ? # 指定座位已經(jīng)被預(yù)訂了 ? ? ? else: ? ? ? ? print("這個(gè)座位已經(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ù)訂成功!座位號(hào):{}排{}座".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)。出于人性化考慮,我們希望用戶既可以輸入序號(hào)選擇觀看電影,也可以輸入 x 選擇退出系統(tǒng)。為此,我們需要完成下面兩樣需求:
- 和選座系統(tǒng)一樣,我們可以把“選擇電影場(chǎng)次”功能抽象成一個(gè)類,稱為 電影選擇系統(tǒng)。
- 而根據(jù)用戶選擇,預(yù)訂某一場(chǎng)次的座位,實(shí)際上是先調(diào)用 電影選擇系統(tǒng) 選擇電影,再調(diào)用 選座系統(tǒng) 預(yù)訂座位。這中間涉及到多次類的實(shí)例化與方法調(diào)用,為了更清晰地組織代碼,我們將這部分內(nèi)容也抽象成一個(gè)類,稱為 控制系統(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)不符合要求時(shí),循環(huán)獲取新的選項(xiàng) ? ? while choice not in valid_choice: ? ? ? choice = input('沒有按照要求輸入哦,請(qǐng)重新輸入') ? ? # 返回用戶做出的選擇 ? ? 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() ? ? # 根據(jù)用戶選擇,執(zhí)行不同流程 ? ? if self.choice != 'x': ? ? ? # 為指定場(chǎng)次預(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) ? ? # 為指定場(chǎng)次預(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 - 指定行列號(hào)預(yù)定座位") ? ? print("2 - 給我預(yù)訂一個(gè)最靠前的座位!") ? ? print('+==========================+') ? ? time.sleep(0.7) ? ? print('') ? ? ? # 獲取座位預(yù)訂方式 ? ? method = input('請(qǐng)選擇座位預(yù)訂方式') ? ? # 定義符合要求輸入列表 valid_method ? ? valid_method = ['1','2'] ? ? # 當(dāng)不符合要求時(shí),循環(huán)獲取新的選項(xiàng) ? ? while method not in valid_method: ? ? ? method = input('沒有按照要求輸入哦,請(qǐng)重新輸入') ? ? ? # 實(shí)例化 SeatBooking 類 ? ? booking = SeatBooking() ? ? # 打印所有座位的預(yù)訂信息 ? ? booking.check_bookings(seats_list) ? ? # 方法 1:指定行列號(hào) ? ? if method == '1': ? ? ? booking.book_seat(seats_list) ? ? # 方法 2:預(yù)訂最靠前的座位 ? ? else: ? ? ? booking.book_seat_at_front(seats_list) ? ? # 打印歡迎語 ? def welcome(self): ? ? print('+============================+') ? ? print('+ ? ? ?歡迎來到時(shí)光電影院 ? ? ? +') ? ? 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬)
這篇文章主要介紹了python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬),幫助大家更好的利用python處理表格,感興趣的朋友可以了解下2021-02-02django多個(gè)APP的urls設(shè)置方法(views重復(fù)問題解決)
今天小編就為大家分享一篇django多個(gè)APP的urls設(shè)置方法(views重復(fù)問題解決),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07python matplotlib.pyplot.plot()參數(shù)用法
這篇文章主要介紹了python matplotlib.pyplot.plot()參數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python爬蟲入門案例之回車桌面壁紙網(wǎng)美女圖片采集
讀萬卷書不如行萬里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來,今天小編給大家?guī)硪粋€(gè)python爬蟲案例,采集回車桌面網(wǎng)站的美女圖片,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法
下面小編就為大家分享一篇pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04mAP計(jì)算目標(biāo)檢測(cè)精確度實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了mAP計(jì)算目標(biāo)檢測(cè)精確度的實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05用Python中的wxPython實(shí)現(xiàn)最基本的瀏覽器功能
這篇文章主要介紹了用Python中的wxPython實(shí)現(xiàn)基本的瀏覽器功能,本文來自于IBM官方網(wǎng)站開發(fā)者文檔,需要的朋友可以參考下2015-04-04python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11python中Array和DataFrame相互轉(zhuǎn)換的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于python中Array和DataFrame相互轉(zhuǎn)換的實(shí)例講解內(nèi)容,對(duì)此有需要的朋友們可以學(xué)參考下。2021-02-02