一、整体结构图
文章图片
二、代码分解 注:完整代码、数据、技术交流,文末获取
2.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': [['○', '●', '○', '○', '○', '○', '○', '○'],
['○', '○', '○', '●', '●', '○', '○', '●'],
['○', '○', '○', '○', '○', '○', '○', '○'],
['○', '○', '○', '○', '○', '○', '○', '○'],
['○', '○', '○', '○', '○', '○', '○', '●'],
['○', '○', '●', '○', '○', '○', '○', '○']]
},
]
2.2 seat_book.py
选座系统,需要实现下面这两样需求:
- 展示所有座位的预订状态,方便用户查看哪些座位还可以预订;
- 根据用户输入的座位号完成预订。
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("非常抱歉,所有座位都被订满了,无法为您保留座位")
2.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
2.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)
万水千山总是情,点个 行不行。
推荐文章
- 李宏毅《机器学习》国语课程(2022)来了
- 有人把吴恩达老师的机器学习和深度学习做成了中文版
- 上瘾了,最近又给公司撸了一个可视化大屏(附源码)
- 如此优雅,4款 Python 自动数据分析神器真香啊
- 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学
- 香的很,整理了20份可视化大屏模板
文章图片
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、添加微信号:dkl88191,备注:来自CSDN
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
文章图片
推荐阅读
- python|【机器学习】一文详解异常检测算法(KNN)
- Python|Python基础之格式化
- 用Python写个魂斗罗,另附30个Python小游戏源码
- Python学习笔记|Python数据绘图包matplotlib由浅入深解析
- python|python-opencv快速上手教程
- Python中5个你可以能不知道的知识
- python四个性能检测工具,包括函数的运行内存、时间等等...
- Python中的JSON数据处理
- Pandas教程(Python中的DataFrame)