python如何让外星人随机移动_已解决:为什么移动的外星人只有一列了?【python入门到实践13章】...

已解决:为什么移动的外星人只有一列了?【python入门到实践13章】Mark问题描述问题解析开始解决问题了哈!解决方案

Mark

这几日,在跟着《python入门到实践》一书,写一个“外星人入侵”的pygame游戏,本以为很简单(确实不难),但是却因为一个小问题困住了我好几天!茶不思饭不想,到底是哪里出了问题呀,今天终于找到了解决方案,可能有一些同学和我遇到的情况一样,所以在这里mark一下以共飨!

问题描述

为什么移动的外星人只有一列了?

为什么在静止的外星人是全的?

刚开始,我也是一头雾水,论坛里也有同学问到同样的问题,但是没有给出详细的解释

譬如这位同学@qq_43578746

@问题原址[link]https://ask.csdn.net/questions/706442

(图1 原论坛问题)

(图2 移动的外星人只有一列)

(图3 静止的外星人是布满屏幕的)

问题解析

说完了问题的描述,我们来看一下问题到底出在哪里?

实际上,我们通过对比问题的描述,可以很肯定的是,问题出在实现外星人移动的方法上

我们把几个和外星人移动的代码块贴上来分析一下。

先看下主函数中实现外星人移动的过程

看一下game_functions中和外星人移动相关的方法

再来看一下外星人类的update方法

开始解决问题了哈!

让我先来抖个机灵,你是不是也为了 ‘偷懒’, 在game_functions的create_alien的方法中也想这样写的?

好的,问题找到了!就是在这里!

我们来看下,书里是怎么写的

先说明,alien.rect.x 才是绘制外星人所需要的图像坐标,alien.x是为了精确图形位置所用的(实际上在绘图时没有用)

发现了吗,书中是特别写了

我刚开始在写这里的时候,也是觉得奇怪?咦,为什么alien.rect.y直接赋值,而alien.rect.x却要先赋值alien.x在进行二次赋值呢?

在上面的alien类中,像前面所说,我们知道,alien.x是为了精确图形位置所用的,但是在绘制静止的外星人图像的时候,这个参数实际上是没有用到的,所以不会出现任何问题。alien.rect.y自然不用说,这个确定垂直位置的参数,至始至终也没有使用精确位置。

之所以会在实现移动的过程中出现问题,是因为在alien类的update方法中是这样写的:

看到了吗?

如果是按照这样写

和按照这样写

赋值的顺序是不一样的。

解释一下第一种函数为什么错了:

函数过程:

先初始化一个alien实例,此时

self.rect.x = self.rect.width,(假设等于60)

self.x = float(self.rect.x)(60.0)

所以根据

初始化化完成后,开始赋值

alien.rect.x = alien_width + 2 * alien_width * alien_number(某个数值 60 + 2 * 60 * 1=180)

而此时alien.x还是为60.0

随后,每一个循环

alien.rect.x = alien_width + 2 * alien_width * alien_number(新的某个数值)

而alien.x一直是为60.0,(因为一直是初始化给alien.x赋的值,所以一直是60.0)

在update中,却一直用self.rect.x = self.x,所以最后在调用update的时候,所有的alien.rect.x就全部变成了60,

导致最后状况就是,实际上每行产生了多个外星人,但每行却只显示了一个(多个外星人重叠了)

现在明白了吧!不是create_fleet出了问题,而是忽略了self.rect.x和 self.x的差异!

解决方案

第一种就是按照书上的写法,先赋值alien.x,再赋值alien.rect.x

如下:

第二种就是,在update方法中,直接修改为(但是这种,就不会用到self.x,也就不能精确描述位置了):

写到这里问题就已经解决了,有什么问题,我们可以评论交流~

---------------------

作者:feiyihexin

来源:CSDN

原文:https://blog.csdn.net/feiyihexin/article/details/87944776

版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值