Python 蟒蛇不';成长

Python 蟒蛇不';成长,python,pygame,Python,Pygame,我是python新手,只是现在才了解基本知识,我正在尝试制作一个蛇游戏,但我似乎不知道如何让我的蛇在每次吃苹果时多长出一个正方形。我的理由是,我保留了一个所有旧位置的列表,但只在屏幕上显示最后一个位置,每次蛇吃另一个苹果时,它都会显示额外的1个旧位置,使蛇变长1个正方形。 这是我的代码: import pygame from random import randint WIDTH = 400 HEIGHT = 300 dis = pygame.display.set_mode((WIDTH,H

我是python新手,只是现在才了解基本知识,我正在尝试制作一个蛇游戏,但我似乎不知道如何让我的蛇在每次吃苹果时多长出一个正方形。我的理由是,我保留了一个所有旧位置的列表,但只在屏幕上显示最后一个位置,每次蛇吃另一个苹果时,它都会显示额外的1个旧位置,使蛇变长1个正方形。 这是我的代码:

import pygame
from random import randint

WIDTH = 400
HEIGHT = 300
dis = pygame.display.set_mode((WIDTH,HEIGHT))
white = (255,255,255)
BACKGROUND = white
blue = [0,0,255]
red = [255,0,0]

class Snake: 
def __init__(self):
  self.image = pygame.image.load("snake.bmp")
  self.rect = self.image.get_rect()
  self.position = (10,10)
  self.direction = [0,0]
  self.positionslist = [self.position]
  self.length = 1
  pygame.display.set_caption('Snake ')

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


def update(self):
  self.position = (self.position[0] + self.direction[0],self.position[1] + self.direction[1])
  self.rect = (self.position[0],self.position[1],5, 5 )
  self.positionslist.append(self.position)
  if self.position[0]< 0 :
    self.position = (WIDTH,self.position[1]) 
  elif self.position[0] > WIDTH:
    self.position = (0,self.position[1])
  elif self.position[1] > HEIGHT:
    self.position = (self.position[0],0)
  elif self.position[1] < 0 :
    self.position = (self.position[0],HEIGHT)





class Food:
def __init__(self):
self.image = pygame.image.load("appel.png")
self.rect = self.image.get_rect()

apple_width = -self.image.get_width()
apple_height = -self.image.get_height()
self.position = (randint(0,WIDTH+apple_width-50),randint(0,HEIGHT+apple_height-50))
self.rect.x = self.position[0]
self.rect.y = self.position[1]

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

def eat_appel (self, snake):

if self.rect.colliderect(snake.rect) == True:

  self.position = (randint(0,WIDTH),randint(0,HEIGHT))
  self.rect.x = self.position[0]
  self.rect.y = self.position[1]
  snake.length += 1



def main():
game_over = False 
while not game_over:
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
snake = Snake()
food = Food()

while True:
  screen.fill(BACKGROUND)
  font = pygame.font.Font('freesansbold.ttf', 12)
  text = font.render(str(snake.length), True, red, white)
  textRect = text.get_rect()
  textRect.center = (387, 292)
  screen.blit(text,textRect)
  snake.update()
  
  #snake.update_list()
  snake.draw_snake(screen)
  food.draw_appel(screen)
  food.eat_appel(snake)
  pygame.display.flip()
  
  clock.tick(60)
  

  

  for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN:
      snake.direction = [0,1]
    if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_RIGHT:
         snake.direction = [1,0] 
      if event.key == pygame.K_LEFT:
        snake.direction = [-1,0] 
      if event.key == pygame.K_UP:
        snake.direction = [0,-1]
      if event.key == pygame.K_DOWN:
       snake.direction = [0,1]




 if __name__ == "__main__":
   main()
导入pygame
从随机导入randint
宽度=400
高度=300
dis=pygame.display.set_模式((宽度、高度))
白色=(255255)
背景=白色
蓝色=[0,0255]
红色=[255,0,0]
蛇类:
定义初始化(自):
self.image=pygame.image.load(“snake.bmp”)
self.rect=self.image.get_rect()
self.position=(10,10)
self.direction=[0,0]
self.positionslist=[self.position]
self.length=1
pygame.display.set_标题('Snake'))
def draw_snake(自身,屏幕):
屏幕blit(self.image,self.position)
def更新(自我):
自位置=(自位置[0]+自方向[0],自位置[1]+自方向[1])
self.rect=(self.position[0],self.position[1],5,5)
self.positionslist.append(self.position)
如果自身位置[0]<0:
self.position=(宽度,self.position[1])
elif自身位置[0]>宽度:
self.position=(0,self.position[1])
elif自身位置[1]>高度:
self.position=(self.position[0],0)
elif自身位置[1]<0:
self.position=(self.position[0],高度)
类别食物:
定义初始化(自):
self.image=pygame.image.load(“appel.png”)
self.rect=self.image.get_rect()
apple\u width=-self.image.get\u width()
apple\u height=-self.image.get\u height()
self.position=(randint(0,宽度+apple\u宽度-50),randint(0,高度+apple\u高度-50))
self.rect.x=self.position[0]
self.rect.y=self.position[1]
def draw_appel(自身,屏幕):
屏幕blit(self.image,self.position)
def eat_appel(self,snake):
如果self.rect.collide rect(snake.rect)=True:
self.position=(randint(0,宽度),randint(0,高度))
self.rect.x=self.position[0]
self.rect.y=self.position[1]
snake.length+=1
def main():
游戏结束=错误
虽然游戏尚未结束:
pygame.init()
screen=pygame.display.set_模式((宽度、高度))
clock=pygame.time.clock()
蛇
食物
尽管如此:
屏幕填充(背景)
font=pygame.font.font('freesansbold.ttf',12)
text=font.render(str(snake.length)、真、红、白)
textRect=text.get_rect()
textRect.center=(387292)
screen.blit(text,textRect)
snake.update()
#snake.update_list()
蛇。画蛇(屏幕)
食物。绘图(屏幕)
食物,吃蛇
pygame.display.flip()
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.MOUSEBUTTONDOWN:
snake.direction=[0,1]
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_RIGHT:
snake.direction=[1,0]
如果event.key==pygame.K_左:
snake.direction=[-1,0]
如果event.key==pygame.K_UP:
snake.direction=[0,-1]
如果event.key==pygame.K_向下:
snake.direction=[0,1]
如果名称=“\uuuuu main\uuuuuuuu”:
main()

这可能有多种原因。首先,我看到您试图通过键入snake.length+=1来增加snake的长度,这可能会起作用(可能不会,因为模块pygame允许snake悬停,但与循环或条件语句不同)。我的一个小贴士是,通过每次将分数与你现在的snake.length相加来增加蛇的长度(因为一旦你吃苹果的分数为1,你的snake.length将为2,并且随着分数的增加而增加)。这是我的代码(可能需要一些修改):

导入pygame
导入时间
随机输入
pygame.init()
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
橙色=(255,165,0)
宽度,高度=600400
game_display=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“蛇狂”)
clock=pygame.time.clock()
蛇的大小=10
蛇行速度=15
message\u font=pygame.font.SysFont('ubuntu',30)
score\u font=pygame.font.SysFont('ubuntu',25)
def打印分数(分数):
text=score\u font.render(“分数:+str(分数),真,橙色)
game_display.blit(文本,[0,0])
def draw_snake(snake_大小,snake_像素):
对于snake_像素中的像素:
pygame.draw.rect(游戏显示,白色,[像素[0],像素[1],蛇大小,蛇大小])
def run_game():
游戏结束=错误
game_close=False
x=宽度/2
y=高度/2
x_速度=0
y_速度=0
snake_像素=[]
蛇_长度=1
目标x=圆形(随机。随机范围(0,宽度-蛇形大小)/10.0)*10.0
目标y=圆形(随机。随机范围(0,高度-蛇大小)/10.0)*10.0
虽然游戏尚未结束:
游戏结束时:
游戏显示填充(黑色)
game\u over\u message=message\u font.render(“game over!”,True,红色)
game\u display.blit(game\u over\u消息,[width/3,height/3])
打印分数(蛇形长度-1)
pygame.display.update()
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_1:
游戏结束=正确
game_close=False
如果event.key==pygame.K_2:
运行游戏()
如果event.type==pygame.QUIT:
游戏结束=正确
game_close=False
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
游戏结束=正确
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
x_速度=-蛇_大小
y_速度=0
如果event.key==pygame.K_RIGHT:
x_速度=蛇_大小
y_速度=0
如果event.key==pygame.K_UP:
x_速度=
import pygame
import time
import random

pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
orange = (255, 165, 0)

width, height = 600, 400

game_display = pygame.display.set_mode((width, height))
pygame.display.set_caption("Snake Mania")

clock = pygame.time.Clock()

snake_size = 10
snake_speed = 15

message_font = pygame.font.SysFont('ubuntu', 30)
score_font = pygame.font.SysFont('ubuntu', 25)

def print_score(score):
    text = score_font.render("Score: " + str(score), True, orange)
    game_display.blit(text, [0,0])

def draw_snake(snake_size, snake_pixels):
    for pixel in snake_pixels:
        pygame.draw.rect(game_display, white, [pixel[0], pixel[1], snake_size, snake_size])


def run_game():

    game_over = False
    game_close = False

    x = width / 2
    y = height / 2

    x_speed = 0
    y_speed = 0

    snake_pixels = []
    snake_length = 1

    target_x = round(random.randrange(0, width - snake_size) / 10.0) * 10.0
    target_y = round(random.randrange(0, height - snake_size) / 10.0) * 10.0

    while not game_over:

        while game_close:
            game_display.fill(black)
            game_over_message = message_font.render("Game Over!", True, red)
            game_display.blit(game_over_message, [width / 3, height / 3])
            print_score(snake_length - 1)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_1:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_2:
                        run_game()
                if event.type == pygame.QUIT:
                    game_over = True
                    game_close = False

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_speed = -snake_size
                    y_speed = 0
                if event.key == pygame.K_RIGHT:
                    x_speed = snake_size
                    y_speed = 0
                if event.key == pygame.K_UP:
                    x_speed = 0
                    y_speed = -snake_size
                if event.key == pygame.K_DOWN:
                    x_speed = 0
                    y_speed = snake_size

        if x >= width or x < 0 or y >= height or y < 0:
            game_close = True

        x += x_speed
        y += y_speed

        game_display.fill(black)
        pygame.draw.rect(game_display, orange, [target_x, target_y, snake_size, snake_size])
        snake_pixels.append([x, y])

        if len(snake_pixels) > snake_length:
            del snake_pixels[0]

        for pixel in snake_pixels[:-1]:
            if pixel == [x, y]:
                game_close = True

        draw_snake(snake_size, snake_pixels)
        print_score(snake_length - 1)

        pygame.display.update()

        if x == target_x and y == target_y:
            target_x = round(random.randrange(0, width - snake_size) / 10.0) * 10.0
            target_y = round(random.randrange(0, height - snake_size) / 10.0) * 10.0
            snake_length += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

run_game()