我已经看过很多问题,但是找不到答案。这是导致问题的代码片段:
常数:
antvelocity=float(10) #pixels per frame
代码的另一部分(randir()是一个全局函数):
def randir():
n=float(random.randint(0,8))
ang=(n*math.pi)/4
蚂蚁班:
class Ant:
antx=0
anty=0
id=0
def __init__(self,id):
self.id=id
def draw(self):
SCREEN.blit(antimg,(self.antx,self.anty))
def seek(self):
randang=randir()
velx=math.floor(float(antvelocity)*float(math.cos(randang)))
vely=math.floor(float(antvelocity)*float(math.sin(randang)))
self.antx=self.antx+velx
self.anty=self.anty+velx
self.draw()
pygame.display.update()
#Handling code for seeking
def carry(self):
pass
#Handling code for carrying leaf
++++++++++++++++++++++++ ERROR +++++++++++++++++++++++++++++++
Traceback (most recent call last):
File "/home/acisace/Python Projects/Gathering/gather.py", line 101, in <module>
ant1.seek()
File "/home/acisace/Python Projects/Gathering/gather.py", line 64, in seek
velx=math.floor(float(antvelocity)*float(math.cos(randang)))
TypeError: a float is required
+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
请帮我纠正这个问题
谢谢大家。无法相信我错过了。
答案 0 :(得分:2)
您的randir()
功能不会返回任何内容:
def randir():
n=float(random.randint(0,8))
ang=(n*math.pi)/4
因此返回None
:
>>> import random, math
>>> def randir():
... n=float(random.randint(0,8))
... ang=(n*math.pi)/4
...
>>> randir()
>>> randir() is None
True
然后,您将None
值传递给math.cos()
:
math.cos(randang)
会抛出你的错误:
>>> math.cos(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
如果要解决此问题,则必须在函数中添加return
语句:
def randir():
n=float(random.randint(0,8))
ang=(n*math.pi)/4
return ang
答案 1 :(得分:1)
randang=randir()
velx=math.floor(float(antvelocity)*float(math.cos(randang)))
由于该代码段的第二行似乎是问题所在,最可能的原因是randang
,因为float()
不会要求一个浮点数,如果你做了float('a')
这样愚蠢的事情,你会得到一个不同的错误:
ValueError:无法将字符串转换为float:a
事实上,randir
的定义说明了原因:
def randir():
n=float(random.randint(0,8))
ang=(n*math.pi)/4
它没有专门返回任何内容,意味着您将获得None
。
作为一个更简单的例子,请参阅以下成绩单:
>>> def nothing():
... pass
...
>>> print nothing()
None
>>> import math
>>> print math.cos(nothing())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
你需要从randir()
函数返回一个浮点数(或者成为浮点数的东西):
>>> def nothing():
... return 0.5
...
>>> print nothing()
0.5
>>> import math
>>> print math.cos(nothing())
0.87758256189
在您的情况下,该功能应该是:
def randir():
n = float(random.randint(0,8))
ang = (n * math.pi) / 4
return ang
答案 2 :(得分:1)
看起来randir
正在返回None
,这不是浮点数。 (如果您没有在任何给定函数中指定返回值,默认情况下它将返回None
。)然后您将结果(存储在randang
)中传递给cos
,仅定义浮动。只需添加:
return ang
到randir
的结尾。