【问题标题】:Snake game in pygame: body growth functionpygame中的蛇游戏:身体生长功能
【发布时间】:2016-09-25 17:20:22
【问题描述】:

我正在用 pygame 编写 Snake,但我对如何实现蛇的不断增长的功能不是很清楚。我制作了一个包含头部坐标(大约 30x30 像素)的列表(“lista_cobra”),并考虑从中制作另一个列表,其中包含头部的最后位置,不包括最后一段,因此绘制了身体蛇(“corpito”也是 30x30 像素),从那里开始,每一个点都累积起来。这个想法在付诸实践时效果不佳,因为我认为身体无法做出Snake特有的动作。我的问题是如何在保持身体特征运动的同时从头部的先前坐标生长身体?

#-*- 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()

【问题讨论】:

  • 用英语以外的语言编写代码会使其他程序员难以阅读和理解您的代码。如果可能,请尝试用英文编写代码,以获得更大的帮助。

标签: python python-2.7 pygame


【解决方案1】:

我无法阅读您的来源,但我会试一试。

蛇的身体由lista_cobra 中的位置组成。让蛇的长度存储在变量len_cobra 中。现在当头部移动时,头部的新位置必须添加到lista_cobra的顶部:

lista_cobra.insert(0, head_cobra)

但是现在必须再次将列表截断到眼镜蛇的长度

lista_cobra = lista_cobra[:len_cobra]

现在回到你的问题:如何养蛇?这很容易通过在每次特定事件发生时(通常在一些移动之后)将len_cobra 增加一来完成。其余的已经处理好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多