2017-02-05 5 views
0

私はスネークゲームを作っています。このゲームでは、スネークが食べ物に当ると、スネークの長さが増えます。私が持っている問題は、私がヘビの長さを長くし、それをテストするのに役立ついくつかのコードを実装したときに、ヘビは場面の裏に動いていたが表示されていなかったということです。私はディスプレイを更新する必要があることを知っているが、私はどこにいないのか分からない。表示を更新する場所がわからない - PyGame

PYTHON

# IMPORT 
import pygame, random, time, sys 

# GLOBALS 
global screen, displayW, displayH 
global clock, FPS, end, font 
global snake, food, gameOverText 

# SETGLOBALVALUES 
def setGlobalValues(): 
    global screen, displayW, displayH 
    global clock, FPS, end, font 
    global snake, food, gameOverText 

    displayW = 600 
    displayH = 400 
    screen = pygame.display.set_mode((displayW, displayH)) 

    clock = pygame.time.Clock() 
    FPS = 15 
    end = False 
    font = pygame.font.SysFont("robotomono", 40) 

    snake = Snake() 
    food = Food() 

    gameOverText = Text() 
    gameOverText.text = "GAME OVER" 
    gameOverText.color = (255, 0, 0) 

# SNAKE 
class Snake(): 
    def __init__(self, leadX=0, leadY=0, velX=0, velY=0, change=0, w=0, h=0, color=(), list=[], head=[]): 
     self.leadX = displayW/2 
     self.leadY = displayH/2 
     self.velX = 0 
     self.velY = 0 
     self.change = 10 
     self.w = 10 
     self.h = 10 
     self.list = [] 
     self.head = [] 
     self.color = (0, 0, 0) 

    def draw(self): 
     for XnY in self.list: 
      pygame.draw.rect(screen, self.color, (XnY[0], XnY[1], self.w, self.h)) 

    def animate(self): 
     self.leadX += self.velX 
     self.leadY += self.velY 

    def collision(self): 
     # collision with wall 
     if self.leadX < 0 or self.leadX + self.w > displayW or self.leadY < 0 or self.leadY + self.h > displayH: 
      gameOverText.draw() 
      exit() 

     # collision with food 
     if self.leadX >= food.x and self.leadX <= food.x + food.w and self.leadY >= food.y and self.leadY <= food.y: 
      food.reset() 

# FOOD 
class Food(): 
    def __init__(self, x=0, y=0, w=0, h=0, color=()): 
     self.w = 10 
     self.h = 10 
     self.x = round(random.randrange(0, displayW - self.w)/10.0) * 10.0 
     self.y = round(random.randrange(0, displayH - self.h)/10.0) * 10.0 
     self.color = (0, 200, 0) 

    def draw(self): 
     pygame.draw.rect(screen, self.color, (self.x, self.y, self.w, self.h)) 

    def reset(self): 
     self.x = round(random.randrange(0, displayW - self.w)/10.0) * 10.0 
     self.y = round(random.randrange(0, displayH - self.h)/10.0) * 10.0 

     self.draw() 

# TEXT 
class Text(): 
    def __init__(self, x=0, y=0, text="", color=()): 
     self.x = displayW/2 - 100 
     self.y = displayH/2 - 50 
     self.text = "" 
     self.color =() 

    def draw(self): 
     render = font.render(self.text, True, self.color) 

     screen.fill((255, 255, 255)) 
     screen.blit(render, (self.x, self.y)) 
     pygame.display.update() 

     time.sleep(2) 

# MAIN 
def main(): 
    pygame.init() 

    setGlobalValues() 
    setup() 
    gameLoop() 
    quit() 

# GAMELOOP 
def gameLoop(): 
    global end 

    while not end: 
     for event in pygame.event.get(): 
      # QUIT 
      if event.type == pygame.QUIT: 
       end = True 

      # KEYDOWN 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        snake.velX -= snake.change 
        snake.velY = 0 
       elif event.key == pygame.K_RIGHT: 
        snake.velX += snake.change 
        snake.velY = 0 

       elif event.key == pygame.K_UP: 
        snake.velY -= snake.change 
        snake.velX = 0 
       elif event.key == pygame.K_DOWN: 
        snake.velY += snake.change 
        snake.velX = 0 

     draw() 
     animate() 
     collision() 

     setFPS() 

# DRAW 
def draw(): 
    # fill background 
    screen.fill((255, 255, 255)) 

    snake.head.append(snake.leadX) 
    snake.head.append(snake.leadY) 
    snake.list.append(snake.head) 

    snake.draw() 
    food.draw() 

    # update 
    pygame.display.update() 

# ANIMATE 
def animate(): 
    snake.animate() 

# COLLISION 
def collision(): 
    snake.collision() 

# SETUP 
def setup(): 
    pygame.display.set_caption("Snake") 

# SETFPS 
def setFPS(): 
    clock.tick(FPS) 

# QUIT 
def exit(): 
    pygame.quit() 
    quit() 

# CALL MAIN 
if __name__ == "__main__": 
    main() 
+0

使用[pygame.Rect(http://pygame.org/docs/ref/rect.html)に'Rect'には衝突をチェックするメソッドがあり、' food.w + food.w'の代わりに 'rect.right'を使い、' draw.rect(screen、self.color)を描画することができます、self.rect) ' – furas

+0

スネーク要素のサイズが10でmoveが10の場合、リストのすべての要素を保持することができます(最初の要素はheadです)。移動すると、リストの先頭に新しい要素を追加し、最後の要素を削除します。リンゴを食べると、最後の要素は一度は取り除かれません。そして、ヘビは長くなります。 – furas

答えて

1

updateは正しい場所にあります。

draw()からsnake.animate()にコードを移動し、make_longer = True/Falseを追加して、リンゴを食べるとヘビが長くなっています。

# IMPORT 
import pygame, random, time, sys 

# GLOBALS 
global screen, displayW, displayH 
global clock, FPS, end, font 
global snake, food, gameOverText 

# SETGLOBALVALUES 
def setGlobalValues(): 
    global screen, displayW, displayH 
    global clock, FPS, end, font 
    global snake, food, gameOverText 

    displayW = 600 
    displayH = 400 
    screen = pygame.display.set_mode((displayW, displayH)) 

    clock = pygame.time.Clock() 
    FPS = 5 
    end = False 
    font = pygame.font.SysFont("robotomono", 40) 

    snake = Snake() 
    food = Food() 

    gameOverText = Text() 
    gameOverText.text = "GAME OVER" 
    gameOverText.color = (255, 0, 0) 

# SNAKE 
class Snake(): 
    def __init__(self, leadX=0, leadY=0, velX=0, velY=0, change=0, w=0, h=0, color=(), list=[], head=[]): 
     self.leadX = displayW/2 
     self.leadY = displayH/2 
     self.velX = 0 
     self.velY = 0 
     self.change = 10 
     self.w = 10 
     self.h = 10 
     self.list = [] 
     self.head = [] 
     self.color = (0, 0, 0) 

     self.make_longer = True 

    def draw(self): 
     for x, y in self.list: 
      pygame.draw.rect(screen, self.color, (x, y, self.w, self.h)) 

    def animate(self): 
     self.leadX += self.velX 
     self.leadY += self.velY 

     # add first element 
     self.head = [self.leadX, self.leadY] # <-- 
     self.list.insert(0, snake.head)  # <-- 

     if not self.make_longer:  # <-- 
      # remove last element  # <-- 
      del snake.list[-1]  # <-- 
     else:       # <-- 
      self.make_longer = False # <-- 

    def collision(self): 
     # collision with wall 
     if self.leadX < 0 or self.leadX + self.w > displayW or self.leadY < 0 or self.leadY + self.h > displayH: 
      gameOverText.draw() 
      exit() 

     # collision with food 
     if self.leadX >= food.x and self.leadX <= food.x + food.w and self.leadY >= food.y and self.leadY <= food.y: 
      food.reset() 
      self.make_longer = True # <-- 

# FOOD 
class Food(): 

    def __init__(self, x=0, y=0, w=0, h=0, color=()): 
     self.w = 10 
     self.h = 10 
     self.x = round(random.randrange(0, displayW - self.w)/10.0) * 10.0 
     self.y = round(random.randrange(0, displayH - self.h)/10.0) * 10.0 
     self.color = (0, 200, 0) 

    def draw(self): 
     pygame.draw.rect(screen, self.color, (self.x, self.y, self.w, self.h)) 

    def reset(self): 
     self.x = round(random.randrange(0, displayW - self.w)/10.0) * 10.0 
     self.y = round(random.randrange(0, displayH - self.h)/10.0) * 10.0 

# TEXT 
class Text(): 

    def __init__(self, x=0, y=0, text="", color=()): 
     self.x = displayW/2 - 100 
     self.y = displayH/2 - 50 
     self.text = "" 
     self.color =() 

    def draw(self): 
     render = font.render(self.text, True, self.color) 

     screen.fill((255, 255, 255)) 
     screen.blit(render, (self.x, self.y)) 
     pygame.display.update() 

     time.sleep(2) 

# MAIN 
def main(): 
    pygame.init() 

    setGlobalValues() 
    setup() 
    gameLoop() 
    quit() 

# GAMELOOP 
def gameLoop(): 
    global end 

    while not end: 
     for event in pygame.event.get(): 
      # QUIT 
      if event.type == pygame.QUIT: 
       end = True 

      # KEYDOWN 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        snake.velX -= snake.change 
        snake.velY = 0 
       elif event.key == pygame.K_RIGHT: 
        snake.velX += snake.change 
        snake.velY = 0 

       elif event.key == pygame.K_UP: 
        snake.velY -= snake.change 
        snake.velX = 0 
       elif event.key == pygame.K_DOWN: 
        snake.velY += snake.change 
        snake.velX = 0 

     draw() 
     animate() 
     collision() 

     setFPS() 

# DRAW 
def draw(): 
    # fill background 
    screen.fill((255, 255, 255)) 

    snake.draw() 
    food.draw() 

    # update 
    pygame.display.update() 

# ANIMATE 
def animate(): 
    snake.animate() 


# COLLISION 
def collision(): 
    snake.collision() 

# SETUP 
def setup(): 
    pygame.display.set_caption("Snake") 

# SETFPS 
def setFPS(): 
    clock.tick(FPS) 

# QUIT 
def exit(): 
    pygame.quit() 
    quit() 

# CALL MAIN 
if __name__ == "__main__": 
    main() 

BTW:赤ヘッドと黒の尾を引く

def draw(self): 
    # draw head 
    x, y = self.list[0] 
    pygame.draw.rect(screen, (255, 0, 0), (x, y, self.w, self.h)) 

    # draw tail 
    for x, y in self.list[1:]: 
     pygame.draw.rect(screen, self.color, (x, y, self.w, self.h)) 
関連する問題