Python编程:从入门到实践(第2版)学习笔记
任务描述:
编写一个游戏,将一艘飞船放到屏幕左侧,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右飞行的子弹,并在子弹从屏幕消失后将其删除。
思路分析:
1、设置程序运行前提条件
2、创建飞船并配置相关属性
3、具备发射子弹功能
编码结构分析:
1、设置主程序存放在类Side_Shoot 中并存储在文件case12-6.py文件中
2、创建Alien_Shoot类,存储飞船及相关属性并存在alienshoot.py中
3、创建类Bullet,设置子弹及相关功能并存在bullets.py中
程序源码如下:
1、主程序文件 case12-6.py
import sys
import pygame
from alienshoot import Alien_Shoot
from bullets import Bullet
class Side_Shoot:
"""设计一个类,实现如下功能:
1、飞船在屏幕左侧
2、运行用户上下移动飞船
3、按空格键射击,向屏幕右侧飞行
4、子弹从屏幕消失后删除
"""
def __init__(self):
# 初始化pygame模块
pygame.init()
# 设置屏幕大小
self.screen = pygame.display.set_mode((800, 600))
# 设置窗口标题
pygame.display.set_caption("Fire Side Demo")
# 创建类alienshoot实例
self.alienshoot = Alien_Shoot(self)
# 创建Bullet 组 , 给子弹进行编组
self.bullets = pygame.sprite.Group()
# 限制 可发射子弹数量
self.bullet_allowed = 3
# 使用sprite 函数 定义 对子弹进行编组
def _fire_bullet(self):
# 进行 可射击子弹数 控制,顺便可以 测试是否将越界子弹数 删除
if len(self.bullets) < self.bullet_allowed:
# 实例化类Bullet
new_bullet = Bullet(self)
# 将实例化的子弹类 上膛 编组
self.bullets.add(new_bullet)
# 按键处理器 之 KEYDOWN
def _check_keydown(self, event):
if event.key == pygame.K_UP:
self.alienshoot.move_up = True
elif event.key == pygame.K_DOWN:
self.alienshoot.move_down = True
elif event.key == pygame.K_SPACE:
self._fire_bullet()
# 按键处理器 之 KEYUP
def _check_keyup(self, event):
if event.key == pygame.K_UP:
self.alienshoot.move_up = False
elif event.key == pygame.K_DOWN:
self.alienshoot.move_down = False
# 事件检测器
def _check_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown(event)
elif event.type == pygame.KEYUP:
self._check_keyup(event)
# 更新幕布及屏幕显示内容
def update_screen(self):
# 更新外星人位置
self.alienshoot.update_position()
# 设置背景颜色
self.screen.fill((255, 255, 255))
# 绘制出飞船图形
self.alienshoot.draw_ship()
# 将编组中的子弹 显示出来
for bullet in self.bullets.sprites():
bullet.draw_bullets()
# 显示屏幕
pygame.display.flip()
def run_game(self):
while True:
self._check_event()
# 将编组中的子弹 更新位置
self.bullets.update()
# 遍历子弹组
for bullet in self.bullets.sprites():
# 如果越界了
if bullet.rect.left >= self.screen.get_rect().right:
# 从组里去掉该 子弹
self.bullets.remove(bullet)
print(len(self.bullets))
self.update_screen()
if __name__ == '__main__':
side_shoot = Side_Shoot()
side_shoot.run_game()
2、实现飞船显示及移动 alienshoot.py
import pygame
class Alien_Shoot:
"""此处定义外星人相关属性和功能"""
def __init__(self, ai_game):
pygame.init()
# 获取窗口屏幕大小
self.screen = ai_game.screen
self.image = pygame.image.load('images/ship.png')
# 获取屏幕所在的矩形框
self.screen_rect = ai_game.screen.get_rect()
# 获取飞船所在的矩形框
self.rect = self.image.get_rect()
# 设置飞船初始位置为左侧中央
self.rect.midleft = self.screen_rect.midleft
# 定义移动标志
self.move_up = False
self.move_down = False
def update_position(self):
if self.move_up and self.rect.top > self.screen_rect.top:
self.rect.y -= 1
elif self.move_down and self.rect.bottom < self.screen_rect.bottom:
self.rect.y += 1
def draw_ship(self):
# 在屏幕上指定位置绘制飞船,
self.screen.blit(self.image, self.rect)
3、实现射击功能 bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
"""设置子弹相关属性及功能"""
def __init__(self, ai_game):
# 继承精灵类
super().__init__()
# 定义子弹相关信息
self.bullet_speed = 0.1
self.bullet_width = 8
self.bullet_height = 3
self.bullet_color = (255, 0, 0)
# 定义屏幕显示相关信息
self.screen = ai_game.screen
# 定义在屏幕左上角(0,0)位置的子弹
self.rect = pygame.Rect(0, 0, self.bullet_width,self.bullet_height)
# 更新子弹初始位置 为飞船发射出来的
self.rect.midright = ai_game.alienshoot.rect.midright
# 定义子弹 缓慢移动
self.x = float(self.rect.x)
# 对sprite类中update进行重写操作
def update(self):
# 开火后 更新子弹位置
self.x += self.bullet_speed
self.rect.x = self.x
def draw_bullets(self):
# 绘出子弹图像 采用另一个函数 pygame.draw.rect(屏幕,颜色,位置)
pygame.draw.rect(self.screen, self.bullet_color, self.rect)
疑难点分析:
1、上传飞船图片如何在屏幕具体位置显示,通过两个变量来实现:self.screen_rect,self.rect 。在pygame模块中,每个图像都被看做是一个矩形rect,通过定义飞船中左位置点和屏幕中左位置点一致来实现飞船初始位置在屏幕左侧中央。
# 获取屏幕所在的矩形框
self.screen_rect = ai_game.screen.get_rect()
# 获取飞船所在的矩形框
self.rect = self.image.get_rect()
# 设置飞船初始位置为左侧中央
self.rect.midleft = self.screen_rect.midleft
2、在屏幕中显示的几种方法:
# 创建一个游戏窗口
pygame.display.flip()
# 显示屏幕背景颜色
self.screen.fill(self.settings.bg_color)
# 在游戏窗口指定位置显示图片
self.screen.blit(self.image, self.rect)
# 在游戏窗口上 显示指定位置、大小(rect)和颜色
pygame.draw.rect(self.screen, self.color, self.rect)
3、pygame中更新元素位置:
# 由于pygame中元素移动 可分为x轴即width 和y轴height
# 即元素左右移动为x轴变化,上下移动为y轴变化
# x,y轴变化基础单位必须为整数
# 如果想改变移动的距离为 小数 则需要进行如下操作
# 1、声明一个float类型的自身变量
self.x = float(self.rect.x)
# 2、用这个自身变量进行计算
self.x += self.bullet_speed
# 3、最后使用时 再把这个自身变量的值赋给自身即可
self.rect.x = self.x
4、类的继承:
# super后必须要加() 其代表调用 不要忘记()
super().__init__()
5、sprite精灵类:主要用来实现组操作 如子弹,外星飞船和人物的身体等
# 1、使用时需要先创建个精灵组
self.bullets = pygame.sprite.Group()
# 2、实例化类Bullet,并将其编组
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
# 3、对每个组内每个精灵都进行调用
for bullet in self.bullets.sprites():
bullet.draw_bullets()
# 4、对精灵组sprite.Group调用update函数,此处需注意update为sprite自带函数但若想调用必须要在类中对其重写
self.bullets.update()
版权声明:本文为qq_38946031原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。