古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼 这次用Python中的 成品效果 此贴为这个小游戏的完整代码,带有完整的注释,另外一个贴中有完整的流程。传送门 要完成这个项目肯定要安装 首先通过命令行工具检测系统是否安装的 小甜是Windows系统,这里只提供Windows系统的检测方法 如果未安装则安装 安装完毕以后退回第一步重新检测 安装 或者通过 通过 文件名为 文件名为 文件名为 文件名为 文件名为 文件名为 文件名为 文件名为 文件名为 终于把这个小项目给完成了,这里用的 现在好好休息几天,开始学习爬虫 座右铭:不要在该奋斗的年纪选择安逸!!偷学Python之最后的项目二:飞机大战小游戏(纯代码)
甜甜先说
pygame
模块来完成一个飞机大战的小游戏;基本思路是通过方向键来控制飞机的左右移动射击飞船。
文章目录
安装pygame
pygame
第三方库,安装流程如下
pip
工具python -m pip --version
pip
工具,安装则请跳过这一步python get-pip.py
pygame
python -m pip install pygame --user
pycharm
安装第三个库,流程如下import
关键字导入第三方库import pygame
小飞机类
plane.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/4 """ class GameStats: """跟踪游戏统计信息""" def __init__(self, setting): self.setting = setting self.reset_stats() # 游戏默认为不活动状态 self.game_active = False # 最高得分 self.high_score = 0 def reset_stats(self): # 初始化在游戏运行期间可能变化的统计信息 self.planes_left = self.setting.plane_limit # 统计得分 self.score = 0
子弹类
bullet.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/3 """ import pygame from pygame.sprite import Sprite class Bullet(Sprite): # 继承pygame.sprite中的Sprite类 """子弹的管理""" def __init__(self, setting, screen, plane): super().__init__() self.screen = screen # 在(0,0)处创建一个表示子弹的矩形 # pygame.Rect # 用于存储直角坐标的pygame对象 self.rect = pygame.Rect(0,0, setting.bullet_width, setting.bullet_height) # 设置显示的位置 self.rect.centerx = plane.rect.centerx self.rect.top = plane.rect.top # 让子弹的位置跟小飞机重叠,当子弹飞出了以后,就显得跟从小飞机里面射出来一样 # 将子弹的坐标转换为浮点数 self.y = float(self.rect.y) # 子弹的颜色 self.color = setting.bullet_color # 子弹的速度 self.speed = setting.bullet_speed def update(self): # 向上移动子弹 self.y -= self.speed # 根据self.y的值更新self.rect.y self.rect.y = self.y def draw_bullet(self): """绘制子弹""" # pygame.draw.rect()画一个矩形的形状 pygame.draw.rect(self.screen, self.color, self.rect)
敌人类(飞船)
spaceship.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/4 """ import pygame from pygame.sprite import Sprite class Spaceship(Sprite): '''表示飞船的类''' def __init__(self, setting, screen): super().__init__() self.screen = screen self.setting = setting # 添加飞船图像 self.img = pygame.image.load("./imgs/enemy.png") # 获取rect属性 self.rect = self.img.get_rect() # 每个飞船最初都在屏幕左上角附近 self.rect.x = self.rect.width # 飞船图像的左边距等于图像的宽度 self.rect.y = self.rect.height # 飞船图书的上边距等于图像的高度 self.rect.w = self.rect.width self.rect.h = int(self.rect.height / 2) # 将高度设置为一半 self.x = float(self.rect.x) def blitme(self): # 绘制飞船图像 self.screen.blit(self.img, self.rect) def check_edges(self): '''如果有飞船位于屏幕边缘,就返回true''' screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True def update(self): """移动飞船""" self.x += (self.setting.spaceship_speed * self.setting.fleet_direction) self.rect.x = self.x
按钮类
button.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/5 """ import pygame.font class Button: def __init__(self, setting, screen, msg): """初始化按钮的属性""" self.screen = screen self.screen_rect = screen.get_rect() # 设置按钮的大小 self.width = 180 self.height = 50 # 设置按钮的颜色 self.button_color = (0, 255, 0) # 设置文本的颜色 self.text_color = (200, 200, 200) # 设置字体的大小 self.font = pygame.font.SysFont("SimHei", 50) # 字体为黑体大小为48像素 # 创建按钮的rect对象 self.rect = pygame.Rect(0, 0, self.width, self.height) # 使按钮居中 self.rect.center = self.screen_rect.center # 按钮的标签只需要创建一次 self.prep_msg(msg) def prep_msg(self, msg): # msg渲染为图像 """ font.render方法是将msg中的文本转换为图像 * 参数True是开启抗锯齿模式 * self.text_color是文本的颜色 * self.button_color是背景颜色 """ self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) # 使其在按钮上居中 self.msg_image_rect = self.msg_image.get_rect() self.msg_image_rect.center = self.rect.center def draw_button(self): # 绘制按钮 self.screen.fill(self.button_color, self.rect) # 用一个颜色填充文本 self.screen.blit(self.msg_image, self.msg_image_rect) # 绘制文本
记录游戏信息
game_stats.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/4 """ class GameStats: """跟踪游戏统计信息""" def __init__(self, setting): self.setting = setting self.reset_stats() # 游戏默认为不活动状态 self.game_active = False # 最高得分 self.high_score = 0 def reset_stats(self): # 初始化在游戏运行期间可能变化的统计信息 self.planes_left = self.setting.plane_limit # 统计得分 self.score = 0
记分类
scoreboard.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/5 """ import pygame.font from pygame.sprite import Group from plane import Plane class Scoreboard: """显示得分信息的类""" def __init__(self, setting, screen, stats): """初始化得分涉及到的属性""" self.screen = screen self.screen_rect = screen.get_rect() self.stats = stats self.setting = setting # 显示得分的字体设置 # 设置文本的颜色 self.text_color = (250, 250, 250) # 设置字体的大小 self.font = pygame.font.SysFont("SimHei", 40) # 字体为黑体大小为40像素 # 初始化得分图像 self.prep_score() # 初始化最高分图像 self.prep_high_score() def prep_score(self): """将得分转换为图像""" score_str = str(self.stats.score) self.score_image = self.font.render(score_str, True, self.text_color) # 将得分放到屏幕的右上角 self.score_rect = self.score_image.get_rect() self.score_rect.right = self.screen_rect.right - 20 # 与右边差20 像素 self.score_rect.top = 20 # 与顶部差20像素 def prep_high_score(self): """将得分转换为图像""" high_score_str = str(self.stats.high_score) self.high_score_image = self.font.render(high_score_str, True, self.text_color) # 将得分放到屏幕的顶部中间 self.high_score_rect = self.high_score_image.get_rect() self.high_score_rect.centerx = self.screen_rect.centerx self.high_score_rect.top = 10 def show_score(self): """在屏幕上显示得分""" self.screen.blit(self.score_image, self.score_rect) # 显示最高分 self.screen.blit(self.high_score_image, self.high_score_rect)
游戏设置类
settings.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/3 """ import pygame import random class Settings: """存储飞机大战的所有设置""" def __init__(self): # 屏幕设置 self.screen_width = 1000 self.screen_height = 600 self.bg_img = pygame.image.load("./imgs/bg_img.png") #小飞机设置 # 小飞机的生命限制 self.plane_limit = 3 # 子弹的设置 self.bullet_width = 3 # 子弹的宽 self.bullet_height = 15 # 子弹的高 self.bullet_color = 190, 190, 190 # 子弹的颜色 # 限制子弹的数量 self.bullet_allowed = 5 # 飞船下降的速度 self.fleet_drop_speed = 10 # 以什么样的速度加快游戏节奏 self.speedup_scale = 1.2 # 提高分数的速度 self.score_scale = 1.5 self.initialize_dynamic_settings() def initialize_dynamic_settings(self): #小飞机设置 # 小飞机的移动速度 self.plane_speed = 2.5 # 子弹的设置 self.bullet_speed = 3 # 速度 # 飞船移动的速度 self.spaceship_speed = 2 # 标志位,1表示右移 -1表示左移 self.fleet_direction = 1 # 默认右移动 self.spaceship_points = 15 def increase_speed(self): """提高游戏节奏""" self.plane_speed *= self.speedup_scale self.bullet_speed *= self.speedup_scale self.spaceship_speed *= self.speedup_scale # 提高飞船的分数 self.spaceship_points = int(self.spaceship_points * self.score_scale)
游戏的所有函数
game_func.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/3 """ import sys from bullet import Bullet from spaceship import Spaceship import pygame from time import sleep def check_keydown_events(event, plane, setting, screen, bullets): # 捕捉用户按下 if event.key == pygame.K_RIGHT: # 当用户按下键位时标志位为True plane.mv_right = True elif event.key == pygame.K_LEFT: plane.mv_left = True elif event.key == pygame.K_SPACE: if len(bullets) <= setting.bullet_allowed: # 创建一个子弹,并将其加入到编组bullets中 new_bullet = Bullet(setting, screen, plane) bullets.add(new_bullet) def check_keyup_events(event, plane): # 捕捉用户松开 if event.key == pygame.K_RIGHT: # 当用户松开键位为false plane.mv_right = False elif event.key == pygame.K_LEFT: plane.mv_left = False def check_events(plane, setting, screen, bullets, stats, play_button, spaceships, score_board): # 为了防止游戏窗口启动会立马关闭,在其中增加一个游戏循环(无限循环), for event in pygame.event.get(): if event.type == pygame.QUIT: # QUIT用户请求程序关闭 sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event, plane, setting, screen, bullets) elif event.type == pygame.KEYUP: check_keyup_events(event, plane) elif event.type == pygame.MOUSEBUTTONDOWN: # 检测MOUSEBUTTONDOWN事件 mouse_x, mouse_y = pygame.mouse.get_pos() # 返回一个元组,包含鼠标单击时的坐标 check_play_button(plane, setting, screen, bullets, stats, play_button, mouse_x, mouse_y, spaceships, score_board) def check_play_button(plane, setting, screen, bullets, stats, play_button, mouse_x, mouse_y, spaceships, score_board): # 玩家单机play按钮时开始游戏 # collidepoint检测单击的位置是否在按钮的rect内 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y) if button_clicked and not stats.game_active: # 当stats.game_active的值为False时,取反才会执行 # 重置记分的所有图像 score_board.prep_score() score_board.prep_high_score() # 重置游戏设置 setting.initialize_dynamic_settings() # 隐藏光标 pygame.mouse.set_visible(False) # 游戏状态 stats.game_active = True # 重置游戏统计信息 stats.reset_stats() # 清空飞船列表和子弹列表 spaceships.empty() bullets.empty() # 让飞机居中 plane.center_plane() def update_screen(screen, bg_img, plane, bullets, spaceships, stats, play_button, score_board): # 更新屏幕的图像 # 每次循环都会重新绘制屏幕 screen.blit(bg_img, [0, 0]) # 绘制图像 # 绘制子弹 for bullet in bullets.sprites(): bullet.draw_bullet() # 绘制子弹 # 绘制飞机 plane.blitme() for spaceship in spaceships.sprites(): spaceship.blitme() # 显示得分 score_board.show_score() # 如果游戏处于非活动状态,绘制Play按钮 if not stats.game_active: play_button.draw_button() # 将完整显示Surface更新到屏幕 pygame.display.flip() def update_bullets(bullets, spaceships, setting, screen, plane, stats, score_board): # 将编组中的每个子弹调用bullet.update() bullets.update() # 删除已经消失的子弹 for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) collisions = pygame.sprite.groupcollide(bullets, spaceships, True, True) # 两个实参true则是为了将其删除 """这个字典中的键是打中小飞船的子弹,值则为一个列表,其中包含了所有被打中的值""" if collisions: # 当发生碰撞,会有有返回值,才会为True for spaceship in collisions.values(): """遍历这个字典,确保每个外星人的点数都计入得分""" stats.score += setting.spaceship_points * len(spaceship) # 发生碰撞加分 """因为子弹的值是一个列表,所有这里每次计算一下列表的长度来进行加分""" score_board.prep_score() # 并绘制在屏幕上 check_high_score(stats, score_board) if len(spaceships) == 0: bullets.empty() # 删除编组中的所有精灵(子弹) # 加快游戏节奏 setting.increase_speed() create_fleet(setting, screen, spaceships, plane) # 重新调用生成飞船 def get_number_spaceship_x(setting, spaceship_width): # 计算每行可以容纳多少个外星人的函数 # 计算可以容纳多个飞船的宽度 available_space_x = setting.screen_width - (2 * spaceship_width) number_spaceship_x = int(available_space_x / (2 * spaceship_width)) # 将其转换为整数 return number_spaceship_x def get_number_rows(setting, plane_height, spaceship_height): # 计算可以容纳多少行 available_space_y = setting.screen_height - 7 * spaceship_height - plane_height number_rows = int(available_space_y / spaceship_height) return number_rows def create_spaceship(setting, screen, spaceships, spaceship_number, number_rows): # 创建一个飞船并加入当前行 spaceship = Spaceship(setting, screen) spaceship_width = spaceship.rect.width # 飞船的宽度 spaceship.x = spaceship_width + 2 * spaceship_width * spaceship_number spaceship.rect.x = spaceship.x spaceship.rect.y = spaceship.rect.height + 2 * spaceship.rect.height * number_rows spaceships.add(spaceship) def create_fleet(setting, screen, spaceships, plane): # 创建一个飞船 spaceship = Spaceship(setting, screen) number_spaceship_x = get_number_spaceship_x(setting, spaceship.rect.width) number_rows = get_number_rows(setting, plane.rect.height, spaceship.rect.height) for row_number in range(number_rows): for spaceship_number in range(number_spaceship_x): # if stats.game_active: # 为真才会创建飞船 create_spaceship(setting, screen, spaceships, spaceship_number, row_number) def change_fleet_direction(setting, spaceships): """将所有飞船下移,并改变方向""" for spaceship in spaceships.sprites(): spaceship.rect.y += setting.fleet_drop_speed setting.fleet_direction *= -1 # 如果为1则相乘为-1,如果为-1相乘为1 def check_fleet_edges(setting, spaceships): """有飞船到达了边缘应采取的措施""" for spaceship in spaceships.sprites(): if spaceship.check_edges(): # 如果为true,已经到了边缘,就执行change_fleet_direction change_fleet_direction(setting, spaceships) break def plane_hit(setting, spaceships, plane, stats, screen, bullets): """ 有飞船撞击到飞机以后已经数量减1,创建一批新的飞创,并将飞机重新反之到屏幕的原始位置 还将引入time模块的sleep函数实现暂停的效果 """ if stats.planes_left > 0: stats.planes_left -= 1 # 将planes_left减1 # print(stats.planes_left) # 清空飞船和子弹的编组 spaceships.empty() bullets.empty() # 创建新的飞机和飞船 create_fleet(setting, screen, spaceships, plane) plane.center_plane() sleep(1) # 暂停1秒 else: stats.game_active = False # 将光标设置为显示 pygame.mouse.set_visible(True) def check_spaceship_bottom(setting, spaceships, plane, stats, screen, bullets): # 检测是否有飞船触碰到底部 screen_rect = screen.get_rect() for spaceship in spaceships.sprites(): if spaceship.rect.bottom >= screen_rect.bottom: # 跟飞船碰撞一样处理 plane_hit(setting, spaceships, plane, stats, screen, bullets) def update_spaceships(setting, spaceships, plane, stats, screen, bullets): # 更新飞船的位置 spaceships.update() # 检测时候又飞船处于边缘,并及时更新 check_fleet_edges(setting, spaceships) # 检测飞船与飞机直接的碰撞 ''' pygame.sprite.spritecollideany方法 * 接受两个参数,一个精灵和一个编组, * 检测编组中的成员是否与碰撞,如果检测到碰撞则停止遍历编组 * 如果没有发生碰撞则返回None ''' game_over = pygame.sprite.spritecollideany(plane, spaceships) if game_over: plane_hit(setting, spaceships, plane, stats, screen, bullets) # 检测是否有飞船落地 check_spaceship_bottom(setting, spaceships, plane, stats, screen, bullets) def check_high_score(stats, score_board): """用于检测是否产生最高分""" if stats.score > stats.high_score: stats.high_score = stats.score # 如果的得分大于最高分,则值赋给最高分 score_board.prep_high_score()
游戏的开始
plane_war.py
""" -*- coding:uft-8 -*- author: 小甜 date:2020/6/3 """ import pygame from settings import Settings # 引入settings.py from plane import Plane import game_func as fg from pygame.sprite import Group from game_stats import GameStats from button import Button from scoreboard import Scoreboard def run_game(): # 初始化游戏 pygame.init() # 设置屏幕的分辨率 setting = Settings() screen = pygame.display.set_mode((setting.screen_width, setting.screen_height)) # 大小为1000px乘以600px pygame.display.set_caption("飞机大战") # 标题 # 创建play按钮 play_button = Button(setting, screen, "Play") # 创建一个用于存储游戏统计信息的实例 stats = GameStats(setting) # 创建记分的实例 score_board = Scoreboard(setting, screen, stats) # 创建小飞机 plane = Plane(screen, setting) # 创建一个存储子弹的编组 bullets = Group() # 创建飞船编组 spaceships = Group() # 开始游戏的主循环 while True: # 不关闭窗口 fg.check_events(plane, setting, screen, bullets, stats, play_button, spaceships, score_board) if stats.game_active: # 根据游戏状态来判断是否需要创建其图像 # 调用小飞机移动的方法 plane.update() # 更新子弹位置 fg.update_bullets(bullets, spaceships, setting, screen, plane, stats, score_board) # 更新飞船位置 fg.update_spaceships(setting, spaceships, plane, stats, screen, bullets) # 绘制图像 fg.update_screen(screen, setting.bg_img, plane, bullets, spaceships, stats, play_button, score_board) run_game()
甜甜有话说
pygame
模块一边学一边这就很难哎,反正最后也弄出来
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算