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 管理鼠标
movie mpeg电影播放
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()

发布了41 篇原创文章 · 获赞 1 · 访问量 681

猜你喜欢

转载自blog.csdn.net/qq_41543169/article/details/104537154