2013-09-30 55 views
0

好的。所以我到目前为止在python上找到了一个蛇游戏的代码。到目前为止,游戏正在运作,但现在我已经开始将BNP从正方形改为圆形物体,而我想知道的是如何在输入处旋转身体和头部,让箭头键让身体部位发生变化。我不知道这是否可能,好吧,但不是我想要的方式。 我发布了下面的代码。如何在PyGame中旋转对象

import pygame 
import sys 
from pygame.locals import * 
import random 
import time 

left = -20 
right = 20 
up = 10 
down = -10 

size = width, height = 640, 480 
block_size = 20 

class Food: 
    def __init__(self, screen, snake): 
     self.snake = snake 
     self.screen = screen 
     self.image = pygame.image.load('food.bmp').convert() 
     self.spawn() 

    def spawn(self): 
     collision = True 

     while collision: 
      random_x = random.randrange(0, width, block_size) 
      random_y = random.randrange(0, height, block_size) 

      collision = False 

      for each in snake.parts: 
       if each.position.x == random_x and each.position.y == random_y: 
        collision = True 
        break 

     self.position = self.image.get_rect().move(random_x, random_y) 

     self.blit() 

    def blit(self): 
     self.screen.blit(self.image, self.position) 

class Part: 
    def __init__(self, x=0, y=0, direction=right): 
     self.direction = direction 
    self.image = pygame.image.load('part.bmp').convert() 
    self.position = self.image.get_rect().move(x, y) 
    self.speed = block_size 

def change_direction(self, direction): 
    if self.direction + direction == 0: 
      return 

     self.direction = direction 

    def move(self): 
     if self.position.x >= width - block_size and self.direction == right: 
      return False 

     if self.position.y >= height - block_size and self.direction == down: 
      return False 

     if self.position.x <= 0 and self.direction == left: 
      return False 

    if self.position.y <= 0 and self.direction == up: 
     return False 

     if self.direction == up: 
      self.position = self.position.move(0, -self.speed) 
     elif self.direction == down: 
      self.position = self.position.move(0, self.speed) 
     elif self.direction == right: 
      self.position = self.position.move(self.speed, 0) 
     elif self.direction == left: 
      self.position = self.position.move(-self.speed, 0) 

     return True 

class Parthead: 
    def __init__(self, x=0, y=0, direction=right): 
     self.direction = direction 
     self.image = pygame.image.load('parthead.bmp').convert() 
     self.position = self.image.get_rect().move(x, y) 
     self.speed = block_size 

    def change_direction(self, direction): 
     if self.direction + direction == 0: 
      return 

     self.direction = direction 

    def move(self): 
     if self.position.x >= width - block_size and self.direction == right: 
      return False 

     if self.position.y >= height - block_size and self.direction == down: 
      return False 

     if self.position.x <= 0 and self.direction == left: 
      return False 

     if self.position.y <= 0 and self.direction == up: 
      return False 

     if self.direction == up: 
      self.position = self.position.move(0, -self.speed) 
     elif self.direction == down: 
      self.position = self.position.move(0, self.speed) 
     elif self.direction == right: 
     self.position = self.position.move(self.speed, 0) 
     elif self.direction == left: 
      self.position = self.position.move(-self.speed, 0) 

     return True 

class Snake: 

    def __init__(self, screen, x=0, y=0): 
     self.screen = screen 
     self.head = Parthead(x, y) 
     self.direction = right 
     self.length = 1 
     self.parts = [] 
     self.parts.append(self.head) 
     self.extend_flag = False 

    def change_direction(self, direction): 
     self.direction = direction 

    def move(self, food): 
     new_direction = self.direction 
     old_direction = None 
     new_part = None 

     if self.extend_flag: 
      last_part = self.parts[-1] 
      new_part = Part(last_part.position.x, last_part.position.y, last_part.direction) 

     for each in self.parts: 
      old_direction = each.direction 
      each.change_direction(new_direction) 

      if not each.move(): 
       return False 

      new_direction = old_direction 

     if self.extend_flag: 
      self.extend(new_part) 

     for each in self.parts[1:]: 
      if each.position.x == self.head.position.x and each.position.y == self.head.position.y: 
       return False 

     if food.position.x == self.head.position.x and food.position.y == self.head.position.y: 
      food.spawn() 
      self.extend_flag = True 



     return True 



    def extend(self, part): 
     self.parts.append(part) 
     self.length += 1 
     self.extend_flag = False 

    def blit(self): 
     for each in self.parts: 
      self.screen.blit(each.image, each.position) 


black = 0, 0, 0 

pygame.init() 
pygame.display.set_caption('Snake by Jonathan Dring') 
screen = pygame.display.set_mode(size) 

game = True 

while True: 
    snake = Snake(screen) 
    food = Food(screen, snake) 

    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: sys.exit() 

      if event.type == KEYDOWN: 
       if (event.key == K_RIGHT): 
        snake.change_direction(right) 
       elif (event.key == K_LEFT): 
        snake.change_direction(left) 
       elif (event.key == K_UP): 
        snake.change_direction(up) 
       elif (event.key == K_DOWN): 
        snake.change_direction(down) 
       elif (event.key == K_SPACE): 
        snake.extend_flag = True 

     if not snake.move(food): 
      game = False 
      break 

     screen.fill(black) 
     print ("Snake - The Game") 
     snake.blit() 
     food.blit() 
     pygame.display.update() 
     pygame.time.delay(100) 

    while not game: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: sys.exit() 

      if event.type == KEYDOWN: 
       if (event.key == K_SPACE): 
        game = True 
       elif (event.key == K_RETURN): 
        game = True 
       elif event.key == K_ESCAPE: 
        pygame.quit() 






     background = pygame.image.load('gameover.bmp').convert() 
     screen.blit(background, (0, 0)) 
     pygame.display.flip() 
     pygame.time.delay(100) 

如果您知道如何操作,请回复!

+4

欢迎来到StackOverflow!以下是一些可以改善问题的方法:1)尝试限制问题的范围。你现在要求'在箭头键的输入处旋转身体和头部'。这实际上是几个问题:如何呈现旋转的图像?如何跟踪轮换?如何收集输入?集中精力于这些事情之一。然后,只显示你认为能解决这个问题的代码,并解释为什么它不起作用。如果你遇到一个特定的问题,StackOverflow的效果最好,不要求编写新功能的一般帮助。 –

+0

这个问题是你可以在文档站点上很容易找到的 –

回答

1

鉴于目前还没有答案,下面是如何旋转精灵。当然,你只能旋转精灵的矩形。当添加到精灵时,此功能会在您向其发送角度时使其旋转:

def rotate(self,angle): 
    self.rect = pygame.transform.rotate(self.rect, angle) 

这应该起作用。