python书籍《从入门到实践》学习中的自我提问项目实战部分

外星人入侵

目录

  • 在做项目前需要做什么?
    我们要知道我们的项目需要达成哪些功能,以及行为。还需要一个硬性要求就是需要电脑中安装了pygame。针对不同的系统安装的方式不同。
    Linux系统+python3:需要使用pip来进行安装
    ox系统:需要使用pip来安装pygame
    linux系统+python2.7:不需要通过pip
    Windows系统:不需要通过pip (虽然不需要通过pip安装,但系统中也是要有pip的)
    这里我们还需要知道一个事:我们系统里面有没有pip。

    通过在cmd中输入此内容能够判断windows系统中是否安装了pip并且并且能够判断pip所关联的python版本(如果电脑中只有一个python,那不会出现关联错误的问题)否则需要重新安装pip。

安装pip

要安装pip我们要有get-pip.py文件,下载好这个文件(文件地址https://pip.pypa.io/en/stable/installing/)
下载好之后我们在不同操作系统上使用不同的命令来安装
Linux和os x系统中:使用命令sudo python get-pip.py 来进行安装。
windows系统中:使用命令python get-pip.py来进行安装。

安装Pygame

在Windows系统中安装pygame可在pycharm中配置。
linux系统+python2.7:可以使用包管理来安装pygame。
Linux系统+python3:需要先安装pygame所需的库,然后在安装pycharm。(都是在终端中进行)

安装好工具我们开始实战
飞机大战飞机已经能够发射子弹了,三颗子弹都已经准备就绪了。
但是回过头来想脑子里只有框架,整个框架就是围绕类,实例,方法来转,但细节方面没有掌握到什么可用的,为了强化写代码的能力,决定回过头在捋一遍。

1.在设计游戏时我们需要什么模块?各模块的作用是什么?

答:我们需要sys模块和pygame模块。
pygame包含开发游戏的功能
sys能够起到退出的作用

pygame模块:

模块作用
cdrom管理cdrom设备和音频播放
cursort加载光标图像,包括标准光标
display控制显示窗口或屏幕
draw在surface上画简单形状
event管理事件和事件队列
font创建并呈现Truetype字体
image保存和加载图像
joystick管理控制杆装置
key管理键盘
mouse管理鼠标
moviempeg电影播放
sndarray数字处理声音
surfarray数字处理图像
time控制时间
transform缩放、旋转和翻转图像

sys模块:

sys.argv命令行参数List,第一个元素是程序本身路径
sys.exit(0)退出程序,正常退出时exit(0)
sys.version获取Python解释程序的版本信息
sys.maxint最大的Int值
sys.path返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform返回操作系统平台名称
sys.stdout.write(‘please:’)需要配合sys.stdout.flush()把写的刷出来
val = sys.stdin.readline()[:-1]把输入的东西赋值给val
2.pygame怎么初始化背景设置?

答:通过代码pygame.init()进行设置。

3.怎么创建显示窗口?

答:使用display模块下面的pygame.display.set_mode()初始化一个准备显示的窗口或屏幕。

4.怎么理解事件循环?

答:我们编写事件循环以便监听事件。
例如:for event in pygame.event.get()从队列中获取事件。
注意:所有鼠标和键盘的事件都将促使for循环。

5.列举每种事件类型定义的事件属性?

答:例如:if event.type=pygame.QUIT:

6.怎么将完整带显示的Surface对象更新到屏幕上?

答:使用pygame.display.flip()来进行更新

7.怎么更改python默认的黑色背景?

答:首先先设置一个背景色作为实参使用,例如:bg_color=(230,230,230),然后用自己设着的背景色来填充屏幕例如:screen.fill(bg.color)

8.如果一个项目存在很多内部设置我们需要怎么简化代码?

答:通常我们新建一个模块(类),再类中将设置进行实例化,例如:
class Settings():
‘’‘存储《外星人入侵》的所有设置的类’’’
def _init_(self):
下面是设置内容



最后将实例导入到主程序中并赋给一个变量用来使用。例如:
ai_settings=Settings()
注:类是抽象概念,类的实例是具体的。比如创建一个类名字叫“学生”,实例化一个学生“张三”,张三就是“学生类”的一个实例。

9.pygame 加载图片我们怎么调用?

答:通过pygame.image.load(“图片地址”)来进行调用。

10.pygame中我们关于图像位置和背景位置需要知道什么?

答:首先我们知道两个图像位置都需要获取
例如:
self.rect=self.image.get_rect()
self.screen.rect=screen.get_rect()
然后一般情况是将图片位置以背景位置为参考
例如:
self.rect.conterx=self.screen.rect.centerx
self.rect.bottom=self.screen.rect.bottom
注:把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程。

11.怎么将图片绘制在背景上面?

答:我们通过方法blitme()方法来进行绘制
例如:
def blitme(self):
self.screen.blit(self.image,self.rect)
使用方法biltme()要添加的东西就是图像以及图像的矩形位置,所以传入即可

12.在类里面包含的内容是什么 ?有什么作用?例如:ship=Ship(screen)

答:不知道。但这鬼东西能够导入一个飞船,为什么里面是screen啊?

13.怎么将类中的方法调用?

答:先将类赋值给一个变量,然后通过==变量.方法()==来进行调用。

14.重构代码有什么作用?

答:重构代码可以简化既有代码的结构,具体方法是需要我们创建一个新的模块,这个模块用来储存函数。然后修改主程序,将函数中的循环替换成对函数的调用。例如:import 文件名 as 变量
调用:变量.方法()

14.关于函数中形参这块有点模糊?

答:将其他模块的形参导入新建的函数中,形参是哪里来的。
例如:gf.update_screen(ai_settings,screen,ship)
答: ai_settings是模块,screen是什么,ship也是模块。

15.响应事件和响应按键之间的关系?

答:我们需要先响应事件,比如说响应的是键盘上有按下的操作,例如:elif even.typepygame.KEYDOWN:
这就完成了响应事件命令,接下来我们研究下具体是什么事件,也就是说是事件下面的什么按键,例如:if event.key
K_RIGHT.

16.什么情况下作为形参传入,什么时候作为实参传入?

答:当一个形参被放入一个函数中时,那么再调用这个参数就是作为实参使用了。

17.添加属性的重要性?

答:当一个模块需要添加功能时,需要添加属性和方法,相互呼应,我们修改事件的内容来更改标志的内容,然后通过标志的内容来判断实际的案例。实际的案例一般储存在一个更新函数下面,只需在主程序中调用这个更新函数即可。

18.rect 的 centerx 等属性只能存储整数值?那我们怎么精确的修改这个值?

答:我们可以新建一个属性:self.center = float(self.rect.centerx)
然后通过
self.center += self.ai_settings.ship_speed_factor
这样我们把更改后的值放在了变量中
然后再将变量赋值给我们的图形位置方法中。
self.rect.centerx = self.center

19.一个模块中如果出现大致重复的内容,怎么办?

答:为了使代码结构更清晰,我们需要重构代码,一般情况是将重复部分分别用函数装起来。例如:
def check_keydown_events(event, ship):
“”“响应按键”""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True

20.引用别的模块?

答:
class Bullet(Sprite):
“”“一个对飞船发射的子弹进行管理的类”""
def init(self, ai_settings, screen, ship):
“”“在飞船所处的位置创建一个子弹对象”""
super(Bullet, self).init()
这是特殊的格式。继承
引用的类就点

21.子弹的位置和子弹所在的矩形位置不是一个位置?

答:是的
例如:
#更新表示子弹位置的小数值
 self.y -= self.speed_factor
#更新表示子弹的rect的位置
 self.rect.y = self.y

22.编组怎么创建?

答:直接让参数=Group()即可。

23.按下空格键怎么用事件表示?

答:if event.key==pygame.K_SPACE:

24.什么 是精灵,怎么遍历精灵?

答:通过 方法
for bullet in bullets.sprites()

25.怎么修改for循环中的列表?

答:在 for 循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。我们使用了方法copy() 来设置 for 循环:
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)

26.获取图像位置怎么弄?

答:
飞船位置:
def init(self, screen):
“”“初始化飞船并设置其初始位置”""
self.screen = screen
#加载飞船图像并获取其外接矩形 
 self.image = pygame.image.load(‘images/ship.bmp’) 
 self.rect = self.image.get_rect() 
 self.screen_rect = screen.get_rect()
#将每艘新飞船放在屏幕底部中央 
 self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom

外星人位置:
def init(self, ai_settings, screen):
“”“初始化外星人并设置其起始位置”""
super(Alien, self).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)
注:飞船和外星人的定位有一些不同,飞船是采用飞船图像矩形依靠背景来定位,而外星人是依靠自身的位置即x,y坐标来确定的。没有参照物,因为背景的左上角位置为(0,0)。

27.要想创建多个同样的东西,我们需要怎么办?

答:我们需要创建一个空的编组,例如:
bullets=Group()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值