小言_互联网的博客

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

356人阅读  评论(0)

一、效果展示

通过Python实现一个电影订票系统,效果如下所示:

二、整体结构图

三、代码分解

3.1 infos.py

一部电影的详细信息适合用 字典 结构来存储,我们可以给字典里添加多个键值对来保存电影的名称、座位表和宣传时用的字符画,比如电影《泰坦尼克号》的详细信息就可以按下面的形式保存到字典 titanic 中:


   
  1. infos = [
  2. {
  3. 'name': '泰坦尼克号',
  4. 'symbol': '''
  5. +==================== 泰坦尼克号 =====================+
  6. ▄▄▄▄▄▪ ▄▄▄▄▄ ▄▄▄· ▐ ▄ ▪ ▄▄·
  7. •██ ██ •██ ▐█ ▀█ •█▌▐█ ██ ▐█ ▌▪
  8. ▐█.▪ ▐█· ▐█. ▪▄█▀▀█ ▐█▐▐▌ ▐█· ██ ▄▄
  9. ▐█▌ ·▐█▌ ▐█▌· ▐█ ▪▐▌ ██▐█▌ ▐█▌ ▐███▌
  10. ▀▀▀ ▀▀▀ ▀▀▀ ▀ ▀ ▀▀ █ ▪▀▀▀ ·▀▀▀
  11. +===================== Titanic =====================+
  12. ''',
  13. 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
  14. ['○', '○', '○', '○', '●', '○', '○', '●'],
  15. ['○', '○', '●', '○', '●', '○', '○', '○'],
  16. ['○', '○', '●', '○', '○', '○', '○', '●'],
  17. ['○', '○', '●', '○', '○', '○', '●', '○'],
  18. ['●', '○', '○', '○', '●', '●', '●', '●']]
  19. },
  20. {
  21. 'name': '雨人',
  22. 'symbol': '''
  23. +====================== 雨人 =======================+
  24. ,---. .--. ,-..-. .-. .--. .-. .-.
  25. | .-.\ / /\ \ |(|| \| | |\ /| / /\ \ | \| |
  26. | `-'/ / /__\ \(_)| | | |(\ / |/ /__\ \| | |
  27. | ( | __ || || |\ | (_)\/ || __ || |\ |
  28. | |\ \ | | |)|| || | |)| | \ / || | |)|| | |)|
  29. |_| \)\|_| (_)`-'/( (_) | |\/| ||_| (_)/( (_)
  30. (__) (__) '-' '-' (__)
  31. +===================== Rain Man ====================+
  32. ''',
  33. 'seats': [['○', '○', '○', '○', '●', '○', '○', '●'],
  34. ['○', '○', '○', '●', '●', '○', '○', '○'],
  35. ['○', '●', '○', '○', '○', '○', '○', '○'],
  36. ['○', '○', '○', '○', '○', '○', '○', '○'],
  37. ['○', '○', '●', '○', '○', '○', '○', '○'],
  38. ['○', '○', '○', '○', '○', '○', '○', '○']]
  39. },
  40. {
  41. 'name': '卡门',
  42. 'symbol': '''
  43. +======================= 卡门 =======================+
  44. ▄█▄ ██ █▄▄▄▄ █▀▄▀█ ▄███▄ ▄
  45. █▀ ▀▄ █ █ █ ▄▀ █ █ █ █▀ ▀ █
  46. █ ▀ █▄▄█ █▀▀▌ █ ▄ █ ██▄▄ ██ █
  47. █▄ ▄▀ █ █ █ █ █ █ █▄ ▄▀ █ █ █
  48. ▀███▀ █ █ █ ▀███▀ █ █ █
  49. █ ▀ ▀ █ ██
  50. +====================== Carmen =====================+
  51. ''',
  52. 'seats': [['○', '○', '○', '○', '○', '○', '○', '○'],
  53. ['○', '○', '●', '●', '○', '○', '●', '●'],
  54. ['○', '○', '○', '○', '○', '○', '●', '○'],
  55. ['○', '○', '○', '○', '○', '○', '○', '○'],
  56. ['○', '○', '○', '○', '○', '○', '○', '○'],
  57. ['○', '○', '○', '●', '○', '○', '○', '●']]
  58. },
  59. {
  60. 'name': '机器人总动员',
  61. 'symbol': '''
  62. +==================== 机器人总动员 ===================+
  63. (`\ .-') /` ('-. ('-.
  64. `.( OO ),' ( OO ).-. _( OO)
  65. ,--./ .--. / . --. / ,--. ,--. (,------.
  66. | | | | \-. \ | |.-') | |.-') | .---'
  67. | | | |,.-'-' | | | | OO ) | | OO ) | |
  68. | |.'.| |_)\| |_.' | | |`-' | | |`-' |(| '--.
  69. | | | .-. |(| '---.'(| '---.' | .--'
  70. | ,'. | | | | | | | | | | `---.
  71. '--' '--' `--' `--' `------' `------' `------'
  72. +====================== WALL·E =====================+
  73. ''',
  74. 'seats': [['●', '○', '○', '○', '○', '○', '○', '○'],
  75. ['●', '○', '○', '○', '○', '○', '○', '●'],
  76. ['○', '○', '●', '○', '●', '○', '●', '○'],
  77. ['○', '○', '○', '○', '○', '○', '○', '●'],
  78. ['○', '○', '○', '○', '●', '○', '○', '○'],
  79. ['●', '●', '○', '○', '○', '●', '○', '○']]
  80. },
  81. {
  82. 'name': '黑客帝国',
  83. 'symbol': '''
  84. +===================== 黑客帝国 =====================+
  85. ________ __ ___ __ _
  86. /_ __/ /_ ___ / |/ /___ _/ /______(_) __
  87. / / / __ \/ _ \ / /|_/ / __ `/ __/ ___/ / |/_/
  88. / / / / / / __/ / / / / /_/ / /_/ / / /> <
  89. /_/ /_/ /_/\___/ /_/ /_/\__,_/\__/_/ /_/_/|_|
  90. +==================== The Matrix ===================+
  91. ''',
  92. 'seats': [['○', '●', '○', '○', '○', '○', '○', '○'],
  93. ['○', '○', '○', '●', '●', '○', '○', '●'],
  94. ['○', '○', '○', '○', '○', '○', '○', '○'],
  95. ['○', '○', '○', '○', '○', '○', '○', '○'],
  96. ['○', '○', '○', '○', '○', '○', '○', '●'],
  97. ['○', '○', '●', '○', '○', '○', '○', '○']]
  98. },
  99. ]

3.2 seat_book.py

选座系统,需要实现下面这两样需求:

展示所有座位的预订状态,方便用户查看哪些座位还可以预订;

根据用户输入的座位号完成预订。

可以把选座系统抽象成一个类:SeatBooking,这个类包含了两种方法,check_bookings() 用于展示所有座位的预订状态,book_seat() 用于完成预订。


   
  1. import time
  2. class SeatBooking:
  3. # 展示所有座位的预订信息
  4. def check_bookings(self, seats):
  5. print("正在为您查询该场次电影的预订状态...")
  6. time.sleep(0.7)
  7. print('从上到下为 1~6 排,从左至右为 1~8 座')
  8. print("======================")
  9. for row in seats:
  10. time.sleep(0.1)
  11. print(' '.join(row))
  12. print("======================")
  13. time.sleep(0.7)
  14. # 获取符合要求的行索引
  15. def get_row(self):
  16. input_row = input("预订第几排的座位呢?请输入 1~6 之间的数字")
  17. valid_row = [str(i + 1) for i in range(6)]
  18. while input_row not in valid_row:
  19. input_row = input('没有按要求输入哦,请输入 1~6 之间的数字')
  20. row = int(input_row) - 1
  21. return row
  22. # 获取符合要求的列索引
  23. def get_col(self):
  24. input_column = input('预订这一排的第几座呢?请输入 1~8 之间的数字')
  25. valid_column = [str(i + 1) for i in range(8)]
  26. while input_column not in valid_column:
  27. input_column = input('没有按要求输入哦,请输入 1~8 之间的数字')
  28. column = int(input_column) - 1
  29. return column
  30. # 预订指定座位
  31. def book_seat(self, seats):
  32. while True:
  33. row = self.get_row()
  34. column = self.get_col()
  35. # 指定座位没有被预订
  36. if seats[row][column] == '○':
  37. print("正在为您预订指定座位...")
  38. time.sleep(0.7)
  39. seats[row][column] = '●'
  40. print("预订成功!座位号:{}排{}座".format(row + 1, column + 1))
  41. break # 结束循环,退出选座
  42. # 指定座位已经被预订了
  43. else:
  44. print("这个座位已经被预订了哦,试试别的吧")
  45. time.sleep(0.7)
  46. # 预订最靠前的座位
  47. def book_seat_at_front(self, seats):
  48. print("正在为您预订最靠前的座位...")
  49. time.sleep(0.7)
  50. # 外循环:遍历 seats 的行
  51. for row in range(6):
  52. # 内循环:遍历 seats 的列
  53. for column in range(8):
  54. # 若碰到没有被预订的座位
  55. if seats[row][column] == '○':
  56. seats[row][column] = '●' # 预订该座位
  57. print("预订成功!座位号:{}排{}座".format(row + 1, column + 1))
  58. return # 结束函数的执行,返回到它被调用的地方
  59. # 没有在循环内部结束程序,说明不存在没有被预订的座位
  60. print("非常抱歉 ,所有座位都被订满了,无法为您保留座位")

3.3 film_selector.py

先来解决ling一项任务:电影选择系统。出于人性化考虑,我们希望用户既可以输入序号选择观看电影,也可以输入 x 选择退出系统。为此,我们需要完成下面两样需求:

和选座系统一样,我们可以把“选择电影场次”功能抽象成一个类,称为 电影选择系统。

而根据用户选择,预订某一场次的座位,实际上是先调用 电影选择系统 选择电影,再调用 选座系统 预订座位。这中间涉及到多次类的实例化与方法调用,为了更清晰地组织代码,我们将这部分内容也抽象成一个类,称为 控制系统。


   
  1. import time
  2. class FilmSelector:
  3. # 展示所有可选项
  4. def display_options(self, films):
  5. print("今日影院排片列表:")
  6. print('+================+')
  7. # 按行打印每部电影
  8. for i in range(len(films)):
  9. print('{} - {}'.format(i + 1, films[i]['name']))
  10. time.sleep(0.2)
  11. # 打印退出选项
  12. print('x - 退出')
  13. print('+================+')
  14. time.sleep(0.7)
  15. # 获取用户的选择
  16. def get_choice(self, films):
  17. # 符合要求的输入列表
  18. valid_choice = [str(i + 1) for i in range(len(films))]
  19. valid_choice.append('x')
  20. choice = input('你的选择是?')
  21. # 当不符合要求时,循环获取新的选项
  22. while choice not in valid_choice:
  23. choice = input('没有按照要求输入哦,请重新输入')
  24. # 返回用户做出的选择
  25. return choice

3.4 main.py


   
  1. import time
  2. from infos import infos
  3. from film_selector import FilmSelector
  4. from seat_booking import SeatBooking
  5. class Controller:
  6. def __init__(self, infos):
  7. self.films = infos # 电影库所有电影
  8. # 打印欢迎语
  9. self.welcome()
  10. # 用户选择想观看的电影
  11. self.choose_film()
  12. # 根据用户选择,执行不同流程
  13. if self.choice != 'x':
  14. # 为指定场次预订座位
  15. self.choose_seat()
  16. # 打印结束语
  17. self.bye()
  18. # 用户选择想观看的电影
  19. def choose_film(self):
  20. # 实例化 FilmSelector 类
  21. selector = FilmSelector()
  22. # 展示所有用户可以选择的选项
  23. selector.display_options(self.films)
  24. # 通过 get_choice() 方法获取用户选择
  25. self.choice = selector.get_choice(self.films)
  26. # 为指定场次预订座位
  27. def choose_seat(self):
  28. # 取出用户所选择的电影
  29. film = self.films[int(self.choice) - 1]
  30. # 取出所选择电影的电影名、座位表、宣传画
  31. name = film['name']
  32. seats_list = film['seats']
  33. symbol = film['symbol']
  34. # 打印提示信息和电影宣传画
  35. print('正在为您预订电影《{}》的座位...'.format(name))
  36. time.sleep(0.7)
  37. print(symbol)
  38. time.sleep(0.7)
  39. # 打印预订座位的方法列表
  40. print('支持的座位预订方式如下:')
  41. time.sleep(0.7)
  42. print('+==========================+')
  43. print("1 - 指定行列号预定座位")
  44. print("2 - 给我预订一个最靠前的座位!")
  45. print('+==========================+')
  46. time.sleep(0.7)
  47. print('')
  48. # 获取座位预订方式
  49. method = input('请选择座位预订方式')
  50. # 定义符合要求输入列表 valid_method
  51. valid_method = ['1','2']
  52. # 当不符合要求时,循环获取新的选项
  53. while method not in valid_method:
  54. method = input('没有按照要求输入哦,请重新输入')
  55. # 实例化 SeatBooking 类
  56. booking = SeatBooking()
  57. # 打印所有座位的预订信息
  58. booking.check_bookings(seats_list)
  59. # 方法 1:指定行列号
  60. if method == '1':
  61. booking.book_seat(seats_list)
  62. # 方法 2:预订最靠前的座位
  63. else:
  64. booking.book_seat_at_front(seats_list)
  65. # 打印欢迎语
  66. def welcome(self):
  67. print('+============================+')
  68. print('+ 欢迎来到时光电影院 +')
  69. print('+============================+')
  70. print('')
  71. time.sleep(0.7)
  72. # 打印结束语
  73. def bye(self):
  74. print('')
  75. time.sleep(0.7)
  76. print('+============================+')
  77. print('+ 已经退出系统,下次见! +')
  78. print('+============================+')
  79. <br/># 实例化 Controller 类
  80. s = Controller(infos)

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


转载:https://blog.csdn.net/longz_org_cn/article/details/129091594
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场