Python實現(xiàn)電影訂票系統(tǒng)

大家好,今天咱們一起來實現(xiàn)一個簡易的電影訂票系統(tǒng),所謂麻雀雖小五臟俱全,跟著完成下來還是能學(xué)習(xí)到很多知識的
一、效果展示
通過Python實現(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),需要實現(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一項任務(wù):電影選擇系統(tǒng)。出于人性化考慮,我們希望用戶既可以輸入序號選擇觀看電影,也可以輸入 x 選擇退出系統(tǒng)。為此,我們需要完成下面兩樣需求:
和選座系統(tǒng)一樣,我們可以把“選擇電影場次”功能抽象成一個類,稱為 電影選擇系統(tǒng)。 而根據(jù)用戶選擇,預(yù)訂某一場次的座位,實際上是先調(diào)用 電影選擇系統(tǒng) 選擇電影,再調(diào)用 選座系統(tǒng) 預(yù)訂座位。這中間涉及到多次類的實例化與方法調(diào)用,為了更清晰地組織代碼,我們將這部分內(nèi)容也抽象成一個類,稱為 控制系統(tǒng)。
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('你的選擇是?')
????#?當(dāng)不符合要求時,循環(huán)獲取新的選項
????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()
????#?根據(jù)用戶選擇,執(zhí)行不同流程
????if?self.choice?!=?'x':
??????#?為指定場次預(yù)訂座位
??????self.choose_seat()
????#?打印結(jié)束語
????self.bye()
?
??#?用戶選擇想觀看的電影
??def?choose_film(self):
????#?實例化?FilmSelector?類
????selector?=?FilmSelector()
????#?展示所有用戶可以選擇的選項
????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)獲取新的選項
????while?method?not?in?valid_method:
??????method?=?input('沒有按照要求輸入哦,請重新輸入')
?
????#?實例化?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('+============================+')
?
?
#?實例化?Controller?類
s?=?Controller(infos)
如果本文對你有幫助的話,請不要吝嗇你的贊,謝謝!
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實戰(zhàn)項目?|學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機(jī)器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費!?|?用90行代碼打造最強PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機(jī)票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!|
年度爆款文案
6).30個Python奇淫技巧集?
點閱讀原文,看B站我的視頻!

