2010-09-13 10 views
1

J'essaie d'apprendre Python, (j'ai 2.5.4) en écrivant un jeu de serpent, mais je suis coincé. Certains entiers se transforment en flotteurs et ne cessent de changer au hasard, du moins de mon point de vue :)Python change Integer dans Float par lui-même

Le problème est que modifié par Snake.spawnPoint obtient Cam.move()

print Snake.spawnPoint # first time, this returns '[25, 20]' ,which is good. 
Cam.Move() 
print Snake.spawnPoint # after the method, the value is '[26.0, 21.0]', and that's bad 

Après cela, ils dérive juste.

Et voici la méthode:. (Il n'a rien à voir avec le spawnPoint

def Move(self): 
    self.vel[0]+=(self.target[0]-self.cen[0])*self.k 
    self.vel[1]+=(self.target[1]-self.cen[1])*self.k 
    if self.vel[0] > self.friction: self.vel[0]-= self.friction 
    elif self.vel[0] < self.friction: self.vel[0]+= self.friction 
    else: self.vel[0] = 0 
    if self.vel[1] > self.friction: self.vel[1]-= self.friction 
    elif self.vel[1] < self.friction: self.vel[1]+= self.friction 
    else: self.vel[1]=0 
    self.cen[0]+=self.vel[0] 
    self.cen[1]+=self.vel[1] 

Le spawnPoint est une constante que je joins au corps du serpent quand il fraye je l'aime d'être une liste parce que il a le corps du serpent fait des listes, et la méthode de rendu utilise index() pour faire des choses.

le code ne semble pas correspondre ici, donc je l'ai compressé. quelqu'un peut-il prendre un coup d'oeil? Merci http://www.mediafire.com/?zdcx5s93q9hxz4o

+1

Veuillez essayer de réduire le code à un exemple minimal montrant votre problème (cela pourrait aussi vous aider à trouver le problème vous-même) – second

+0

Eh bien, je ne peux pas le réduire parce que je ne sais pas ce qui ne va pas Snake.spawnPoint 'est changé par' Cam.move() ', j'ai oublié de le mentionner dans la description – andrewrocks

+1

@andrew: Vous pourriez juste mettre deux déclaration d'impression autour de l'endroit quand entier change en flotteur pour voir si cela se passe effectivement. Est-ce que vous faites une division là-bas? – SilentGhost

Répondre

4

Les entiers se transforment en flottants si vous les combinez dans une expression, c'est-à-dire multiplication, addition, soustraction (pas nécessairement la division). Très probablement, certaines de vos variables sont flottantes, par ex. self.friction.

Les floats ne retournent pas aux entiers eux-mêmes, uniquement via int(). Si vous observez autre chose, vous l'observez mal.

Il semble que votre méthode Move modifie indirectement "spanwPoint". Je ne sais pas si cela est prévu comportement, mais cela signifie probablement que vous avez deux références pointant vers la même liste. Par exemple.

self.spawnPoint = [1, 0] 
self.vel = self.spawnPoint # Does not make a copy! 
self.vel[0] += 0.1 
self.vel[1] += 0.2 

entraînera self.spawnPoint (aussi) étant [1,1, 0,2]

+0

euhmmm .. J'ai beaucoup de méthodes de mouvement: D, dont vous parlez? – andrewrocks

+0

On dirait que Camera.SnapTo() 'serait un coupable. –

+0

Merci! J'ai été bloqué dessus pendant des jours, maintenant je peux revenir à l'amusement :),/est-ce que c'est bon d'utiliser spawnPoint [:] pour faire une copie si elle? – andrewrocks

1

En Python (comme dans beaucoup d'autres langues) toute opération arithmétique simple (par exemple, +, -, /, *) impliquant un entier et un flottant sont évalués à une réponse qui est un flottant. Les entiers ne se transforment jamais en flottants, c'est le résultat de l'opération qui est retournée en tant que flottant.

Notez que le résultat des opérations impliquant uniquement des entiers est renvoyé sous la forme d'un entier (j'utilise le mot entier pour désigner à la fois int et long en Python).