当前位置:   article > 正文

python3 武装飞船游戏实战 代码及详细注释_pycharm游戏代码

pycharm游戏代码

项目描述:

        制作一款2D的游戏飞机大战,在游戏中,玩家控制一艘飞船最初出现在屏幕底部中央的飞船。玩家可以使用箭头左右移动飞船,空格射击。游戏开始,一群不明生物飞在天空,并像屏幕下方移动,玩家需要击杀这些不明生物,随着击杀的次数,不明生物的移动生物速度更快,只要有生物撞到玩家或达到底部,玩家损失一艘飞船,损失你三艘飞船以后,游戏结束。 

软件描述:

        pycharm 2022.2 专业版 

        python3.10(pygame

游戏效果预览:

                                                         注意以下代码只用来学习 借鉴 !自娱自乐ha !

图片素材请自取:  图片有水印 如果需要没有水印的请私聊我 ~

 

 

 

目录

环境安装:

代码:

 1、主文件: aircraft_battle.py 

2、设置文件:aircraft_battle_set.py

3、飞船 文件: aircraft_battle_ship.py

4、子弹文件: aircraft_bullet.py

5、外星飞船文件:Alien_spacecraft.py

6、游戏统计文件:game_stats.py

7、游戏按键文件:button.py

8、游戏计分文件:scoreboard.py


环境安装:

        安装pygame

        1、在pycharm打开终端(在右下角)输入一下命令安装

python3 -m pip install --user pygame

代码:

主运行文件:aircraft_battle.py 

设置文件:aircraft_battle_set.py

飞船 文件: aircraft_battle_ship.py

子弹文件: aircraft_bullet.py

外星飞船文件:Alien_spacecraft.py

游戏统计文件:game_stats.py

游戏按键文件:button.py

游戏计分文件:scoreboard.py

images图片存放位置  

注意:按目录格式放好 运行即可

目录结构:

 1、主文件: aircraft_battle.py 

  1. # -*- coding: GBK -*-
  2. import sys, pygame, time
  3. from aircraft_battle_set import Settings
  4. from aircraft_battle_ship import Ship
  5. from aircraft_bullet import *
  6. from Alien_spacecraft import *
  7. from game_stats import *
  8. from button import *
  9. from scoreboard import *
  10. class AircraftBattle:
  11. """管理游戏资源和行为的类"""
  12. def __init__(self):
  13. """初始化游戏资源"""
  14. pygame.init() # 初始化背景设置
  15. self.settings = Settings()
  16. self.screen = pygame.display.set_mode(
  17. (self.settings.screen_width, self.settings.screen_height)) # 创建显示窗口 单位为px(像素)1200px宽 200px高
  18. pygame.display.set_caption("飞机大战") # 窗口标题
  19. # 创建一个用于存储游戏统计信息的实例
  20. self.stats = GameStats(self)
  21. # 创建计分器
  22. self.sb = Scoreboard(self)
  23. self.ship = Ship(self)
  24. self.bullets = pygame.sprite.Group() # 编组 用于存储所有有效子弹
  25. self.aliens = pygame.sprite.Group()
  26. self._create_fleet()
  27. # 创建 Play 按钮
  28. self.play_button = Button(self, "Play")
  29. if not self.stats.game_active:
  30. self.play_button.draw_button()
  31. def Fullscreen(self):
  32. # 全屏运行全屏模式下不支持鼠标点击退出,只能输入Q退出
  33. # 全屏与小窗口来回切换会发生外星飞船位置错乱
  34. self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # 传入0,0参数以及FULLSCREEN:覆盖整个显示器
  35. self.settings.screen_width = self.screen.get_rect().width # 由于无法估计屏幕大小所以使用width与height来更新设置
  36. self.settings.screen_height = self.screen.get_rect().height
  37. self.ship = Ship(self)
  38. self.bullets = pygame.sprite.Group() # 编组 用于存储所有有效子弹
  39. self.aliens = pygame.sprite.Group()
  40. self._create_fleet()
  41. # 创建 Play 按钮
  42. self.play_button = Button(self, "Play")
  43. def _check_events(self):
  44. """响应按键与鼠标响应"""
  45. for event in pygame.event.get(): # 循环事件
  46. if event.type == pygame.QUIT:
  47. sys.exit()
  48. elif event.type == pygame.KEYDOWN:
  49. self._check_keydown_events(event)
  50. elif event.type == pygame.KEYUP:
  51. self._check_keyup_events(event)
  52. elif event.type == pygame.MOUSEBUTTONDOWN: # 检测与按钮相关的鼠标事件
  53. mouse_pos = pygame.mouse.get_pos() # pygame.mouse.get_pos() 将返回一个元组,其中包含x,y的坐标
  54. self._check_play_button(mouse_pos) # 将返回的值传给_check_play_button方法
  55. def _check_play_button(self, mouse_pos):
  56. """在玩家单机Play按钮时开始新游戏"""
  57. button_clicked = self.play_button.rect.collidepoint(mouse_pos)
  58. # collidepoint 这个方法检测鼠标单击位置是否在play按钮的矩形内,如果是就设置为True 开始游戏
  59. if button_clicked and not self.stats.game_active:
  60. self.stats.game_active = True
  61. # 重置游戏统计信息
  62. self.settings.initialize_dynamic_settings()
  63. self.stats.reset_stats() # 重置信息,并提供给玩家三架飞机
  64. # 方法代码执行完毕后,运行游戏
  65. # 清空剩余子弹以及外星飞船 # 游戏开始后清空编组
  66. self.aliens.empty() # 清空外星飞船编组
  67. self.bullets.empty() # 清空子弹编组
  68. # 创建一群新的外星飞船并让飞船居中
  69. self._create_fleet()
  70. self.ship.center_ship()
  71. # 游戏开始时,更新等级图像
  72. self.sb.prep_score()
  73. self.sb.prep_level()
  74. self.sb.prep_ships()
  75. # 隐藏光标
  76. pygame.mouse.set_visible(False)
  77. def _check_keydown_events(self, event): # 响应按键
  78. if event.key == pygame.K_RIGHT:
  79. # 向右移动飞船
  80. self.ship.moving_right = True
  81. # 向左移动
  82. elif event.key == pygame.K_LEFT:
  83. self.ship.moving_left = True
  84. # 向下移动
  85. elif event.key == pygame.K_DOWN:
  86. self.ship.moving_xia = True
  87. # 向上移动
  88. elif event.key == pygame.K_UP:
  89. self.ship.moving_shang = True
  90. # 空格发射子弹
  91. elif event.key == pygame.K_SPACE:
  92. self._fire_bullet()
  93. # 如果用户摁倒Q 既退出
  94. elif event.key == pygame.K_q:
  95. sys.exit()
  96. # 按键 1 控制全屏 # 注意在操作的时候 飞机会恢复到初始位置
  97. elif event.key == pygame.K_1:
  98. self.Fullscreen()
  99. # 按键 2 控制窗口化 # 注意在操作的时候 飞机会恢复到初始位置
  100. # elif event.key == pygame.K_2:
  101. # self.windows()
  102. def _check_keyup_events(self, event):
  103. # 松开按键以后改为FALSE 停止移动
  104. if event.key == pygame.K_RIGHT: # 松开按键以后停止向右移动
  105. self.ship.moving_right = False
  106. elif event.key == pygame.K_LEFT: # 松开按键以后停止向左移动
  107. self.ship.moving_left = False
  108. # elif event.key == pygame.K_DOWN: # 松开按键以后停止向下移动
  109. # self.ship.moving_xia = False
  110. # elif event.key == pygame.K_UP: # 松开按键以后停止向上移动
  111. # self.ship.moving_shang = False
  112. def _fire_bullet(self):
  113. """创建一颗子弹,并将其加入到编组bullets中"""
  114. if len(self.bullets) < self.settings.bullet_allowed: # 判断 bullets的长度,如果小于10 就创建一颗新子弹,但如果有未消失的三颗子弹,按下空格后不触发子弹
  115. new_bullet = Bullet(self) # 定义子弹
  116. self.bullets.add(new_bullet) # 将子弹 加入编组当中
  117. def _ship_hit(self):
  118. """响应飞船被撞击"""
  119. if self.stats.ship_left > 0:
  120. # 将 ships_left 减一 并更新记牌器
  121. self.stats.ship_left -= 1 # 飞船撞到外星飞船以后数量 - 1
  122. self.sb.prep_ships()
  123. # 清空余下的外星飞船和子弹 , 因为是编组的形式,所以直接清空编组
  124. self.aliens.empty()
  125. self.bullets.empty()
  126. # 创建一批新的外星飞船,并将飞船恢复到初始化位置
  127. self._create_fleet()
  128. self.ship.center_ship()
  129. # 暂停
  130. time.sleep(0.5) # 暂停0.5 能让玩家看到被撞击
  131. else:
  132. self.stats.game_active = False
  133. pygame.mouse.set_visible(True) # 鼠标光标
  134. def _update_bullets(self):
  135. """更新子弹位置并删除消失的子弹"""
  136. self.bullets.update()
  137. # 删除消失的子弹
  138. # 子弹 在到达屏幕顶端后消失,是因为pygame无法在屏幕外绘制,但出去的子弹依然存在,它们将继续消耗你内存和cpu,需要将屏幕外的子弹删除
  139. for bullet in self.bullets.copy(): # 因为不能从for循环遍历的列表中删除元素,所以必须遍历编组的副本,所以我们用copy俩循环
  140. if bullet.rect.bottom <= 0: # 如果子弹从顶部消失,y的值就为负数或者0 ,就将其从列表中删除
  141. self.bullets.remove(bullet)
  142. # print(len(self.bullets)) # 查看屏幕内子弹存在的数量
  143. self._check_bullet_alien_collisions()
  144. # 检测外星飞船与 飞船之间的碰撞
  145. if pygame.sprite.spritecollideany(self.ship, self.aliens):
  146. self._ship_hit() # 将方法加入到这个碰撞判断中
  147. # 检查是否有外星飞船达到了屏幕底端
  148. self._check_aliens_bottom()
  149. def _check_aliens_bottom(self):
  150. """检查外星飞船是否到达底部"""
  151. screen_rect = self.screen.get_rect()
  152. for alien in self.aliens.sprites():
  153. if alien.rect.bottom >= screen_rect.bottom:
  154. # 像飞船被 碰撞一样 处理掉
  155. self._ship_hit()
  156. break
  157. def _check_bullet_alien_collisions(self):
  158. # 检查子弹是否击中外星飞船
  159. # 如果是,就删除对应的子弹和外星飞船
  160. collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
  161. # sprite.groupcollide 将一个编组中每个元素的rect同另一个编组中的每个元素rect进行比较。
  162. if collisions:
  163. # 与外星飞船碰撞的子弹都是字典 collisions 中的一个键,每颗子弹相关的值都是一个列表,其中包含该子弹击中的外星人
  164. for aliens in collisions.values(): # 循环 字典 collisions 确保每个消灭的都进入得分
  165. self.stats.score += self.settings.alien_points * len(aliens)
  166. # 每个值都是一个列表,包含被同一颗子弹击中的所有外星飞船,对于每个列表,都将其包含的外星人数量乘以一个外星人的分数,并将分数加入当前得分
  167. self.sb.prep_score()
  168. self.sb.check_high_score()
  169. if not self.aliens:
  170. # 删除现有的子弹并新建外星飞船
  171. self.bullets.empty()
  172. self._create_fleet() # 重新创建外星飞船群
  173. self.settings.increase_speed()
  174. # 提高等级 # 当消灭一群外星飞船的时候等级加一
  175. self.stats.level += 1
  176. self.sb.prep_level()
  177. def _update_screen(self):
  178. """更新屏幕上的图像,并切换到新屏幕"""
  179. # 每次循环时都重绘屏幕。
  180. self.screen.fill(self.settings.bg_color)
  181. self.ship.blitme()
  182. for bullet in self.bullets.sprites(): # 方法 bullets.sprites 返回的是一个列表,遍历编组中的内容并对每部分内容调用draw_bullet,形成子弹样式
  183. bullet.draw_bullet()
  184. self.aliens.draw(self.screen) # 外星飞船编组调用 draw方法
  185. # 显示得分
  186. self.sb.show_score()
  187. # 如果游戏处于非活动状态下,就绘制Play按钮
  188. if not self.stats.game_active:
  189. self.play_button.draw_button()
  190. pygame.display.flip()
  191. def _create_fleet(self):
  192. """创建外星人飞船群"""
  193. # 创建一个外星人飞船并计算一行可容纳多少个
  194. alien = Alien(self)
  195. alien_width, alien_height = alien.rect.size # 使用属性size,该属性为一个元组,包含rect对象的宽度与高度
  196. # 计算两边空白宽度 (屏幕两边留下一定的边距,将其设置为外星飞船的宽度,因有两个边距,所以用于存放外星飞船的水平空间 = 屏幕宽度 - 外星飞船宽度的两倍)
  197. available_space_x = self.settings.screen_width - (2 * alien_width)
  198. # 计算外星飞船之间的间距 (外星飞船所需要的间距为外星飞船的两倍,一个宽度存放外星飞船,另一个存放飞船间距)
  199. # 为确定一行可容纳多少飞船,将空间 除以 外星飞船宽度的两倍, 这里用的 “//" 为整除运算符
  200. number_aliens_x = available_space_x // (2 * alien_width)
  201. # 计算屏幕可容纳多少外星飞船
  202. ship_height = self.ship.rect.height
  203. # 计算可用垂直空间 = 屏幕高度 - 第一行外星飞船的上边距(外星飞船高度)、飞船高度以及飞船群最初与飞船之间的间距(外星人高度的两倍)
  204. available_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)
  205. # 每行下方留出一定的空白区域,计算可容纳行数,将可用的垂直空间 除以 外星飞船高度的两倍(行数只能是整数)
  206. number_rows = available_space_y // (2 * alien_height)
  207. # 创建外星飞船群
  208. for row_number in range(number_rows): # 将上述计算出来的高度变为一个循环的数,用来创建多行外星飞船
  209. # 创建第一行外星人飞船
  210. for alien_number in range(number_aliens_x): # 内部循环用来创建一行循环
  211. self._create_alien(alien_number, row_number) # row_number 传递一个行号实参,将每行都沿屏幕依次向下放置
  212. def _create_alien(self, alien_number, row_number):
  213. # 创建一个外星人飞船并将其加入当前行
  214. alien = Alien(self) # 创建 单个 外星飞船
  215. alien_width, alien_height = alien.rect.size
  216. # 通过 x 坐标 将其加入当前行,将每个 外星飞船往右推一个飞船宽度,在将外星飞船宽度乘以2,得到每个外星飞船占据的空间,包括飞船的间距
  217. alien.x = alien_width + 2 * alien_width * alien_number
  218. # 在据此计算当前外星飞船当前位置,使用 飞船的 x 属性来设置其位置
  219. alien.rect.x = alien.x
  220. # 修改 外星飞船的 y 坐标 并在第一行外星飞船上方流出与外星飞船等高的空白区域
  221. # 相邻外星飞船 行的y 坐标 相差 外星飞船的两倍,因此高度乘以2 在乘以行号,第一行为0 因此第一行不变
  222. alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
  223. self.aliens.add(alien) # 最后将所有创建的外星飞船 加入到编组当中
  224. def _update_aliens(self):
  225. """更新外星飞船舰群中所有外星飞船的位置"""
  226. self._check_fleet_edges()
  227. self.aliens.update()
  228. def _check_fleet_edges(self):
  229. """外星飞船到达边缘采取措施"""
  230. for alien in self.aliens.sprites():
  231. if alien.check_edges():
  232. self._change_fleet_direction()
  233. break
  234. def _change_fleet_direction(self):
  235. """将整群外星飞船向下移动,并改变方向"""
  236. for alien in self.aliens.sprites():
  237. alien.rect.y += self.settings.fleet_drop_speed
  238. self.settings.fleet_direction *= -1 # 这里-1 是向左移动
  239. def run_game(self):
  240. """开始游戏的主循环"""
  241. while True:
  242. self._check_events()
  243. if self.stats.game_active: # stats.game_active 为真的时候游戏继续,否则不运行游戏
  244. self.ship.update()
  245. self._update_bullets()
  246. self._update_screen()
  247. # 调用更新外星飞船位置的方法
  248. self._update_aliens()
  249. # 让最近绘制的屏幕可见
  250. pygame.display.flip()
  251. if __name__ == "__main__":
  252. # 创建实例并运行游戏
  253. ai = AircraftBattle()
  254. ai.run_game()

2、设置文件:aircraft_battle_set.py

  1. # -*- coding: GBK -*-
  2. class Settings:
  3. """存储游戏中所有的设置类"""
  4. def __init__(self):
  5. """初始化游戏设置"""
  6. # 屏幕设置
  7. self.screen_width = 1200
  8. self.screen_height = 800
  9. # 设置背景颜色
  10. self.bg_color = (230, 230, 230)
  11. # 飞船移动速度设置 #每次移动 1.5个像素 px
  12. self.ship_speed = 1.5
  13. # 飞船设置
  14. self.ship_limit = 3 # 创建飞船数量
  15. # 子弹设置
  16. self.bullet_speed = 1.5 # 设置子弹速度
  17. self.bullet_width = 3 # 设置子弹像素宽为3
  18. self.bullet_height = 15 # 设置子弹像素高为 15
  19. self.bullet_color = (121, 176, 214) # 设置子弹颜色
  20. self.bullet_allowed = 20 # 限制同屏子弹最大数量为 10
  21. # 外星飞船设置
  22. self.alien_speed = 1.0 # 飞船移动速度
  23. self.fleet_drop_speed = 10 # 飞船每次向下移动的像素
  24. # fleet_direction 为 1 表示向右移动 为 -1 表示向左移动
  25. self.fleet_direction = 1
  26. # 加快游戏节奏的速度
  27. self.speedup_scale = 1.1 # 控制游戏节奏的加快速度
  28. # 分数越高 便提升速度
  29. self.score_scale = 1.5 # 将分数提高速度设置为1.5
  30. self.initialize_dynamic_settings() # 玩家每提高一级 游戏的节奏就翻倍
  31. def initialize_dynamic_settings(self):
  32. """初始化随游戏进行而变化设置"""
  33. self.ship_seed = 1.5
  34. self.bullet_speed = 3
  35. self.alien_speed = 1.0
  36. # fleet_direction 为1 表示向右移动 为 -1 向左移动
  37. self.fleet_direction = 1
  38. # 外星飞船击落计分
  39. self.alien_points = 50 # 随着游戏的进行 将提高分数,确保每次开启新游戏 都重置此分数 设定alien_plints
  40. def increase_speed(self):
  41. """提高速度设置和击中外星飞船分数"""
  42. self.ship_speed *= self.speedup_scale
  43. self.bullet_speed *= self.speedup_scale
  44. self.alien_speed *= self.speedup_scale
  45. self.alien_points = int(self.alien_points * self.score_scale) # 游戏节奏加快的同时,提高每个外星飞船被击中的分数

3、飞船 文件: aircraft_battle_ship.py

  1. # -*- coding: GBK -*-
  2. import pygame
  3. from pygame.sprite import Sprite
  4. class Ship(Sprite):
  5. """管理飞船的类"""
  6. def __init__(self, ai_game):
  7. """初始化飞船并设置其初始化位置"""
  8. super().__init__()
  9. self.screen = ai_game.screen
  10. self.settings = ai_game.settings
  11. self.screen_rect = ai_game.screen.get_rect() # 使用方法get_rect()访问屏幕的属性rect,并赋给.self.screen_rect,这样就能够将飞船放到屏幕中央
  12. # 加载飞船图像并获取外连接矩形
  13. self.image = pygame.image.load('images/ship.png') # 加载图像
  14. self.rect = self.image.get_rect() # 指定飞船位置,用get_rect获取屏幕属性没用来指定飞船位置
  15. # 对于每艘飞船,都将其放在屏幕底部的中央
  16. self.rect.midbottom = self.screen_rect.midbottom
  17. # 在飞船的属性x,y中存储小数值
  18. self.x = float(self.rect.x)
  19. self.y = float(self.rect.y)
  20. # 移动标志
  21. self.moving_right = False # 向右移动
  22. self.moving_left = False # 向左移动
  23. self.moving_shang = False # 向上移动
  24. self.moving_xia = False # 向下移动
  25. def update(self):
  26. """根据移动标志调整飞船的位置"""
  27. # 限制飞船活动范围
  28. if self.moving_right and self.rect.right < self.screen_rect.right:
  29. self.x += self.settings.ship_speed # 向右移动
  30. if self.moving_left and self.rect.left > 0:
  31. self.x -= self.settings.ship_speed # 向左移动
  32. # if self.moving_shang and self.rect.top > 0:
  33. # self.y -= self.settings.ship_speed # 向上移动
  34. # if self.moving_xia and self.rect.bottom < self.screen_rect.bottom:
  35. # self.y += self.settings.ship_speed # 向下移动
  36. # 根据self.x更新rect对象
  37. self.rect.x = self.x
  38. self.rect.y = self.y
  39. def blitme(self):
  40. """在指定位置绘画飞船"""
  41. self.screen.blit(self.image, self.rect)
  42. # 处理rect对象时,可以使用矩形四角和中心的x坐标和y坐标。可通过设置这些值来指定矩形位置。要让游戏元素居中,可以
  43. def center_ship(self):
  44. """让飞船在屏幕底端居中"""
  45. self.rect.midbottom = self.screen_rect.midbottom
  46. self.x = float(self.rect.x)

4、子弹文件: aircraft_bullet.py

  1. # -*- coding: GBK -*-
  2. import pygame
  3. from pygame.sprite import Sprite
  4. class Bullet(Sprite):
  5. """管理飞机所发射子弹的类"""
  6. def __init__(self, ai_game):
  7. """在飞机当前位置创建一个子弹对象"""
  8. super().__init__()
  9. self.screen = ai_game.screen
  10. self.settings = ai_game.settings
  11. self.color = self.settings.bullet_color
  12. # 在(0,0)处创建一个表示子弹的矩形,在设置正确的位置
  13. self.rect = pygame.Rect(0, 0, self.settings.bullet_width,
  14. self.settings.bullet_height) # 创建子弹的属性rect,子弹并非基于图像,因此必须用pygame.Rect创建一个矩形
  15. self.rect.midtop = ai_game.ship.rect.midtop # 将子弹的rect.midtop设置为飞船的rect.midtop
  16. # 存储用小数表示子弹位置
  17. self.y = float(self.rect.y)
  18. def update(self):
  19. """向上移动子弹"""
  20. # 更新 子弹位置的小数点
  21. self.y -= self.settings.bullet_speed # 子弹发射后向上移动,意味着y坐标将不断减小,并更新子弹位置
  22. # 更新 子弹 的 rect 位置
  23. self.rect.y = self.y # 更新子弹矩形的位置
  24. def draw_bullet(self):
  25. """在屏幕上绘制子弹"""
  26. pygame.draw.rect(self.screen, self.color, self.rect) # draw.rect 函数使用存储在self.color中的颜色填充表示子弹的矩形占据的屏幕的部分

5、外星飞船文件:Alien_spacecraft.py

  1. # -*- coding: GBK -*-
  2. import pygame
  3. from pygame.sprite import Sprite
  4. class Alien(Sprite):
  5. """表示单个外星人的类"""
  6. def __init__(self, ai_game):
  7. """初始化外星人飞船位置"""
  8. super().__init__()
  9. self.screen = ai_game.screen
  10. self.settings = ai_game.settings
  11. # 加载外星人图像冰着吃其 rect 属性
  12. self.image = pygame.image.load("images/alien.png")
  13. self.rect = self.image.get_rect()
  14. # 每个外星飞船最初都在屏幕左上角附近
  15. self.rect.x = self.rect.width
  16. self.rect.y = self.rect.height
  17. # 存储外星人的精准水平位置
  18. self.x = float(self.rect.x)
  19. def check_edges(self):
  20. """
  21. 检查外星飞船是否撞到了屏幕边缘
  22. 如果外星飞船位于屏幕边缘就返回True
  23. """
  24. screen_rect = self.screen.get_rect()
  25. # 如果 rect 的属性 right大于屏幕的rect 的 right属性,就说明外星飞船位于右边缘,反之在左边
  26. if self.rect.right >= screen_rect.right or self.rect.left <= 0:
  27. return True
  28. def update(self):
  29. """向右移动外星飞船"""
  30. self.x += (self.settings.alien_speed * self.settings.fleet_direction) # 使用属性 self.x 跟踪外星飞船的准确位置
  31. self.rect.x = self.x # self.x 的值来更新 外星飞船的位置

6、游戏统计文件:game_stats.py

  1. # -*- coding: GBK -*-
  2. class GameStats:
  3. """跟踪游戏的统计信息"""
  4. def __init__(self, ai_game):
  5. """初始化信息统计表"""
  6. self.settings = ai_game.settings
  7. self.reset_stats()
  8. self.game_active = False # 让游戏一开始处于非活动状态
  9. # # 游戏结束设置
  10. # # 游戏刚启动时设置为 True
  11. # self.game_active = True
  12. # 最高分初始化值
  13. self.high_score = 0
  14. def reset_stats(self):
  15. """初始化在游戏运行期间可能变化的统计信息"""
  16. self.ship_left = self.settings.ship_limit
  17. self.score = 0 # 初始化分数
  18. # 玩家等级
  19. self.level = 1 # 初始玩家等级

7、游戏按键文件:button.py

  1. # -*- coding: GBK -*-
  2. import pygame.font
  3. class Button:
  4. def __init__(self, ai_game, msg):
  5. """
  6. 初始化按钮的属性
  7. msg 按钮中显示文本
  8. """
  9. self.screen = ai_game.screen
  10. self.screen_rect = self.screen.get_rect()
  11. # 设置按钮的尺寸和其他属性
  12. self.width, self.height = 200, 50 # 设置按钮尺寸
  13. self.button_color = (0, 255, 0) # 按钮背景颜色
  14. self.text_color = (255, 255, 255) # 按钮文本颜色
  15. self.font = pygame.font.SysFont(None, 48) # pygame.font 函数可以将文本渲染到屏幕上,SysFont 指定字体
  16. # None 表示使用默认字体 , 48 表示文本的字号
  17. # 创建按钮的rect对象,并使其居中
  18. self.rect = pygame.Rect(0, 0, self.width, self.height) # 居中
  19. self.rect.center = self.screen_rect.center
  20. # 按钮的标签只需创建一次
  21. self._prep_msg(msg) # 调用函数进行渲染
  22. # pygame处理文本的方式就是将要显示的字符串渲染为图像
  23. def _prep_msg(self, msg): # 接受实参self 以及要渲染为图像的文本msg
  24. """将msg渲染为图像,并使其在按钮上居中"""
  25. # font.renderc 函数: 将存储在msg中的文本转为图,在括号内的参数中布尔值(True)作用就是指定开启还是关闭反锯齿功能
  26. # text_color 文本颜色
  27. # button_color 背景色
  28. self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
  29. self.msg_image_rect = self.msg_image.get_rect() # 根据文本图像创建一个矩形,并将其中心点 设置为中心点
  30. self.msg_image_rect.center = self.rect.center # 让文本上居中
  31. def draw_button(self):
  32. # 绘制一个用颜色填充的按钮,在绘制文本
  33. self.screen.fill(self.button_color, self.rect) # 使用 screen.fill绘制按钮的矩形
  34. self.screen.blit(self.msg_image, self.msg_image_rect) # 在使用 screen.blit 在调用函数并向它传递一副图像以及与该图相关联的rect

8、游戏计分文件:scoreboard.py

  1. # -*- coding: GBK -*-
  2. import pygame.font
  3. from pygame.sprite import Group
  4. from aircraft_battle_ship import Ship
  5. class Scoreboard:
  6. """显示得分信息的类"""
  7. def __init__(self, ai_game):
  8. """初始化显示得分涉及的属性"""
  9. self.screen = ai_game.screen
  10. self.ai_game = ai_game
  11. self.screen_rect = self.screen.get_rect()
  12. self.settings = ai_game.settings
  13. self.stats = ai_game.stats
  14. # 显示得分信息时使用的字体设置
  15. self.text_color = (30, 30, 30) # 设置文本颜色
  16. self.font = pygame.font.SysFont(None, 48) # 设置字体,以及字体大小
  17. # 准备初始得分图像
  18. self.prep_score()
  19. self.prep_heigh_score()
  20. self.prep_level()
  21. self.prep_ships()
  22. def prep_score(self):
  23. """将得分转换为渲染图"""
  24. rounded_score = round(self.stats.score, - 1)
  25. # round 函数 让小数精确到小数点后的某一位,其中小数点位数是由第二个实参指定,然而为负数,round将舍入到最近的10倍,如10,100,1000等
  26. score_str = "{:,}".format(rounded_score)
  27. # score_str = str(self.stats.score) # 将数值转换为字符串
  28. self.score_image = self.font.render(score_str, True, self.text_color, self.settings.bg_color)
  29. # 在屏幕右上角显示得分
  30. # 将得分放置屏幕又上角,并在得分增大导致数变宽时让其向右延伸
  31. self.score_rect = self.score_image.get_rect() # 确保得分始终锚定在屏幕右边,定义一个score_rect
  32. self.score_rect.right = self.screen_rect.right - 20 # 屏幕右边缘相距20 px
  33. self.score_rect.top = 20 # 让其边缘与屏幕边缘也相距20px
  34. def show_score(self):
  35. """在屏幕上显示得分、等级和剩余飞船"""
  36. self.screen.blit(self.score_image, self.score_rect) # 得分
  37. self.screen.blit(self.high_score_image, self.high_score_rect) # 最高分
  38. self.screen.blit(self.level_image, self.level_rect) # 等级
  39. self.ships.draw(self.screen) # 剩余飞船
  40. def prep_heigh_score(self):
  41. """将最高得分转换为渲染的图像"""
  42. high_score = round(self.stats.high_score, -1)
  43. high_score_str = "{:,}".format(high_score)
  44. self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.settings.bg_color)
  45. # 将最高得分放在屏幕顶部中央
  46. self.high_score_rect = self.high_score_image.get_rect()
  47. self.high_score_rect.centerx = self.screen_rect.centerx
  48. self.high_score_rect.top = self.score_rect.top
  49. def check_high_score(self):
  50. """检查是否诞生了新的最高分"""
  51. if self.stats.score > self.stats.high_score: # 如果得的分数大于 最高分则替换最高分的值
  52. self.stats.high_score = self.stats.score
  53. self.prep_heigh_score()
  54. def prep_level(self):
  55. """将等级转为渲染图片"""
  56. level_str = str(self.stats.level)
  57. self.level_image = self.font.render(level_str, True, self.text_color, self.settings.bg_color)
  58. # 将等级放在得分下
  59. self.level_rect = self.level_image.get_rect()
  60. self.level_rect.right = self.score_rect.right
  61. self.level_rect.top = self.score_rect.bottom + 10 # 与上面图像的属性大于10 px 以便得分和等级之间留出一定缝隙
  62. def prep_ships(self):
  63. """显示剩余飞船"""
  64. self.ships = Group() # 创建一个空编组
  65. for ship_number in range(self.stats.ship_left): # 根据玩家剩余飞船运行一个循环
  66. ship = Ship(self.ai_game) # 设定一个需要添加编组的值
  67. ship.rect.x = 10 + ship_number * ship.rect.width # 将飞船放置屏幕左上角,并设置每艘飞船左边距为 10 px
  68. ship.rect.y = 10 # 在设置飞船距离 y 坐标距离屏幕上方10px
  69. self.ships.add(ship) # 设定好后 加入编组

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/105394
推荐阅读
相关标签
  

闽ICP备14008679号