蛇游戏,移动水平Python / Pygame时创建额外的块

时间:2015-09-08 03:46:13

标签: python pygame

每当你将蛇从水平转换为垂直时,它就会留下一个块。我正在使用一个列表来跟踪块位置。我正在使用一个10 * 10的黑色块作为蛇的身体,我正在使用一个10 * 10的白色块擦除它。

import pygame as pg
from random import randint
import sys, time, random, os
run = True

pg.init()
size = 500, 500
caption = "Snake"
pg.display.set_caption(caption)
screen = pg.display.set_mode(size)
white = 255, 255, 255
black = 0, 0, 0
screen.fill(white)
key = pg.key.get_pressed()
clock = pg.time.Clock()
snake = pg.image.load("Snake.png")
destroy = pg.image.load("Snake_Destroy.png")
global pos_x, pos_y, pos, snakelist, init_length, add_x, add_y
pos_x = 250
add_x = 0
add_y = -10
init_length = 4
pos_y = 250
pos = pos_x, pos_y
snakelist = []
gap = 2
snakelist.extend((pos))

def update(key, screen, gap):
    for event in pg.event.get():
        if event.type == pg.QUIT or key[pg.K_ESCAPE]: sys.exit(), pg.quit()

    global pos_x, pos_y, pos, snakelist, init_length, add_x, add_y

    s_x = add_x / 10 * gap
    s_y = add_y / 10 * gap

    pos_y += add_y + s_y
    pos_x += add_x + s_x

    pos = pos_x, pos_y

    screen.blit(snake, (pos))

    snakelist.extend((pos))

    if not init_length > 0:
        screen.blit(destroy, (snakelist.pop(1), snakelist.pop(2)))
    else:
        init_length += -1

    print pos

    pg.display.update()

def control(key):

    global add_y, add_x

    key = pg.key.get_pressed()

    if key[pg.K_UP]:
        if not add_y == 10:
            add_y = -10
            add_x = 0
    if key[pg.K_DOWN]:
        if not add_y == -10:
            add_y = 10
            add_x = 0
    if key[pg.K_LEFT]:
        if not add_x == 10:
            add_x = -10
            add_y = 0
    if key[pg.K_RIGHT]:
        if not add_x == -10:
            add_x = 10
            add_y = 0

while run:
    update(key, screen, gap)
    control(key)
    clock.tick(10)

1 个答案:

答案 0 :(得分:1)

你在第48行screen.blit(destroy, (snakelist.pop(1), snakelist.pop(2)))中弹出错误的坐标。

  

list.pop([i]):删除列表中给定位置的项目,然后将其返回。

您正在弹出第二个(列表索引1)元素和第三个(列表索引2)元素。但是当你弹出时,所有元素的位置都会移动一个位置。因此,在您的情况下,您必须始终弹出第一个元素,即位置0的元素不是1。

因此请更新您的第48行。应该是screen.blit(destroy, (snakelist.pop(0), snakelist.pop(0)))

现在没有额外的块。工作正常。