这里写目录标题

  • 一、思维导图
  • 1、创建Pygame窗口及响应用户输入(主)
  • 2、飞船
  • 3、外星人
  • 4、设置类
  • 5、状态类
  • 6、最终效果图
  • 7、源代码下载

以下为部分代码展示,更多完整核心代码详见源代码下载

一、思维导图

1、创建Pygame窗口及响应用户输入(主)

import sys
import pygame  # 包含开发游戏需要的功能from summer_day1.alien_invasion.settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alien
from time import sleep
from game_stats import GameStats
from button import BUtton
from scoreboard import Scoreboardclass AlienInvasion:"""掌握游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源"""pygame.init()# 12.3.3创建设置类self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self._init_parameters()def _init_parameters(self):"""引入其他各种"""# 引入飞船self.ship = Ship(self)# 创建存储子弹的编组self.bullets = pygame.sprite.Group()# 创建存储外星人的编组self.aliens = pygame.sprite.Group()self._creat_fleet()# 创建一个用于存储游戏统计信息的实例self.stats = GameStats(self)# 创建一个按钮self.play_button = BUtton(self, "Play")# 创建一个记分牌self.sb = Scoreboard(self)def run_game(self):"""开始游戏的主循环"""while True:self._check_events()if self.stats.game_active:self.ship.update()self._update_bullets()self._update_aliens()self._update_screen()# 将run_game中的代码重构为以下两个辅助方法def _check_events(self):"""响应按键和鼠标事件:return:"""# 监视键盘和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:self._game_over()  # 用sys中工具退出elif event.type == pygame.KEYDOWN:self.check_keydown_events(event)elif event.type == pygame.KEYUP:self.check_keyup_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()  # 获取单击位置self._check_play_button(mouse_pos)# 监视键盘的按下事件def check_keydown_events(self, event):if event.key == pygame.K_RIGHT:# 向右一定飞船self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:# 向左self.ship.moving_left = Trueelif event.key == pygame.K_DOWN:# 向下self.ship.moving_down=Trueelif event.key == pygame.K_UP:#向上self.ship.moving_up = True# self.ship.rect.y -= 1# 按q退出elif event.key == pygame.K_q:self._game_over()# 按空格发射子弹elif event.key == pygame.K_SPACE:self._fire_bullet()# 按p开始游戏,游戏开始后按此无效elif event.key == pygame.K_p and not self.stats.game_active:self._start_game()elif event.key == pygame.K_ESCAPE:# 按esc全屏self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightself.ship = Ship(self)#按q暂停elif event.key == pygame.K_s:if self.stats.game_active:self.stats.game_active = Falsepygame.mouse.set_visible(True)self.play_button._pre_msg("Continue")else:self.stats.game_active=Truepygame.mouse.set_visible(False)# 监视键盘的松开事件def check_keyup_events(self, event):if event.key == pygame.K_RIGHT:# 向右一定飞船self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:# 向左self.ship.moving_left = Falseelif event.key == pygame.K_DOWN:# 向下self.ship.moving_down=Falseelif event.key == pygame.K_UP:#向上self.ship.moving_up = Falsedef _check_play_button(self, mouse_pos):"""在玩家单击play按钮开始新游戏"""# 检查鼠标单机位置是否在play按钮的rect内button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:self._start_game()def _start_game(self):"""游戏开始"""self.stats.reset_status()self.stats.game_active = True# 重置得分self.sb.prep_score()# 重置等级self.sb.prep_level()#重置初始飞船量self.sb.prep_ships()# 重置为初始速度self.settings.initialize_dynamic_settings()# 清空余下的外星人和子弹self.aliens.empty()self.bullets.empty()# 创建一群新的外星人并让飞船居中self._creat_fleet()self.ship.center_ship()# 隐藏光标pygame.mouse.set_visible(False)def _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中:return:"""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):"更新子弹的位置并删除消失的子弹""更新子弹的位置"self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)# print(len(self.bullets))self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):"""响应子弹和外星人碰撞"""# 检查是否有子弹击中了外星人,# 如果是,则删除对应的外星人和子弹# True就消失# flase,true 则只有外星人消失collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)  # 进行比较,观察是否重叠if collisions:for aliens in collisions.values():self.stats.score += self.settings.alien_points * len(aliens)  # 一颗子弹可能击中多个self.sb.prep_score()  # 更新一下得分self.sb.check_high_score()  # 更新一下最高分self.start_new_level()def start_new_level(self):"""在外星人群体消失干净后进入下一等级"""# 检查aliens是否为空if not self.aliens:self.bullets.empty()  # 清空所有子弹self._creat_fleet()self.settings.increase_speed()# 提高等级self.stats.level += 1self.sb.prep_level()def _creat_fleet(self):"""创建外星人群"""# 先建个外星人看看x,yalien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - (2 * alien_width)  # 减去俩边边距的可用空间number_aliens_x = available_space_x // (2 * alien_width)  # 计算一行有多少个外星人available_space_y = self.settings.screen_height - (3 * alien_height) - self.ship.rect.height  # 减去俩边边距的可用空间number_rows = available_space_y // (2 * alien_height)  # 计算可以容纳几行外星人# 创建第一行外星人for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._creat_alien(alien_number, row_number)def _creat_alien(self, alien_number, row_number):"""创建一个外星人并放在当前行"""new_alien = Alien(self)alien_width, alien_height = new_alien.rect.size  # 获取个宽度,高度new_alien.x = alien_width + 2 * alien_width * alien_numbernew_alien.y = alien_height + 2 * alien_height * row_numbernew_alien.rect.x = new_alien.x  # 更新rect对象new_alien.rect.y = new_alien.y  # 更新rect对象self.aliens.add(new_alien)def _check_fleet_edges(self):"""有外星人达到边缘时采取相应的措施"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""将整体下移,并改变方向"""for alien in self.aliens.sprites():alien.rect.y += self.settings.alien_fleet_drop_speedself.settings.alien_fleet_direction *= -1def _update_aliens(self):"""检查有木有外星人到边缘,并更新位置"""self._check_fleet_edges()self.aliens.update()# 检查外星人和飞船的碰撞if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()# 检查是否有外星人到达了底部self._check_aliens_bottom()def _check_aliens_bottom(self):"""检查是否有外星人到达了底部"""screen_rent = self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rent.bottom:# 像飞船碰到一样处理self._ship_hit()breakdef _ship_hit(self):"""响应飞船被外星人撞到"""if self.stats.ships_left > 0:self.stats.ships_left -= 1#更新剩余飞船数self.sb.prep_ships()# 清空剩下的外星人和子弹self.aliens.empty()self.bullets.empty()# 创建一群新的外星人self._creat_fleet()self.ship.center_ship()# 暂停一下sleep(0.5)else:self.stats.game_active = Falseself.play_button._pre_msg("Play")# 显示鼠标光标pygame.mouse.set_visible(True)# print("game over")def _update_screen(self):"""更新屏幕上的图像,并切换到新的屏幕"""# 每次循环重绘self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)self.sb.show_score()# 如果游戏处于非活动状态,则绘制play按钮if not self.stats.game_active:self.play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()def _game_over(self):with open('high_score.txt','w') as f:high_score=str(self.stats.high_score)f.write(high_score)sys.exit()if __name__ == "__main__":ai = AlienInvasion()ai.run_game()

2、飞船

import pygame
from pygame.sprite import Spriteclass Ship(Sprite):"""管理飞船的类"""def __init__(self, ai_game):"""初始化飞船并设置其初始位置:param ai_game:"""super(Ship, self).__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()# 加载飞船并获取其外接矩阵self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部中央self.rect.midbottom = self.screen_rect.midbottom# 在飞船属性中存储小数值self.x = float(self.rect.x)self.y = float(self.rect.y)# 移动标志self.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falsedef blitme(self):"""在指定位置绘画飞船:return:"""self.screen.blit(self.image, self.rect)def update(self):"根据移动标志来调整飞船状态"# 更新飞船而非rect对象的值if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speedif self.moving_up and self.rect.top > 0:self.y -= self.settings.ship_speedif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.y += self.settings.ship_speed# 根据self.x,y更新rect对象self.rect.x = self.xself.rect.y=self.ydef center_ship(self):"""让飞船在屏幕底端居中"""self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)self.y = float(self.rect.y)

3、外星人

import pygame
from pygame.sprite import Sprite  # 他是pygame本身自带的一个精灵class Alien(Sprite):"""表示单个外星人"""def __init__(self, ai_game):""" 初始化外星人并设置其起始位置"""super(Alien, self).__init__()self.screen = ai_game.screenself.settings=ai_game.settings# 加载外星人的图像并设置rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 储存外星人的精确水平self.x = float(self.rect.x)self.y = float(self.rect.y)def update(self):""" 向右移动外星人"""self.x+=(self.settings.alien_speed*self.settings.alien_fleet_direction)self.rect.x=self.xdef check_edges(self):"如果外星人位于屏幕边缘,就返回True"screen_rent=self.screen.get_rect()if self.rect.right>=screen_rent.right or self.rect.left<=0:return True

4、设置类

# 12.3.3创建设置类
class Settings:"""存储游戏中的谁有设置类"""def __init__(self):"""初始化游戏设置"""# 设置屏幕self.screen_width = 1000self.screen_height = 600# 设置颜色self.bg_color = (240, 240, 255)#设置最大飞船量self.ship_limit=3# 设置子弹self.bullet_width = 3self.bullet_height = 5self.bullet_color = (60, 60, 60)# 设置最大存储子弹数self.bullets_allowed = 3#撞到边缘后的垂直速度self.alien_fleet_drop_speed=3#加快游戏节奏self.speedup_scale=1.1#分数的提高速度self.score_scale=1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""初始化随游戏进行而发生变化的设置"""#设置子弹速度self.bullet_speed = 1# 设置船速度self.ship_speed = 1# 设置外星人移动速度self.alien_speed = 0.5# 1右-1左self.alien_fleet_direction = 1#击杀一个外星人的得分self.alien_points=50def increase_speed(self):"""提高速度设置和外星人分数"""#船,子弹,外星人self.ship_speed*=self.speedup_scaleself.bullet_speed*=self.speedup_scaleself.alien_speed*=self.speedup_scale#提高子弹量self.bullets_allowed+=1#单个外星人的得分self.alien_points=int(self.alien_points*self.score_scale)

5、状态类

class GameStats:"""跟踪游戏的统计信息"""def __init__(self, ai_game):"""初始化统计信息"""self.settings = ai_game.settingsself.reset_status()# 让游戏一开始处于非活动状态self.game_active = False# 最高得分self.high_score = int(self.read_high_score())# 显示等级self.level = 1def reset_status(self):"""初始化在游戏运行期间可能变化的统计信息"""self.ships_left = self.settings.ship_limitself.score = 0def read_high_score(self):with open("high_score.txt")as f:high=f.read()return high

6、最终效果图

7、源代码下载

欢迎star

python小游戏之外星人入侵之pygame实战应用(含源码下载)相关推荐

  1. [转载]腾讯云大学大咖分享 |小游戏联机对战引擎实践(含源码)

    一个高效率的学习安排,应该是:10%时间,了解行业和技术的发展动态:40%的时间,看教程和慕课:30%的时间,看别人写的代码样例.这三件事做完,最后20%时间再动手编程.看资料和教程,占多数时间.资料 ...

  2. Java实现拼图小游戏(5)—— 美化界面(含源码阅读)

    美化界面 一.前言 二.添加背景图 1.注意事项 2.创建图片对象 3.创建JLabel的对象(一个用来放图片的容器) 4.调整位置 5.将容器放到界面中 6.优化代码 三.添加边框 1.查看源码 2 ...

  3. java小游戏------Flappy Bird(飞翔的小鸟含源码)

    前言:本小游戏可作为java入门阶段收尾创作. 需:掌握面向对象的使用,了解多线程和异常处理等知识. 如上图所示:我们需要绘制背景,小鸟,障碍物,当然也包括游戏开始界面以及死亡界面. 一:思路解析: ...

  4. 2021Autojs全网最全几十种小游戏和自阅合集 (含源码)

    此代码由日赚3万网autojs开发交流群整理提供,欢迎大家一起技术交流,查看更多脚本和源码: 一键加群.如有侵权,请联系我删除! //汉字大英雄.疯狂弹力球.水果爱消消.愤怒的小鸡.魔性小飞机.填空我 ...

  5. Python毕业设计基于django的就业系统项目(含源码)

    目录 一.Python毕业设计基于django的就业系统项目(含源码) 二.基于django的就业系统项目文件说明 一.Python毕业设计基于django的就业系统项目(含源码) 源 码 免 费 下 ...

  6. PHP单页面加密视频教程附源码,thinkphp3.2最新版本项目实战视频教程(含源码)

    php教程 当前位置:主页 > php教程 > thinkphp3.2最新版本项目实战视频教程(含源码) thinkphp3.2最新版本项目实战视频教程(含源码) 教程大小:2.1GB   ...

  7. 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】

    Python制作坤坤打篮球小游戏 序言 准备工作 开发环境 效果预览 开始界面 游戏规则 结束游戏 代码实现 序言 话说在前面,我不是小黑子~ 我是超级大黑子

  8. 【Python游戏】双人对战足球小游戏,堪比国足的技术 | 附带源码

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!! 源码领取:加Pyth ...

  9. 精选合辑 | 30个Python数据分析及实战项目(含源码)

    今天给大家推荐一个优质的Python公众号「法纳斯特」,作者:小F. 小F是211机械专业毕业的,上学的时候还造了两辆车(FSC.无碳小车),毕业以后又在车企搬了一年的砖,最终决定转行IT,从零开始学 ...

最新文章

  1. 循环求100内质数 php_C8循环
  2. 风控建模中的样本偏差与拒绝推断
  3. nodejs应用错误消息PayloadTooLarge的处理
  4. 前端学习(1432):模板引擎概述
  5. php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例
  6. FPGA的一些细节(持续更新)
  7. 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
  8. iOS设备是否越狱的判断代码
  9. 用php设置留言无数据库_PHP留言板无数据库版
  10. 如何删除Eclipse中的中文包,让中文Eclipse显示英文
  11. 宇视摄像机如何修改设备IP地址
  12. SM2258XT量产工具教程,SM2258XT_Q0816A+B05 B16 B17的正确开卡步骤
  13. 解析人工智能与高等教育中的大数据
  14. 高一计算机课期中考试总结反思,高一期中考试总结反思
  15. 免费获取ps密钥_ps密钥
  16. fatal error C1083,但文件确实却在,也能加载
  17. ①读后感之《当我们谈论爱情时我们在谈论什么》┊(美)雷蒙德.卡佛
  18. 解密区块链最强心脏 迅雷链共识算法详解
  19. 从浏览器输入URL到页面显示的过程
  20. Java 添加、读取、删除PPT文档属性

热门文章

  1. 远程linux云主机,Linux实验室 远程连接Linux云主机方法
  2. mapbox中文地图_使用 Mapbox 地图
  3. 车载兴起已成必然,最新《Android车载操作系统开发指南》开源分享
  4. C4D骨骼动画绑定到像素
  5. 学算法怎么样?算法工程师薪资前景好吗?
  6. http://www.sciencedirect.com/ 外文文献免费全文下载方法
  7. 华为hcia-datacom 学习日记
  8. python自定义安装选项_Python安装教程详解
  9. 在线PDF编辑网站http://www.pdfescape.com
  10. JVM学习笔记07-垃圾回收