外星人入侵(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 的工作线程中&…

Vue 计算属性(Computed)传参

Vue 计算属性&#xff08;Computed&#xff09;传参 使用computed时&#xff0c;如果需要传递参数&#xff0c; 需要使用return返回一个带参数的函数。 简单示例 <template><div><div v-for"student in students" :key"student.id">&…

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;跟着我以下步骤一点一点来绝对可以实现。 最终效果图&#…

Linux中sort命令详解

Linux中sort命令详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入研究Linux系统中一个强大而实用的命令——sort&#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;忍不住分享一下…

前端发布静态资源自动增加版本号

前端服务发布&#xff0c;一些css,js文件的响应头会进行强缓存的设置&#xff0c;比如响应头&#xff1a;Cache-Control, Etag, Last-Modified等。结果就是浏览器会缓存这些静态资源文件&#xff0c;如果前端服务迭代发布了&#xff0c;即使静态资源进行了更新&#xff0c;但是…

studyNote-linux-shell-find-examples

前言&#xff1a;本文的例子均来源于man手册第一章节的find&#xff0c;man 1 find查看 e.g.01 手册原文: find /tmp -name core -type f -print | xargs /bin/rm -fFind files named core in or below the directory /tmp and delete them. Note that this will work incor…

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;下载安装包即可

java实现flv转mp4/视频格式转换

引言 今天在开发过程中&#xff0c;突然遇到给前端flv格式视频还播放不了&#xff0c;flv在开发印象中就是跟mp4格式差不多&#xff0c;本地静态视频资源&#xff0c;怎么还就播放不了&#xff0c;为此只能特别做下视频转换。 How to do 1.提前引入包 <!--视频多媒体工具…