《Python编程:从入门到实践》外星人入侵项目课后练习12-5
作者:互联网
最近在看 《python编程:从入门到实践》,书中的项目实践部分有一些课后练习,为了巩固自己学的东西,我选择了一些自己感兴趣的习题进行编程,目前只看到项目1部分,项目2还没开始,以后继续更新代码,因为自己是新手,欢迎大家对我编码过程中的不足和错误进行指正。
12-5:侧面射击
这个题目所需创建的py文件如下所示,题中没有要求显示外星人的操作,所以只需要一张飞船的照片(我提前将飞船顺时针旋转90度),放在image文件夹中即可。
下面是各个模块对应的代码块:
首先是基本游戏的一些基本设置,比如游戏屏幕的长宽、背景的颜色、子弹的速度、子弹的长宽、子弹的颜色以及子弹移动的速度等。
settings.py
class Settings():
def __init__(self):
# 定义屏幕的宽度和高度
self.screen_width = 1900
self.screen_height = 1000
self.bg_color = (230, 230, 230) # 设置背景色,浅灰色
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 1
self.bullet_width = 15
self.bullet_height = 3
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3
接下来是飞船的一些基本属性,包括如何导入飞船图片、飞船的初始位置、以及游戏开始后位置如何更新、飞船如何显示等。
ship.py
import pygame
class Ship():
def __init__(self,ai_settings,screen):
self.screen = screen
self.image = pygame.image.load('C:/Users/Xin/PycharmProjects/alien_invasion/image/ship.bmp')
self.ai_settings = ai_settings
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.centery = self.screen_rect.centery
self.center = float(self.rect.centery)
self.moving_right = False
self.moving_left = False
def biltme(self):
self.screen.blit(self.image, self.rect)
def update(self):
''' 根据移动标志调整飞船位置'''
if self.moving_right:
self.center +=self.ai_settings.ship_speed_factor
if self.moving_left:
self.center -= self.ai_settings.ship_speed_factor
self.rect.centery = self.center
接下来是子弹的一些基本属性,包括如何产生子弹、子弹位置初始化、子弹位置如何更新、子弹的显示。
bullet.py
#创建子弹类,定义子弹的位置、如何变化以及显示子弹
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.centery = ship.rect.centery
self.rect.right = ship.rect.right
# 存储用小数表示的子弹的位置
self.x = float(self.rect.x)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
self.x += self.speed_factor
self.rect.x = self.x
def draw_bullet(self):
pygame.draw.rect(self.screen,self.color,self.rect)
接下来是用到的主要函数,实时响应鼠标和键盘的操作从而更新飞船、子弹的位置,并显示对应的位置,或者结束游戏。
game_functions.py
'''
包含一系列函数,管理飞船、子弹的位置更新等等
'''
import sys
import pygame
from moving_up_down.bullet import Bullet
def check_events(ai_settings,screen,ship,bullets):
'''
响应按键和鼠标事件
:return:
'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship,bullets):
"""
更新屏幕上的图像,并切换到新屏幕上
:param ai_settings:
:param ship:
:return:
"""
screen.fill(ai_settings.bg_color) # 将背景色填满整个屏幕
for bullet in bullets.sprites():
#返回一个包含bullets中所有精灵的列表
bullet.draw_bullet()
ship.biltme()
# 让最近绘制的屏幕可见
pygame.display.flip()
def check_keydown_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):
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship):
if event.key == pygame.K_LEFT:
ship.moving_left = False
elif event.key == pygame.K_RIGHT:
ship.moving_right = False
def update_bullets(bullets,ai_settings):
#更新子弹位置
bullets.update()
for bullet in bullets.copy():
# 删除屏幕之外的子弹
if bullet.rect.left > ai_settings.screen_width:
bullets.remove(bullet)
最后是主文件,创建一系列需要用到的对象,开始游戏。
alien_invasion.py
'''
主文件
创建一系列、整个游戏都需用到的对象
'''
import pygame
from pygame.sprite import Group
from moving_up_down.settings import Settings
from moving_up_down import game_functions as f
from moving_up_down.ship import Ship
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) # 设置游戏显示窗口
pygame.display.set_caption("Alien Invasion")
# 创建一艘飞船
ship = Ship(ai_settings,screen)
bullets = Group()
# #开始游戏主循环
while True:
# 监视鼠标和键盘事件,根据事件进行相应的操作
f.check_events(ai_settings, screen, ship, bullets)
# 更新位置
ship.update()
f.update_bullets(bullets,ai_settings)
# 每次循环都重新绘制屏幕
f.update_screen(ai_settings, screen, ship, bullets)
run_game()
《Python编程:从入门到实践》外星人入侵项目课后练习12-5
标签:12,settings,Python,self,ai,pygame,课后练习,ship,screen 来源: https://blog.csdn.net/qq_37784961/article/details/110567721