pygame外星人入侵,【性能优化实战】-程序员宅基地

技术标签: 2024年程序员学习  python  pygame  

alien_invasion.py

创建pygame窗口

只需运行文件alien_invasion.py即可开始游戏,其他文件内容会被间接或直接导入到该文件

import sys

import pygame

from pygame.sprite import Group

from settings import Settings

from game_stats import GameSrats

from scoreboard import Scoreboard

from button import Button

from ship import Ship

from alien import Alien

import game_functions as gf

def run_game():

初始化pygame,设置和屏幕对象

pygame.init()

ai_settings = Settings()

screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))

pygame.display.set_caption(“外星人入侵”)

创建play按钮

play_button = Button(ai_settings, screen, “play”)

创建存储游戏统计信息的实例,并创建得分牌

stats = GameSrats(ai_settings)

sb = Scoreboard(ai_settings, screen, stats)

创建一艘飞船,一个子弹编组和一个外星人编组

ship = Ship(ai_settings, screen)

bullets = Group()

aliens = Group()

创建外星人群

gf.create_fleet(ai_settings, screen, ship, aliens)

开始游戏主循环

while True:

gf.cheak_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)

if stats.game_active:

ship.update()

gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)

gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets)

gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)

run_game()

alien.py

管理外星人类

import pygame

from pygame.sprite import Sprite

class Alien(Sprite):

“”“表示单个外星人的类”“”

def init(self, ai_settings, screen):

“”“初始化外星人并设置其初始位置”“”

super().init()

self.screen = screen

self.ai_settings = ai_settings

加载外星人图像,并设置其rect属性

self.image = pygame.image.load(‘images/alien.bmp’)

self.rect = self.image.get_rect()

每个外星人最初在屏幕左上角附近

self.rect.x = self.rect.width

self.rect.y = self.rect.height

存储外星人的准确位置

self.x = float(self.rect.x)

def blitme(self):

“”“在指定位置绘制外星人”“”

self.screen.blit(self.image, self.rect)

def cheak_edgs(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.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)

self.rect.x = self.x

bullet.py

创建子弹类,将子弹存储到编组Group中

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

“”“一个对飞船发射的子弹进行管理的类”“”

def init(self, ai_settings, screen, ship):

“”“在飞船所处位置创建一个子弹对象”“”

super().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.centerx

self.rect.top = ship.rect.top

存储用小数表示的子弹位置

self.y = float(self.rect.y)

self.color = ai_settings.bullet_color

self.speed_factor = ai_settings.bullet_speed_factor

def update(self):

“”“向上发射子弹”“”

更新表示子弹的小数值

self.y -= self.speed_factor

更新表示子弹的rect的位置

self.rect.y = self.y

def draw_bullet(self):

“”“在屏幕上绘制子弹”“”

pygame.draw.rect(self.screen, self.color, self.rect)

button.py

按键类,实例化按键,添加play按钮

import pygame.font

class Button():

def init(self, ai_settings, screen, msg):

“”“初始化按钮的属性”“”

self.screen = screen

self.screen_rect = screen.get_rect()

设置按钮的尺寸和其他属性

self.width, self.hieght = 200, 50

self.button_color = (0, 255, 0)

self.text_color = (255, 255, 255)

self.font = pygame.font.SysFont(None, 48)

创建按钮的rect对象,并将其居中

self.rect = pygame.Rect(0, 0, self.width, self.hieght)

self.rect.center = self.screen_rect.center

按钮的标志只需创建一次

self.prep_msg(msg)

def prep_msg(self, msg):

“”“将msg渲染为图像,并将其在按钮中居中”“”

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_functions.py

文件game_functions.py包含一系列函数,需要响应按键和鼠标事件,游戏大部分工作都是由它们完成的。

import sys

from time import sleep

import pygame

from bullet import Bullet

from alien import Alien

def cheak_keydowen_events(event, ai_settings, screen, ship, bullets):

“”“响应按键”“”

if event.key == pygame.K_RIGHT:

ship.moving_right = True

elif event.key == pygame.K_LEFT:

ship.moving_left = True

elif event.key == pygame.K_SPACE:

fire_bullet(ai_settings, screen, ship, bullets)

elif event.key == pygame.K_q:

sys.exit()

def fire_bullet(ai_settings, screen, ship, bullets):

“”“如果还没到达限制,就发射一颗子弹”“”

创建一颗子弹,并将其加入到编组bullets中

if len(bullets) < ai_settings.bullets_allowed:

news_bullet = Bullet(ai_settings, screen, ship)

bullets.add(news_bullet)

def cheak_keyup_events(event, ship):

“”“响应松开”“”

if event.key == pygame.K_RIGHT:

ship.moving_right = False

elif event.key == pygame.K_LEFT:

ship.moving_left = False

def cheak_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):

“”“响应按键和鼠标事件”“”

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

elif event.type == pygame.KEYDOWN:

cheak_keydowen_events(event, ai_settings, screen, ship, bullets)

elif event.type == pygame.KEYUP:

cheak_keyup_events(event, ship)

elif event.type == pygame.MOUSEBUTTONDOWN:

mouse_x, mouse_y = pygame.mouse.get_pos()

cheak_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y)

def cheak_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y):

“”“在玩家单击play按钮时开始新游戏”“”

bullets_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)

if bullets_clicked and not stats.game_active:

重置游戏设置

ai_settings.initialize_dynamic_settings()

隐藏光标

pygame.mouse.set_visible(False)

重置游戏统计信息

stats.reset_stats()

stats.game_active = True

重置记分牌对象

sb.prep_score()

sb.prep_high_score()

sb.prep_level()

sb.prep_ships()

清空外星人列表和子弹列表

aliens.empty()

bullets.empty()

创建一群新的外星人,并让飞船居中

create_fleet(ai_settings, screen, ship, aliens)

ship.center_ship()

def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button):

“”“更新屏幕上的图像,并切换到新屏幕”“”

每次循环都重绘屏幕

screen.fill(ai_settings.bg_color)

在飞船和外星人后面重绘所有子弹

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitme()

aliens.draw(screen)

显示得分

sb.show_score()

如果游戏处于非活动状态,就绘制play按钮

if not stats.game_active:

play_button.draw_button()

让最近绘制的屏幕可见

pygame.display.flip()

def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):

“”“更新子弹的位置,并删除已消失子弹”“”

更新子弹位置

bullets.update()

删除已消失的子弹

for bullet in bullets.copy():

if bullet.rect.bottom <= 0:

bullets.remove(bullet)

cheak_bullets_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets)

def cheak_bullets_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):

“”“响应子弹和外星人碰撞”“”

删除发生碰撞的子弹和外星人

collections = pygame.sprite.groupcollide(bullets, aliens, True, True)

if collections:

for aliens in collections.values():

stats.score += ai_settings.alien_points * len(aliens)

sb.prep_score()

cheak_high_score(stats, sb)

if len(aliens) == 0:

如果整群外星人都被消灭,就提高一个等级

删除现有的子弹,加快游戏节奏,并创建一群新的外星人

bullets.empty()

ai_settings.increase_speed()

提高等级

stats.level += 1

sb.prep_level()

create_fleet(ai_settings, screen, ship, aliens)

def get_number_alien_x(ai_settings, alien_width):

“”“计算每行可容纳多少外星人”“”

available_space_x = ai_settings.screen_width - 2 * alien_width

number_alien_x = int(available_space_x / (2 * alien_width))

return number_alien_x

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_rows

def create_alien(ai_settings, screen, aliens, alien_number, row_number):

创建第一行外星人并将其加入当前行

alien = Alien(ai_settings, screen)

alien_width = alien.rect.width

alien.x = alien_width + 2 * alien_width * alien_number

alien.rect.x = alien.x

alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number

aliens.add(alien)

def create_fleet(ai_settings, screen, ship, aliens):

“”“创建外星人群”“”

创建一个外星人,并计算一行可容纳多少个外星人

外星人间距为外星人宽度

alien = Alien(ai_settings, screen)

number_alien_x = get_number_alien_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_alien_x):

create_alien(ai_settings, screen, aliens, alien_number, row_number)

def cheak_fleet_edges(ai_settings, aliens):

“”“有外星人到达屏幕边缘时采取相应的措施”“”

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
img

-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaWd1aWd1,size_16,color_FFFFFF,t_70)

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
[外链图片转存中…(img-kI7gYRHS-1711059372442)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_60226911/article/details/136926818

智能推荐

计算机基础——操作系统-程序员宅基地

文章浏览阅读8.5k次,点赞28次,收藏38次。本章将会讲解计算机的操作系统。操作系统(Operating System,OS)就好比一个计算机内部的管理者,是管理和控制计算机硬件与软件资源的计算机程序,直接运行在“裸机”上的最基本的系统软件,任何其他应用软件都必须在操作系统的支持下才能运行,操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统的功能包括管理计算机系统的硬件,软件及数据资源,控制程序运行,为其他应用软件提供支持等。_操作系统

Python之pip download 命令用法-下载指定平台和python版本的依赖包-程序员宅基地

文章浏览阅读1.9w次,点赞7次,收藏27次。pip download 和 pip install 有着相同的解析和下载过程,不同的是,pip install 会安装依赖项,而 pip download 会把所有已下载的依赖项保存到指定的目录 ( 默认是当前目录 ),此目录稍后可以作为值传递给 pip install --find-links 以便离线或锁定下载包安装_pip download

centos7设置密码策略_CentOS7 设置密码复杂度-程序员宅基地

文章浏览阅读3.4k次。在CentOS下设置密码复杂度分为两步(1)修改/etc/login.defs文件vim /etc/login.defsPASS_MAX_DAYS90   # 密码最长过期天数PASS_MIN_DAYS80    # 密码最小过期天数PASS_MIN_LEN10    # 密码最小长度PASS_WARN_AGE7    # 密码过期警告天数(2)..._echo 'mypassword' | openssl passwd -6 -stdin centos7

王斌老师的博客_王斌 github-程序员宅基地

文章浏览阅读480次。http://blog.sina.com.cn/s/blog_736d0b9101018cgc.html_王斌 github

ACM OJ Collection_htt//acm.wydtang.top/-程序员宅基地

文章浏览阅读737次。原文来自:http://blog.csdn.net/hncqp/article/details/4455263 ACM OJ Collection(排名不分先后):中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):htt_htt//acm.wydtang.top/

ios 自己服务器 苹果支付_修复苹果IOS支付-程序员宅基地

文章浏览阅读467次。更新记录1.0.0(2019-07-01)插件简介专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。问题描述首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”,特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应..._ios开发苹果支付恢复权益

随便推点

郁金香2021年游戏辅助技术中级班(七)_squad辅助科技-程序员宅基地

文章浏览阅读379次。郁金香2021年游戏辅助技术中级班(七)058-C,C++写代码HOOK分析封包数据格式A059-C,C++写代码HOOK分析封包数据格式B-detours劫持060-C,C++写代码HOOK分析封包数据格式C-过滤和格式化061-C,C++写代码HOOK分析封包数据格式D-写入配置文件062-C,C++写代码HOOK分析封包数据格式D-读取配置文件058-C,C++写代码HOOK分析封包数据格式A_squad辅助科技

ssh登录qemu虚拟机里的linux系统_qemu ssh连接-程序员宅基地

文章浏览阅读350次。上面的命令启动了一个带有NAT网络的QEMU虚拟机,并设置了端口转发,将主机的2222端口映射到虚拟机的22端口(SSH端口)。1、安装openssh,如果是根文件系统用buildroot构建,打开 BR2_PACKAGE_OPENSSH 开关。2、在qemu的启动脚本里增加。3、在虚拟机里增加一个新用户。4、向虚拟机里发送文件。_qemu ssh连接

用netty实现zcool_Netty框架入门-程序员宅基地

文章浏览阅读63次。一、概述Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。二、体系结构图三、Netty的核心结构Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的..._channelconnected

SpringBoot 过滤器 filter 3种方法_spring boot filter 配置-程序员宅基地

文章浏览阅读4.7k次。最近Spring Boot项目做单点登录对接的时候,在配置过滤器的时候,找了几种方法,记录一下。欢迎评论补充沟通~由于之前JAVA Web项目最开始都有web.xml配置,随着框架慢慢的进化,从Spring Boot开始,已经没有了web.xml配置文件。那原来在web.xml里,配置的filter过滤器,在Spring Boot中怎么配置呢?注意,这个自定义类,也不能加@Component或@Configuration注解,加了就会初始化Filter了,过滤全部的路径了。_spring boot filter 配置

Ubuntu下,Python源码制作deb包_unmet build dependencies: debhelper (>= 11)-程序员宅基地

文章浏览阅读1k次。背景: 自己写了一个Python的qt客户端, 然后需要制作deb包1.先贴上代码的目录结构x@hostv6:~/mywork/my-client$ tree.├── 1├── debian│ ├── changelog│ ├── compat│ ├── control│ ├── copyright│ ├── README.Debian│ ├── rules│ ├── source│ │ ├── format│ │ └── loc..._unmet build dependencies: debhelper (>= 11)

13. PyQt5实现多页面切换之QTabWidget_pyqt5 tabwidget-程序员宅基地

文章浏览阅读2.8w次,点赞19次,收藏96次。QTabWidget 类,是一个实现多页面切换的类,该类已经实现了多页面切换的部分功能,只需再对其进行少量的设计(主要是要设计页面中的内容)便可实现多页面切换了。因此,使用该类实现多页面切换时,就不需要再使用 QStackedLayout 布局把页面与选项卡相关联,也不需要使用类似 QVBoxLayout 的布局把选项卡和页面放置在一起。与 QStackedLayout 布局原理相同,只有当前页面(即可见页面)是可见的,所有其他页面都不可见,用户可通过选择不同的选项卡来显示其对应的其他页面。_pyqt5 tabwidget

推荐文章

热门文章

相关标签