Pygame-蛇的身体没有跟上头部

时间:2019-12-22 23:50:03

标签: python pygame

我正在尝试使用带有python和pygame的图像制作简单的蛇游戏。现在我知道其他人在使用其他语言时也遇到了问题,但是我仍然无法弄清楚。因此,我创建了一个头列表,一个身体列表也包含了容易发生的碰撞,并且我还创建了一个位置列表。位置列表的每2个元素都是x和y属性,[0][1]头,[2][3]第一个主体(我在游戏开始时创建了这两个)。问题是头部在移动,但第一个身体没有移动,在头部与苹果碰撞后也发生了同样的情况,在屏幕中间创建了一个新的身体,并立即根据位置列表重新定位。但是它只是停留在中间,我使用一些打印语句进行了检查,只是为了确定头部和位置列表rect.x的{​​{1}}和rect.y值,并且该列表可以完美更新,但不是当我给新的价值观的身体。任何想法,因为这是需要完成的最后一部分,而我对此真的很强调。 在此先感谢您,这里是代码的一部分(其中一些需要删除或用作测试,稍后再做)。

列表:

[0][1]

初始化头部和身体

 snake_positions_list = []
    #snake = Snake(display_width, display_height,screen.WHITE)
    snake_head_list = pygame.sprite.Group()
    snake_head = snake_Head(display_width, display_height, screen.WHITE)
    snake_head_list.add(snake_head)
    all_sprites_list.add(snake_head)

    snake_body_list = pygame.sprite.Group()
    snake_body = snake_Body(display_width, display_height, screen.WHITE)
    snake_body_list.add(snake_body)
    all_sprites_list.add(snake_body)

身体和头部移动-位置部分(它应该在新的身体产生并在位置列表上增加后对一个以上的身体起作用,但是它甚至对于第一个都不起作用:

     if init_list == 1:
        for snake_head in snake_head_list:
            snake_head.set_Init_Position()
            snake_positions_list.append(snake_head.rect.x)
            snake_positions_list.append(snake_head.rect.y)
        for snake_body in snake_body_list:
            snake_body.speedx = 30
            snake_body.speedy = 0
            snake_body.set_Init_Position()
            snake_positions_list.append(snake_body.rect.x)
            snake_positions_list.append(snake_body.rect.y)
        init_list = 0

蛇-水果碰撞和新的身体生成:

i = 0
        for snake_body in snake_body_list:
            #snake_body.Reposition(snake_positions_list[i], snake_positions_list[i + 1])
            snake_body.rect.x = snake_positions_list[i]
            snake_body.rect.y = snake_positions_list[i + 1]
            snake_body.set_Image()
            print("Snake Body rect x : " +str(snake_body.rect.x))
            print("Snake Body x : "+str(snake_body.x))
            #snake_body.move()
            i += 1
        print("Head x position: "+str(snake_positions_list[0]))
        print("Head y position: "+str(snake_positions_list[1]))

        for snake_head in snake_head_list:
            if snake_head.alive == 1:
                snake_head.move()
                print("SNake rect x : "+ str(snake_head.rect.x))
                print("Snake x : "+ str(snake_head.x))
        i = 0

碰撞方法:

add_score = 0
        add_score = fruit_collision(snake_head_list, objective_list, all_sprites_list)
        game_score = game_score + add_score
        if add_score == 1:
            snake_body = snake_Body(display_width, display_height, screen.WHITE) 
            new_bodyx = snake_length * 2 - 2
            new_bodyy = snake_length * 2 - 1
            snake_positions_list .append(snake_positions_list[new_bodyx - 2])
            snake_positions_list.append(snake_positions_list[new_bodyy - 1])
            snake_body.rect.x = snake_positions_list[new_bodyx]
            snake_body.rect.y = snake_positions_list[new_bodyy]
            snake_body_list.add(snake_body)
            all_sprites_list.add(snake_body)
            snake_length += 1
            add_score = 0

几乎在比赛结束时更新位置列表def fruit_collision(snake_head_List, objective_list, all_sprites_list): k = 0 for snake_head in snake_head_List: objective_snake_collide_list = pygame.sprite.spritecollide(snake_head, objective_list, False) if objective_snake_collide_list: print("Body list length before fruit: " + str(len(snake_head_List))) for fruit in objective_list: fruit.respawn() k = fruit.points return k 上的头部位置,以确保:

[0][1]

身体课:

snake_positions_list[0] = snake_head.rect.x
snake_positions_list[1] = snake_head.rect.y

头等舱

class snake_Body(pygame.sprite.Sprite):
def __init__(self, display_width, display_height, colour):
    super().__init__()

    self.width = 30
    self.height = 30
    self.original_length = 3
    self.display_width = display_width
    self.display_height = display_height
    self.colour = colour
    self.rotation = 1      
    self.x = (self.display_width / 2) - self.width
    self.y = (self.display_height / 2)
    self.image = pygame.image.load(path + 'Snake_Body_30x30.png').convert()
    self.rect = self.image.get_rect(topleft = (self.x, self.y))
    self.image.set_colorkey(self.colour)
    self.body_type = 2
    self.set_Init_Position()  
    self.set_Image()

def set_Direction(self, x, y, r):
    self.speedx = x
    self.speedy = y
    self.rotation = r

    #Check window boundaries
    if (-self.width > self.rect.x)  or (self.rect.x > self.display_width +5) or (self.rect.y < -self.height) or (self.rect.y > self.display_height +5):
        self.alive = 0

def Reposition(self, listx, listy):
    self.rect.x = listx
    self.rect.y = listy

def set_Rotation(self, r):
    self.rotation = r

def set_Init_Position(self):
    self.x = (self.display_width / 2) - self.width
    self.y = (self.display_height / 2)
    self.image = pygame.image.load(path + 'Snake_Body_30x30.png').convert()
    self.rect = self.image.get_rect(topleft = (self.x, self.y))
    self.image.set_colorkey(self.colour)

def set_Image(self):
    self.image = pygame.image.load(path + 'Snake_Body_30x30.png').convert()
    self.rect = self.image.get_rect(topleft = (self.x, self.y))
    self.image.set_colorkey(self.colour)

这些类不需要某些功能,我在讨论了这个问题后对项目进行了改革,因为我提到清理将在项目准备好后进行。

再次感谢您的光临!

0 个答案:

没有答案