当前位置: 首页 > news >正文

用Python实现一个电影订票系统

一、效果展示

通过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 timeclass 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) - 1return 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) - 1return 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 timeclass 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 SeatBookingclass 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_methodvalid_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)

就分享到这里了,赶快上手试试吧!

相关文章:

用Python实现一个电影订票系统

一、效果展示通过Python实现一个电影订票系统&#xff0c;效果如下所示&#xff1a;二、整体结构图三、代码分解3.1 infos.py一部电影的详细信息适合用 字典 结构来存储&#xff0c;我们可以给字典里添加多个键值对来保存电影的名称、座位表和宣传时用的字符画&#xff0c;比如…...

什么是瞪铃企业

“瞪羚企业”是指创业后跨过死亡谷以科技创新或商业模式创新为支撑进入高成长期的中小企业。认定范围主要是产业领域符合国家和省战略新兴产业发展方向&#xff0c;涵盖新兴工业、新一代信息技术、生物健康、人工智能、金融科技、节能环保、消费升级等领域。按照硅谷的解释&…...

【深度学习】多分类问题和多标签分类问题

上一章——激活函数 文章目录什么是多分类问题Softmax贝叶斯公式softmax的损失函数多标签分类问题什么是多分类问题 在之前的课程中&#xff0c;我们学习了二分问题&#xff0c;二分问题中的所有数据会被分类为0和1&#xff08;或者Ture和False&#xff09;两种输出标签。但是…...

大学生开学买什么,返校必备数码好物推荐

开学还不知道需要准备些什么&#xff0c;这篇开学数码好物&#xff0c;希望能够对你在开学购买的好物有一些帮助&#xff0c;一款好的数码装备&#xff0c;可以让我们在学校学习当中能够用最少的时间&#xff0c;最大的产出&#xff0c;节省时间&#xff0c;提高学习效率&#…...

Unreal Engine06:Actor的实现

写在前面 Actor是可以放进地图的最基本类&#xff0c;这里主要是介绍一下Actor的使用。 一、空间坐标系 1. Actor的变换操作 Actor的变换变换操作主要包括四个部分&#xff1a; 位置&#xff1b;旋转&#xff1b;缩放&#xff1b; 上面三者都是对应三个轴进行变换&#xff1…...

2023美国大学生数学建模竞赛C题思路解析(含代码+数据可视化)

以下为2023美国大学生数学建模竞赛C题思路解析&#xff08;含代码数据可视化&#xff09;规则&#xff1a;猜词&#xff0c;字母猜对&#xff0c;位置不对为黄色&#xff0c;位置对为绿色&#xff0c;两者皆不对为灰色。困难模式下的要求&#xff1a;对于猜对的字母&#xff08…...

aws codebuild 自定义构建环境和本地构建

参考资料 Extending AWS CodeBuild with Custom Build Environments Docker in custom image sample for CodeBuild codebuild自定义构建环境 在创建codebuild项目的时候发现 构建环境是 Docker 映像&#xff0c;其中包含构建和测试项目所需的所有内容的完整文件系统 用ru…...

3年功能3年自动化,从8k到23k的学习过程

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成功的有4家&…...

leaflet: 数据聚合,显示当前bounds区域中的点的名称列表(078)

第078个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现数据聚合的功能 ,左边列出右边可视区域内的marker的名称。这里主要用到了可视区域的范围以及contains函数。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…...

XXL-JOB分布式任务调度框架(一)-基础入门

文章目录1.什么是任务调度2.常见定时任务方案2.1. 传统定时任务方案示例2.2. 缺点分析3.什么是分布式任务调度&#xff1f;3.1. 并行任务调度3.2. 高可用3.3. 弹性扩容3.4. 任务管理与监测4.市面上常见的分布式任务调度产品5.初识xxl-job6.xxl-job架构设计6.1.设计思想6.2.架构…...

基于CentOS 7 搭建Redis 7集群

我们的目标是使用2台&#xff08;多台服务器类似&#xff09;服务器搭建一个3主3从的redis集群。 我们为什么要使用redis 7呢&#xff1f;因为6、7的版本都做了大量优化&#xff0c;比如6引入了多线程&#xff08;一些JAVA八股文面试还喜欢问redis为什么是单线程&#xff09;&…...

Lesson5.3---Python 之 NumPy 统计函数、数据类型和文件操作

一、统计函数 NumPy 能方便地求出统计学常见的描述性统计量。最开始呢&#xff0c;我们还是先导入 numpy。 import numpy as np1. 求平均值 mean() mean() 是默认求出数组内所有元素的平均值。我们使用 np.arange(20).reshape((4,5)) 生成一个初始值默认为 0&#xff0c;终止…...

Puppeteer 爬虫学习

puppeteer简介&#xff1a; Puppeteer 是一个 Node 库&#xff0c;它提供了一个高级 API 来通过 DevTools 协议 控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行&#xff0c; 但是可以通过修改配置文件运行“有头”模式。能作什么&#xff1f;&#xff1a; 生成…...

如何在Power Virtual Agents中实现身份验证

今天我们介绍一下如何通过身份验证的方式来使用Power Virtual Agents。首先进入“Microsoft 365-管理-Azure Active Directory管理中心”。 进入“Azure Active Directory管理中心”后选择“Azure Active Directory”中的“应用注册”-“新注册”。 输入新创建的应用程序名称后…...

金三银四必备软件测试必问面试题

初级软件测试必问面试题1、你的测试职业发展是什么&#xff1f;测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程…...

Java反序列化漏洞——CommonsCollections6链分析

一、前因因为在jdk8u71之后的版本中&#xff0c;sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑发生了变化&#xff0c;导致CC1中的两个链条都不能使用&#xff0c;所有我们需要找一个在高版本中也可用的链条。/* Gadget chain: java.io.ObjectInputStr…...

Selenium浏览器自动化测试框架

Selenium浏览器自动化测试框架 目录&#xff1a;导读 1、selenium简介 介绍 功能 优势 2、基本使用 3、获取单节点 4、获取多节点 5、节点交互 6、动作链 7、执行JavaScript代码 8、获取节点信息 9、切换frame 10、延时等待 11、前进和后退 12、cookies 13、选…...

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时&#xff0c;查看第19条》 结论 1、链表长度大于8时(插入第9条时)&#xff0c;会触发树化(treeifyBin)方法&#xff0c;但是不一定会树化&#xff0c;若数组大小小于…...

关于接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地

除了正确进行接地设计、安装,还要正确进行各种不同信号的接地处理。控制系统中&#xff0c;大致有以下几种地线&#xff1a; &#xff08;1&#xff09;数字地&#xff1a;也叫逻辑地&#xff0c;是各种开关量&#xff08;数字量&#xff09;信号的零电位。 &#xff08;2&am…...

排序

一、数据流中的中位数题目描述&#xff1a;如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...