每当你将蛇从水平转换为垂直时,它就会留下一个块。我正在使用一个列表来跟踪块位置。我正在使用一个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)
答案 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)))
。
现在没有额外的块。工作正常。