《python从入门到实践》外星人入侵游戏
可以正常弹出窗口但窗口黑屏且无响应(窗口全黑的现象是在创建多行外星人时出现)
1.主文件
import sys
from settings import Settings
from ship import Ship
from bullet import Bullet
import pygame
from alien import Alien
class AlienInvasion:
"""管理游戏资源和行为的类"""
def __init__(self):
"""初始化游戏并创建游戏资源"""
pygame.init() #初始化背景
self.clock = pygame.time.Clock() #定义时钟
self.settings = Settings() #创建setting实例并在创建屏幕时使用属性
self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) #获取屏幕长宽高
pygame.display.set_caption("Alien Invsion") #给屏幕窗口添加一个标题
#设置背景色
self.ship = Ship(self) #创建一个实例 将Ship实例赋值给self.ship
self.bullets = pygame.sprite.Group() #创建用于储存子弹的编组
self.aliens = pygame.sprite.Group()
self._create_fleet()
def run_game(self):
"""开始游戏的主循环"""
while True:
self._check_events() #调用侦听函数
self._update_screen()
self.clock.tick(60) #设置帧率为60
self.ship.update() #调用位置函数
self._update_bullets() #更新子弹位置
self._eliminate_bullets() #清除超出屏幕的子弹
def _check_events(self):
#侦听键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
def _update_screen(self):
#每次循环都重绘屏幕
self.screen.fill(self.settings.bg_color) #使用self.settings来获取背景色
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.ship.blitme() #调用ship.blitme()将飞船绘制到屏幕上
self.aliens.draw(self.screen) #绘制外星人
#让最近绘制的屏幕可见
pygame.display.flip()
def _check_keydown_events(self,event):
"响应按下"
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_SPACE:
self._fire_bullet()
def _check_keyup_events(self,event):
"响应抬起"
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
def _fire_bullet(self):
"""创建子弹,并将其加入编组bullet"""
if len(self.bullets) < self.settings.bullets_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _update_bullets(self):
self.bullets.update()
def _eliminate_bullets(self):
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullets.remove(bullet)
print(len(self.bullets))
def _create_fleet(self):
"""创建外星人舰队"""
#创建一群外星人
alien = Alien(self)
alien_width, alien_height = alien.rect.size
current_x, current_y = alien_width, alien_height
while current_y < (self.settings.screen_height - 3 * alien_height):
while current_x < (self.settings.screen_width - 2 * alien_width):
self._create_alien(current_x,current_y)
current_x += 2*alien_width
#生成一行外星人后,重置x并递增y
current_x = alien_width
current_y += 2 * alien_height
def _create_alien(self,x_position,y_position):
"""创建一个外星人并将其放在当前行中"""
new_alien = Alien(self)
new_alien.x = x_position
new_alien.rect.x = x_position
new_alien.rect.y = y_position
self.aliens.add(new_alien)
if __name__ == '__main__':
#创建游戏实例并运行游戏
ai = AlienInvasion()
ai.run_game()
2.外星人文件
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""用来表示单个外星人的类"""
def __init__(self, ai_game) :
super().__init__()
self.screen = ai_game.screen
#加载外星人图像并设计其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)
3.子弹文件
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite): #此时的Bullet类是Sprite类的子类
"管理子弹的类"
def __init__(self,ai_game):
"在飞船的当前位置创建一个子弹对象"
super().__init__() #调用父类方法
self.screen = ai_game.screen
self.settings = ai_game.settings
self.color = self.settings.bullet_color
#在(0,0)创建一个表示子弹的矩形,再设置正确的位置
self.rect = pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)
self.rect.midtop = ai_game.ship.rect.midtop
#存储用浮点数表示的子弹位置
self.y = float(self.rect.y)
def update(self):
"""向上移动子弹"""
#更新子弹的准确位置
self.y -= self.settings.bullet_speed
#更新表示子弹的rect位置
self.rect.y = self.y
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
设置文件
import pygame
class Settings:
"""储存游戏中所有设置的类"""
def __init__(self):
"""初始化游戏设置"""
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (255,255,255)
#飞船速度设置
self.ship_speed = 1
#子弹设置
self.bullet_speed = 2.0
self.bullet_width = 3
self.bullet_height = 25
self.bullet_color = (60,60,60)
self.bullets_allowed = 5
飞船文件
import pygame
import settings
class Ship:
"""管理飞船的类"""
def __init__(self,ai_game):
"""初始化飞船并设置其初始位置"""
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
self.settings = ai_game.settings
#加载飞船图像并获取其外接矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
#每艘新飞船都放在屏幕底部的中央
self.rect.midbottom = self.screen_rect.midbottom
#在飞船的属性x中储存一个浮点数
self.x = float(self.rect.x)
#移动标志(飞船一开始不移动)
self.moving_right = False
self.moving_left = False
def update(self):
"根据移动标志调整飞船的位置"
if self.moving_right:
self.x += self.settings.ship_speed
if self.moving_left:
self.x -= self.settings.ship_speed
self.rect.x = self.x
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image,self.rect)
【相关推荐】
ZHANG_SAN_SAN_00000_9999999_12.25.88.99909045.456821.7843745.55608_33.nii.gz
#而且前面的姓名是核心标识符号;
#那么我们就着重抽取前面的内容;