2017-07-25 1 views
1

私はプログラムを作っていると私は私のヘビは、それが向かっているのと同じ方向に行くようにしたいが、私はこのコードをしようとすると:私は二度回すことができる :度を最大360に設定するにはどうすればよいですか?

def move(self): 
    if pressed_keys[self.ctrls[0]]and self.dire == 0: 
     self.y -= 10 
    if pressed_keys[self.ctrls[0]]and self.dire == 90: 
     self.x -= 10 
    if pressed_keys[self.ctrls[0]]and self.dire == 180: 
     self.y += 10 
    if pressed_keys[self.ctrls[0]]and self.dire == -90: 
     self.x += 10 

def turn_left(self): 
    self.dire += 90 

def turn_right(self): 
    self.dire -= 90 
. 
. 
. 
while 1: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      sys.exit() 
     if event.type == KEYDOWN and event.key == K_LEFT: 
      snake.turn_left() 
     if event.type == KEYDOWN and event.key == K_RIGHT: 
      snake.turn_right() 
    pressed_keys = pygame.key.get_pressed() 

は問題があります右矢印キーが、私はもうその方向に行くことはできません。それは私がしたことでした:私は矢印を2回押しました - > self.dire - 90 - 90。だからself.direは-180になりました。私は、値を変更することができます:私は

if pressed_keys[self.ctrls[0]]and self.dire == 180 or -180: 
    self.y += 10 

if pressed_keys[self.ctrls[0]]and self.dire == 180: 
    self.y += 10 

を変えることができるが、私は、右矢印に別の4回押した場合、私はそのように上の値-540を追加しなければなりません。誰かがより良い解決策を知っていますか?またはself.direは-360〜360度の間でなければならないと言うことができますか?

+1

モジュロ( '%'演算子)で除算しましたか? – Pavlus

+0

いいえ、どうすれば使用できますか? – AV13

+2

これは、除算演算の残りの部分を返すので、 '450%360'は' 90'を返します。 – Pavlus

答えて

1

これは、モジュロ%演算子を使用する@Pavlusの提案に加えて、表示を簡単にするためのいくつかの書式修正があります。

def move(self): 
    self.dire = self.dire % 360 

    if pressed_keys[self.ctrls[0]]: 
     if self.dire == 0: self.y -= 10 
     if self.dire == 90: self.x -= 10 
     if self.dire == 180: self.y += 10 
     if self.dire == 270: self.x += 10 

def turn_left(self): 
    self.dire = (self.dire + 90) % 360 

def turn_right(self): 
    self.dire = (self.dire - 90) % 360 
. 
. 
. 
while 1: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      sys.exit() 
     if event.type == KEYDOWN and event.key == K_LEFT: 
      snake.turn_left() 
     if event.type == KEYDOWN and event.key == K_RIGHT: 
      snake.turn_right() 
    pressed_keys = pygame.key.get_pressed() 
2

turn_leftturn_rightにモジュロ演算子を使用するように変更します。

def turn_left(self): 
    self.dire = (self.dire + 90) % 360 

def turn_right(self): 
    self.dire = (self.dire - 90) % 360 
a % b

オペレータはabで割った余りを返し、そうself.direは範囲[0、360)内にとどまります。

また、三角関数を使用し、

if pressed_keys[self.ctrls[0]]and self.dire == 270: 

あるいは、より良いに

if pressed_keys[self.ctrls[0]]and self.dire == -90: 

を変更する必要があります。その場合

import math 

def move(self): 
    if pressed_keys[self.ctrls[0]]: 
     self.x += 10 * int(math.cos(math.radians(self.dire))) 
     self.y += 10 * int(math.sin(math.radians(self.dire))) 

、あなたもモジュロ演算子を必要としないだろうが、それを周りに保つために良いことかもしれません。

関連する問題