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()
使用[pygame.Rect(http://pygame.org/docs/ref/rect.html)に'Rect'には衝突をチェックするメソッドがあり、' food.w + food.w'の代わりに 'rect.right'を使い、' draw.rect(screen、self.color)を描画することができます、self.rect) ' – furas
スネーク要素のサイズが10でmoveが10の場合、リストのすべての要素を保持することができます(最初の要素はheadです)。移動すると、リストの先頭に新しい要素を追加し、最後の要素を削除します。リンゴを食べると、最後の要素は一度は取り除かれません。そして、ヘビは長くなります。 – furas