我正在用pygame编写Snake,但是对于如何实现Snake不断增长的功能我还不太清楚。我做了一个列表(“lista_cobra”),包含头部坐标(大约30x30像素),并考虑从这个列表中创建另一个列表,包含头部的最后位置,不包括最后一个部分,因此绘制了一张身体蛇的图片(“corpito”也是30x30像素),从那里,每个点都累积起来。这个想法付诸实践时效果不太好,因为我认为身体的方式不能使蛇的特征运动。我的问题是如何在保持身体特征性运动的同时,从头部先前的坐标中生长出身体?在
#-*- coding: latin1 -*-
import pygame, sys, os, random, math, time
from pygame.locals import *
pygame.init()
##### Cores ######
preto = (0, 0, 0)
vermelho = (255, 0, 0)
##################
##################
dimensao = [800, 600]
tela = pygame.display.set_mode(dimensao)
######### Objetos ###########
gramado = pygame.image.load(os.path.join("images", "fundocobrinha.jpg"))
paredes = pygame.image.load(os.path.join("images", "paredes.png"))
comp = pygame.image.load(os.path.join("images", "comidacobra.png"))
comp = pygame.transform.scale(comp, (18, 20))
cabeca = pygame.image.load(os.path.join("images", "cabecadacobra.png"))
corpito = pygame.image.load(os.path.join("images", "corpodacobra.png"))
corpo = pygame.transform.rotate(cabeca, 0)
caminhodafonte = os.path.join("fonte", "lunchds.ttf")
fonte = pygame.font.Font(caminhodafonte, 22)
fonte_fim = pygame.font.Font(caminhodafonte, 25)
#############################
###### Distancia #########
def distancia(x, y, x2, y2):
distancia = math.sqrt(((x2 - x) ** 2) + ((y2 - y) ** 2))
return distancia
##########################
########### cobra #############
pontos = 0
vidas = 3
raio_cobra = 12
raio_corpo = 12
x = [130]
y = [130]
def cobrinha():
global x, y, corpo, direcao, x_modificado, y_modificado
tela.blit(corpo, (x[0] - raio_cobra, y[0] - raio_cobra))
if direcao == "direita":
corpo = pygame.transform.rotate(cabeca, 0)
x_modificado = 3
y_modificado = 0
elif direcao == "esquerda":
corpo = pygame.transform.rotate(cabeca, 180)
x_modificado = -3
y_modificado = 0
elif direcao == "cima":
corpo = pygame.transform.rotate(cabeca, 90)
y_modificado = -3
x_modificado = 0
elif direcao == "baixo":
corpo = pygame.transform.rotate(cabeca, 270)
y_modificado = 3
x_modificado = 0
x[0] += x_modificado
y[0] += y_modificado
################################
###### Comida da Cobra #########
raio_cCobra = 4
nova_comida = True
x2 = 0
y2 = 0
def comida():
global x2, y2, comp, nova_comida
if nova_comida:
x2 = random.randint(47, 747)
y2 = random.randint(56, 548)
nova_comida = False
tela.blit(comp, (x2 - raio_cCobra, y2 - raio_cCobra))
################################
########## Informações de status #############
def status_de_jogo():
global pontos, fonte
p = fonte.render("Pontos: " + str(pontos), True, preto)
tela.blit(p, (45,37))
v = fonte.render("Vidas :" + str(vidas), True, preto)
tela.blit(v, (45,61))
###############################
######## mensagen de tela ######
def mensagem_de_tela():
mensagem_de_texto = fonte_fim.render("Fim de Jogo, pressione C para jogar ou Q para sair.", True, vermelho)
tela.blit(mensagem_de_texto,[55,200])
################################
######################################## Loop principal ###################################################
def loop_jogo():
global x, y, x2, x2, vidas, pontos, distancia, corpo, raio_cCobra, raio_cobra, counter, nova_comida, lista_cobra,lista_corpo, direcao
direcao = "direita"
lista_cobra = []
clock = pygame.time.Clock()
sair_do_jogo = False
fim_de_jogo = False
while not sair_do_jogo:
while fim_de_jogo == True:
mensagem_de_tela()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
sair_do_jogo = True
fim_de_jogo = False
if event.key == pygame.K_c:
loop_jogo()
#### Capturando todos os eventos durante a execução ####
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
direcao = "direita"
elif event.key == pygame.K_LEFT:
direcao = "esquerda"
elif event.key == pygame.K_UP:
direcao = "cima"
elif event.key == pygame.K_DOWN:
direcao = "baixo"
if event.type == QUIT:
sair_do_jogo = True
####### posição da cabeça da cobra ###########
cabeca_cobra = []
cabeca_cobra.append(x[0])
cabeca_cobra.append(y[0])
lista_cobra.append(cabeca_cobra)
tela.blit(gramado, (0, 0))
tela.blit(paredes, (0, 0))
comida()
cobrinha()
status_de_jogo()
clock.tick(60)
fps = clock.get_fps()
pygame.display.set_caption("Shazam Caraí II ## FPS: %.2f" %fps)
########## Se bater nas paredes ##################
if (x[0] >= 751 or x[0] <= 44) or (y[0] >= 553 or y[0] <= 42):
vidas -= 1
x = 400
y = 300
##################################################
if distancia(int(x[0]), int(y[0]), x2, y2) < (raio_cobra + raio_cCobra):
nova_comida = True
pontos += 1
if vidas == 0:
fim_de_jogo = True
mensagem_de_tela()
pygame.display.flip()
###########################################################################################################
loop_jogo()
我看不懂你的消息来源,但我想试试看。在
蛇的身体由
lista_cobra
中的位置组成。将蛇的长度存储在变量len_cobra
中。现在,当头部继续移动时,头部的新位置必须添加到lista_cobra
的顶部:但现在这个名单必须再次缩短到眼镜蛇的长度
^{pr2}$现在回到你的问题上:如何培育蛇?这很容易做到,每次特定事件发生时(通常在一些移动之后)增加一个
len_cobra
。剩下的已经处理好了。在相关问题 更多 >
编程相关推荐