外星人入侵(python)

前言

代码来源《python编程从入门到实践》Eric Matthes 署 袁国忠 译

使用软件:PyCharm Community Editor 2022

目的:记录一下按照书上敲的代码

alien_invasion.py

游戏的一些初始化设置,界面的大小,标题

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
from game_stats import  GameStatsdef run_game():# 初始化游戏并创建一个屏幕对象pygame.init()ai_settigns = Settings()# 里面是一个元组screen = pygame.display.set_mode((ai_settigns.screen_width, ai_settigns.screen_height))# 窗口尺寸,宽高# screen=pygame.display.set_mode((1200,800))# 窗口标题pygame.display.set_caption("Alien Invasion")#创建一个用于存储游戏统计信息的实例stats=GameStats(ai_settigns)# 设置背景色# bg_color=(230,230,230)# 创建一艘飞船、一个子弹编组和一个外星人编组ship = Ship(ai_settigns, screen)# 创建一个用于存储子弹的编组bullets = Group()# 创建一个外星人# alien=Alien(ai_settigns,screen)aliens = Group()# 创建外星人群gf.create_fleet(ai_settigns, screen, ship, aliens)# 开始游戏的主循环while True:gf.check_events(ai_settigns, screen, ship, bullets)if stats.game_active:ship.update()gf.update_bullets(ai_settigns, screen, ship, aliens, bullets)gf.update_aliens(ai_settigns,stats,screen,ship, aliens,bullets)# print(len(bullets))gf.update_screen(ai_settigns, screen, ship, aliens, bullets)# 监视键盘和鼠标事件# for event in pygame.event.get():#     if event.type==pygame.QUIT:#         sys.exit()# 每次循环都重绘屏幕# screen.fill(bg_color)# screen.fill(ai_settigns.gb_color)# ship.blitme()# 让最近绘制的屏幕可见# pygame.display.flip()run_game()

game_functions.py

 游戏主体


import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleepdef check_keydown_events(event, ai_settings, screen, ship, bullets):# 响应按键if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)# 按下键盘上的q键同样关闭游戏界面(需要是英文状态下)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event, ship):# 响应松开if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings, screen, ship, bullets):# 响应按键和鼠标事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:# if event.key == pygame.K_RIGHT:#     ship.moving_right = True# elif event.key == pygame.K_LEFT:#     ship.moving_left = Truecheck_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:# if event.key == pygame.K_RIGHT:#     ship.moving_right = False# elif event.key == pygame.K_LEFT:#     ship.moving_left = Falsecheck_keyup_events(event, ship)def update_screen(ai_settings, screen, ship, aliens, bullets):# 更新屏幕上的图像,并切换到新屏幕# 每次循环时都重绘屏幕screen.fill(ai_settings.gb_color)# 在飞船和外星人后面重绘所有子弹for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)# 让最近绘制的屏幕可见pygame.display.flip()def update_bullets(ai_settings, screen, ship, aliens, bullets):# 更新子弹的位置,并删除已经消失的子弹# 更新子弹的位置bullets.update()# 删除已经消失的子弹for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)# 检查是否有子弹击中了外星人# 如果是这样,就删除相应的子弹和外星人check_bullet_alien_collision(ai_settings, screen, ship, aliens, bullets)def check_bullet_alien_collision(ai_settings, screen, ship, aliens, bullets):# 响应子弹和外星人的碰撞# 删除发生碰撞的子弹和外星人collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if len(aliens) == 0:# 删除现有的子弹并新建一群外星人bullets.empty()create_fleet(ai_settings, screen, ship, aliens)def fire_bullet(ai_settings, screen, ship, bullets):# 如果还没有到达限制,就发射一颗子弹# 创建一颗子弹,并将其加入到编组bullets中if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def create_fleet(ai_settings, screen, ship, aliens):# 创建一个外星人群# 创建一个外星人,并计算每行可容纳多少个外星人alien = Alien(ai_settings, screen)number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)# 创建外星人群for row_number in range(number_rows):for alien_number in range(number_aliens_x):# 创建一个外星人并将其加入当前行create_alien(ai_settings, screen, aliens, alien_number, row_number)def get_number_aliens_x(ai_settings, alien_width):# 计算每行可容纳多少个外星人available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(ai_settings, screen, aliens, alien_number, row_number):# 创建一个外星人并将其放在当前行# 外星人间距为外星人的宽度alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)def get_number_rows(ai_settings, ship_height, alien_height):# 计算屏幕可容纳多少行外星人available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height)number_rows = int(available_space_y / (2 * alien_height))return number_rowsdef update_aliens(ai_settings, stats, screen, ship, aliens, bullets):# 检查是否有外星人位于屏幕边缘,更新外星人群中所有外星人的位置check_fleet_edges(ai_settings, aliens)aliens.update()# 检测外星人和飞船之间的碰撞if pygame.sprite.spritecollideany(ship, aliens):print("Ship hit!!!")ship_hit(ai_settings, stats, screen, ship, aliens, bullets)# 检查是否有外星人到达屏幕底端check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets)def check_fleet_edges(ai_settings, aliens):# 有外星人到达边缘采取相应的措施for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_settings, aliens):# 将整群外星人下移,并改变他们的方向for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):# 响应被外星人撞到的飞船if stats.ships_left > 0:# 将ships_letf减1stats.ships_left -= 1# 清空外星人列表和子弹列表aliens.empty()bullets.empty()# 创建一群新的外星人,并将飞船放到屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.game_active = Falsedef check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):# 检查是否有外星人到达了屏幕底端screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 向飞船被撞到一样进行处理ship_hit(ai_settings, stats, screen, ship, aliens, bullets)break

settings.py

游戏的一些初始化数据的储存,子弹的速度,大小,屏幕的大小

class Settings():# 储存《外星人入侵》所设置的类def __init__(self):# 初始化游戏的设置# 屏幕设置self.screen_width = 1200self.screen_height = 800self.gb_color = (230, 230, 230)# 飞船设置# 位置self.ship_speed_factor = 1.5self.ship_limit = 3# 子弹设置(宽高,颜色)self.bullet_speed_factor = 1  # 速度self.bullet_width = 3  # 宽度self.bullet_height = 15  # 高度self.bullet_color = 60, 60, 60  # 颜色self.bullets_allowed = 3# 外星人设置self.alien_speed_factor = 1self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1

ship.py

 飞船的初始化信息和移动

import pygameclass Ship():def __init__(self, ai_settings, screen):# 初始化飞船并设置其初始位置self.screen = screenself.ai_settings = ai_settings# 加载飞船图像并获取外接矩形self.image = pygame.image.load('images/ship.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 在飞船的属性center中存储小数值self.center = float(self.rect.centerx)# 移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):# 根据移动标志调整飞船的位置# 更新飞船的center值,而不是rect# if self.moving_right:# 增加不能越界的条件if self.moving_right and self.rect.right < self.screen_rect.right:# self.rect.centerx += 1self.center += self.ai_settings.ship_speed_factor# elif self.moving_left:if self.moving_left and self.rect.left > 0:# self.rect.centerx -= 1self.center -= self.ai_settings.ship_speed_factor# 根据self.center更新rect对象self.rect.centerx = self.centerdef blitme(self):# 在指定位置绘制飞船self.screen.blit(self.image, self.rect)def center_ship(self):# 让飞船在屏幕上居中self.center = self.screen_rect.centerx

alien.py

外星人的初始信息和移动

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):# 表示单个外星人的类def __init__(self, ai_settings, screen):# 初始化外星人并设置起始位置super(Alien, self).__init__()self.screen = screenself.ai_settins = ai_settings# 加载外星人图像,并设置其rect属性self.image = pygame.image.load('images/alien.png')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的准确位置self.x = float(self.rect.x)def blitme(self):# 在指定位置绘制外星人self.screen.blit(self.image, self.rect)def update(self):# 向右、左移动外星人# self.x += self.ai_settins.alien_speed_factorself.x += (self.ai_settins.alien_speed_factor * self.ai_settins.fleet_direction)self.rect.x = self.xdef check_edges(self):# 如果外星人位于屏幕边缘,就返回Truescreen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return True

bullet.py

子弹的显示

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):# 一个对飞船发射的子弹进行管理的类def __init__(self, ai_settings, screen, ship):# 在飞船所处的位置创建一个子弹对象super(Bullet, self).__init__()self.screen = screen# 在(0,0)处创建一个表示子弹的矩形,在设置正确的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top# 存储用小数表示的子弹位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):# 向上移动子弹# 更新表示子弹位置的小数值self.y -= self.speed_factor# 更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):# 在屏幕上绘制子弹pygame.draw.rect(self.screen, self.color, self.rect)

game_stats.py

游戏是否结束

class GameStats():# 跟踪游戏的统计信息def __init__(self, ai_settings):# 初始化统计信息self.ai_settings = ai_settingsself.reset_stats()# 游戏刚启动时处于活动状态self.game_active=Truedef reset_stats(self):# 初始化在游戏运行期间可能变化的统计信息self.ships_left = self.ai_settings.ship_limit

我们的飞船和下面的飞船相撞或者撞到下面的墙都会输出:“Ship hit!!!”

 

总结

主要是记录一下这个,毕竟敲了这么久了,不过还是要理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Tomcat与网络10】Tomcat I/O和线程池的并发调优

前面我们看了提高Tomcat启动速度的措施&#xff0c;这里我们看一下如何提高Tomcat的性能。 Tomcat 的调优涉及 I/O 模型和线程池调优、JVM 内存调优以及网络优化等&#xff0c;今天我们来聊聊 I/O 模型和线程池调优&#xff0c;由于 Web 应用程序跑在 Tomcat 的工作线程中&…

075:vue+mapbox 利用高德地址逆转换,点击地图,弹出地址信息

第075个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。同时这个底图是天地图的图像和标记。 直接…

Elasticsearch:构建自定义分析器指南

在本博客中&#xff0c;我们将介绍不同的内置字符过滤器、分词器和分词过滤器&#xff0c;以及如何创建适合我们需求的自定义分析器。更多关于分析器的知识&#xff0c;请详细阅读文章&#xff1a; 开始使用 Elasticsearch &#xff08;3&#xff09; Elasticsearch: analyzer…

MYSQL的配置和安装

下载安装 打开官网 MYSQL官网 点击DOWNLOADS 滑到最低下点击&#xff1a;MYSQL Community(GPL) Downlads 点击Download Archives 点击MySQL Community Server进入网站 选择相应版本下载&#xff0c;这里选择的是5.7.24版本,x86 64位【按需选择】 下载解压 配置文件…

Node.js Express 框架 2024版 笔记

1.0 操作命令 Node.js express 框架 https://www.expressjs.com.cn/ npm install -g express-generator expressexpress --pug --git // --pug 添加对 pug 模板引擎的支持 // --git 添加 .gitignore 代码仓库排除 //无法直接安装新版pug模板 npm i npm …

uniApp开发小程序自定义tabBar底部导航栏+tabBar中间凸起自定义样式实现

先看效果是否可以满足你们&#xff0c;如果可以满足你只要一步一步照着做绝对没有错。 本人技术不佳&#xff0c;研究了一整天&#xff0c;全网的大佬们写的博客看的晕头转向&#xff0c;避免大伙再走弯路&#xff0c;跟着我以下步骤一点一点来绝对可以实现。 最终效果图&#…

万兆电口模块10GBase-T:提升网络性能的利器

随着数字化时代的到来&#xff0c;数据传输速度已经成为各行各业不可或缺的一项需求。而在数据中心和企业网络中&#xff0c;网络设备也正面临着越来越高的带宽需求。在满足这一需求的过程中&#xff0c;万兆电口模块10GBase-T成为了一种重要的解决方案。本文将围绕万兆电口模块…

工作七年,对消息推送使用的一些经验和总结

前言&#xff1a;不管是APP还是WEB端都离不开消息推送&#xff0c;尤其是APP端&#xff0c;push消息&#xff0c;小信箱消息&#xff1b;WEB端的代办消息等。因在项目中多次使用消息推送且也是很多项目必不可少的组成部分&#xff0c;故此总结下供自己参考。 一、什么是消息推…

最短路径 ( floyd) 算法

Floyd算法又称为插点法&#xff0c;是一种用于寻找给定的加权图中多源点之间最短路径的算法。 算法思想: https://upimg.baike.so.com/doc/5450540-5688910.html 图演示: 代码实现: public void floyd() {int[] vertex graph.getVertex();int[][] edges graph.getEdges()…

<网络安全>《12 数据库安全审计系统》

1 概念 数据库安全审计系统通过对用户访问数据库行为的记录、分析和汇报&#xff0c;来帮助用户事后生成合规报告、事故追根溯源&#xff0c;同时通过大数据搜索技术提供高效查询审计报告&#xff0c;定位事件原因&#xff0c;以便日后查询、分析、过滤&#xff0c;实现加强内…

【算法】拦截导弹(线性DP)

题目 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于该系…

VUE3+elementPlus 之 Form表单校验器 之 字符长度校验

需求&#xff1a;校验字符长度&#xff0c;超过后仍可输入&#xff0c;error提示录入字符数与限制字符数 校验字符长度&#xff1a; /*** 检验文字输入区的长度* param {*} rule 输入框的rule 对象&#xff0c;field&#xff1a;字段名称* param {*} value …

【百度Apollo】本地调试仿真:加速自动驾驶系统开发的利器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

Unity | 资源热更(YooAsset AB)

目录 一、AssetBundle 1. 插件AssetBundle Browser 打AB包 &#xff08;1&#xff09;Unity&#xff08;我用的版本是2020.3.8&#xff09;导入AssetBundle Browser &#xff08;2&#xff09;设置Prefab &#xff08;3&#xff09;AssetBundleBrowser面板 2. 代码打AB包…

nodejs历史版本下载

Node.js — Previous Releases下载地址 .msi 是安装包&#xff08;windows&#xff09;&#xff0c;下载安装包即可

关于最小系统板PCB设计后的一些反思

简介 趁着刚刚画完板子寄回来&#xff0c;在这里做一些记录。 板子状况 这里打烊了5块PCB&#xff0c;但是没有进行SMT贴片&#xff0c;后续如果有芯片可以焊接上去进行后续验证。 封装问题 这里可以看到&#xff0c;我这里两侧的排针都是焊盘&#xff0c;不是通孔&#…

Unity_Timeline使用说明

Unity_Timeline使用说明 首先要找到工具吧&#xff1f;Unity2023.1.19f1c1打开如下&#xff1a; &#xff08;团结引擎没找见哪儿打开&#xff0c;可能是引擎问题吧&#xff1f;有知道的同学可以告诉我在哪儿打开&#xff09; Timelime使用流程&#xff1a; 打开之后会提示您…

ClickHouse为什么这么快(二)SSE指令优化

上一篇 ClickHouse为什么这么快&#xff08;一&#xff09;减少数据扫描范围 我们说到了ClickHouse中使用列存储&#xff0c;每个列都单独存储为一个文件&#xff0c;每个文件都是由一个或多个数据块组成&#xff0c;也就是说&#xff1a;每个文件由一个或多个数组组成&#xf…

3分钟阅读100篇文献?GPT可以做到!

摘要和背景 PPMAN-AI 01 在开始深入阅读之前&#xff0c;了解文献的主题和背景是非常重要的。这可以帮助你快速判断该文献是否符合你的研究需求。 prompt&#xff1a; 请简述文献[文献标题]的摘要。 解释文献[文献标题]中提到的研究背景。 文献[文献标题]的主要研究目的是什…

WordPress块编辑器(Gutenberg古腾堡)中如何添加脚注?

WordPress默认自带的块编辑器​&#xff08;Gutenberg古腾堡编辑器&#xff09;本身就自带添加脚注功能&#xff0c;不过经典编辑器不行。如果想要在WordPress中添加更加专业的脚注&#xff0c;建议使用Modern Footnotes插件&#xff0c;具体介绍及使用请参考『WordPress站点如…