一、效果展示
通过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('+============================+')
-
-
<br/># 实例化 Controller 类
-
s = Controller(infos)
就分享到这里了,赶快上手试试吧!
转载:https://blog.csdn.net/longz_org_cn/article/details/129091594
查看评论