добавить уровень в Pygame - PullRequest
0 голосов
/ 06 июля 2018

Я написал первый уровень моей игры (вы управляете змеей с помощью кнопок вверх, вниз, вправо и влево, чтобы съесть яблоко, и длина змеи увеличивается), но я не знаю, где начать следующий уровень и как написать это Я имею в виду, я не знаю, есть ли какой-нибудь класс или вещь для начала нового уровня в Pygame; [объяснение уровня 2 на всякий случай: есть две змеи, которые вы контролируете одну из них, как я сказал, и компьютер (случайный) контролирует другую, и есть некоторые стены в качестве барьеров; я хочу, чтобы это было так, как оно идет к следующий уровень, когда вы достигнете 5-го счета в уровне 1] вот мой код:

import pygame
import random
pygame.init()

#colors
black=(0,0,0)
crismon=(220,20,60)
white=(255,255,255)
vanila=(255,250,226)
pink=(255,204,255)

display_width=700
display_height=500

gameDisplay=pygame.display.set_mode((display_width,display_height))
#caption0
pygame.display.set_caption("Snake")

#icon
icon=pygame.image.load('the picture's path')
pygame.display.set_icon(icon)

clock=pygame.time.Clock()


block_size=10
#frames per second
fps=25

#font
font=pygame.font.SysFont(None,25)

#score
def score(score):
    text=font.render("Score:"+str(score),True,crismon)
    gameDisplay.blit(text,[0,0])

def message_to_screen(msg,color,y_displace=0):
    textSurf=font.render(msg,True,color)
    textRect=textSurf.get_rect()
    textRect.center=(display_width/2),(display_height/2)+y_displace
    gameDisplay.blit(textSurf,textRect)

def snake(block_size,snakeList):
    for XnY in snakeList:
        pygame.draw.rect(gameDisplay,crismon,[XnY[0],XnY[1],block_size,block_size])

def game_intro():
    intro=True
    while intro:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                quit()
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_p:
                    intro=False
                if event.type==pygame.K_q:
                    pygame.quit()
                    quit()


        gameDisplay.fill(crismon)
        message_to_screen("Welcome to Snake",white,-70)
        message_to_screen("Eat the Apple!",white,-40)
        message_to_screen("Press P to play or Q to quit!",white,-10)
        pygame.display.update()

def gameLoop():
    gameExit=True

    lead_x=display_width/2
    lead_y=display_height/2

    lead_x_change=0
    lead_y_change=0

    snakeList=[]
    snakeLength=10

    randAppleX=round(random.randrange(0,display_width-block_size)/10.0)*10.0
    randAppleY=round(random.randrange(0,display_height-block_size)/10.0)*10.0

    while gameExit:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                quit()
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_RIGHT:
                    lead_x_change=block_size
                    lead_y_change=0
                elif event.key==pygame.K_LEFT:
                    lead_x_change=-block_size
                    lead_y_change=0
                elif event.key==pygame.K_UP:
                    lead_y_change=-block_size
                    lead_x_change=0
                elif event.key==pygame.K_DOWN:
                    lead_y_change=block_size
                    lead_x_change=0
                elif event.key==pygame.K_q:
                    pygame.quit()
                    quit()

        if lead_x>=display_width or lead_x<0 or lead_y>=display_height or lead_y<0:
            pygame.quit()
            quit()

        lead_x+=lead_x_change
        lead_y+=lead_y_change

        gameDisplay.fill(pink)
        pygame.draw.rect(gameDisplay,black,[randAppleX,randAppleY,block_size,block_size])

        snakeHead=[]
        snakeHead.append(lead_x)
        snakeHead.append(lead_y)
        snakeList.append(snakeHead)

        if len(snakeList)>snakeLength:
            del snakeList[0]

        snake(block_size,snakeList)

        score(snakeLength-10)

        pygame.display.update()

        if lead_x==randAppleX and lead_y==randAppleY:
            pygame.mixer.music.load('the music's path')
            pygame.mixer.music.play(1)
            randAppleX=round(random.randrange(0,display_width-block_size)/10.0)*10.0
            randAppleY=round(random.randrange(0,display_height-block_size)/10.0)*10.0
            snakeLength+=1

        clock.tick(fps)

    pygame.quit()
    quit()

game_intro()
gameLoop()

1 Ответ

0 голосов
/ 06 июля 2018

Ваш вопрос кажется двояким.

Прежде всего, вы хотите иметь другой «уровень», который совершенно отличается от первого уровня, допустим, что ваш первый уровень - игра со змеями, которая у вас есть выше, но ваш второй уровень - игра в шахматы.

В этом случае отдельный игровой цикл был бы наиболее целесообразным. Это в основном уже то, что вы делаете с введением игры.

game_intro() # First show that intro
gameSnakeLoop() # Then play the first level.
gameChessLoop() # Then play chess.

Таким образом, вы практически пишете две игры и играете за другой. Теперь это может сработать, но у него есть ряд проблем, во-первых, все это должно быть заключено в одну основную функцию.

def main():
    """Run the game."""
    game_intro() # First show that intro
    gameSnakeLoop() # Then play the first level.
    gameChessLoop() # Then play chess.

if __name__ == '__main__':
    main()

Кроме того, вам нужно будет загрузить константы для этих двух этапов, что сделает это длиннее.

Однако , похоже, что вы в большей степени просите о способе появления врага в конечном итоге в игре. Это намного элегантнее. Вы должны создать класс или подобный ему объект, например EnemySnake(pygame.sprite.Sprite), а затем в какой-то определенной точке «уровня 2» создать вражескую змею. Класс был бы спрайтом, который содержит какое-то мышление о том, как двигаться, и затем взаимодействует с игровым циклом.

Если вы не знакомы со спрайтами и группами спрайтов в Pygame, я бы порекомендовал вам почитать здесь: https://www.pygame.org/docs/ref/sprite.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...