Python练习题 12-6:侧面射击

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 Bulletclass 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:# 实例化类Bulletnew_bullet = Bullet(self)# 将实例化的子弹类 上膛 编组self.bullets.add(new_bullet)# 按键处理器 之 KEYDOWNdef _check_keydown(self, event):if event.key == pygame.K_UP:self.alienshoot.move_up = Trueelif event.key == pygame.K_DOWN:self.alienshoot.move_down = Trueelif event.key == pygame.K_SPACE:self._fire_bullet()# 按键处理器 之 KEYUPdef _check_keyup(self, event):if event.key == pygame.K_UP:self.alienshoot.move_up = Falseelif 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 pygameclass Alien_Shoot:"""此处定义外星人相关属性和功能"""def __init__(self, ai_game):pygame.init()# 获取窗口屏幕大小self.screen = ai_game.screenself.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 = Falseself.move_down = Falsedef update_position(self):if self.move_up and self.rect.top > self.screen_rect.top:self.rect.y -= 1elif self.move_down and self.rect.bottom < self.screen_rect.bottom:self.rect.y += 1def draw_ship(self):# 在屏幕上指定位置绘制飞船,self.screen.blit(self.image, self.rect)

3、实现射击功能 bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""设置子弹相关属性及功能"""def __init__(self, ai_game):# 继承精灵类super().__init__()# 定义子弹相关信息self.bullet_speed = 0.1self.bullet_width = 8self.bullet_height = 3self.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_speedself.rect.x = self.xdef 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()

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部