简体   繁体   中英

Pygame window closing immediately after opening up

import pygame
import time
import random

# pygame window initialisation
pygame.init()

# Declare the colors using their RBG colors
orangecolor = (253, 123, 7)
blackcolor = (0, 0, 0)
redcolor = (213, 50 , 80)
greencolor = (0, 255, 0)
bluecolor = (50, 153, 213)

# Display window's width and height
display_width = 1000
display_height = 1000
dis = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("Snake Game")
snake_block = 10
snake_list =[]

# Defines the snake's structure and position
def snake(snake_block,snake_list):
    for x in snake_list:
        pygame.draw.rect(dis,greencolor,[x[0], x[1],snake_block, snake_block])

def snakegame():

    game_over = False
    game_end = False
    #coordinates of the snake
    x1 = display_width / 2
    y1 = display_height / 2
    #when snake moves
    x1_change = 0
    y1_change = 0

    #defines the length of the snake
    snake_list = []
    Length_of_snake = 1

    #the coordinates of the food element
    foodx = round(random.roundrange(0, display_width - snake_block) / 10)* 10
    foody = round(random.roundrange(0, display_height - snake_block) / 10)* 10

    while not game_over:
        while game_end == True:
            score = Length_of_snake - 1
            score_font = pygame.font.SysFont("comicsansms", 35)
            value = core_fnt.render("Your score: " + str(score), True, greenclor)
            dis.blit(value, [display_width / 3, display_height / 5])
            pygame.display.update()
            for event in pygame.even.get():
                if event.type == pygame.quit:
                    game_over = True
                    game_end = False

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_left:
                x1_change = -snake_block
                y1_change = 0
            elif event.key == pygame.K_right:
                x1_change = snake_block
                y1_change = 0
            elif event.key == pygame.K_up:
                y1_change = -snake_block 
                x1_change = 0
            elif event.key == pygame.K_down:
                y1_change = snake_block
                x1_change = 0
        if x1 >= display_width or x1 < 0 or y1 >= display_height or y1 <0:
           game_end = True

        #updated coordinates with te changed positions
        x1 += x1_change
        y1 += y1_change
        dis.fill(blackcolor)
        pygame.draw.rect(dis,bluecolor[foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_list.append(snake_Head)
        #when length of the snake exceeds,delete_snakelist will end the game
        if len(snake_list) > Length_of_snake:
            del snake_list[0]

        # when snake hits itself
        for x in snake_list[:-1]:
            if x == snake_Head:
                game_end =True

            snake(snake_block, snake_list)
            pygame.display.update()

            # when the snake hits the food it's length increases by 1
            if x1 == foodx and y1 == foody:
                foodx = round(random.roundrange(0, display_width - snake_block) / 10)* 10
                foody = round(random.roundrange(0, display_height - snake_block) / 10)* 10
            Length_of_snake += 1

        pygame.quit()
        quit()

My pygame window closes immediately. Is there any solution to this problem? I use the community version of Visual Studio 2019. There is no error displayed in the terminal and I have also added loop as I saw in the past questions on stack overflow. I even retyped my code but the pygame window closes immediately.

The window is closing because you don't call any of your functions and the script end after you open the window. You need to call the function snakegame() .

It is a matter of Indentation . quit has to be invoked after the application loop rather than in the loop but you have to draw the snake and to update the display in the application loop.
Further more you missed to call snakegame() and I recommend to control the frames per second by pygame.time.Clock / tick() :

def snakegame():

    clock = pygame.time.Clock()
    while not game_over:
        clock.tick(20)
        # [...]

        snake(snake_block, snake_list)
        pygame.display.update()

    #<--| INDENTATION
    pygame.quit()
    quit()

snakegame()

The mehtod roundrange doesn't exist. The correct name is randrange :

foodx = round(random.randrange(0, display_width - snake_block) / 10)* 10
foody = round(random.randrange(0, display_height - snake_block) / 10)* 10

There is missing a , :

pygame.draw.rect(dis,bluecolor[foodx, foody, snake_block, snake_block])

pygame.draw.rect(dis, bluecolor, [foodx, foody, snake_block, snake_block])

Python is case sensitive. The names of the key constants are K_LEFT , K_RIGHT , K_UP and K_DOWN , rather than K_left , K_right , K_up and K_down .


Complete example:

import pygame
import time
import random

# pygame window initialisation
pygame.init()

#declare the colors using their RBG colors
orangecolor = (253, 123, 7)
blackcolor = (0, 0, 0)
redcolor = (213, 50 , 80)
greencolor = (0, 255, 0)
bluecolor = (50, 153, 213)

#Dislay window's width and height
display_width = 1000
display_height = 1000
dis = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("Snake Game")
snake_block = 10
snake_list =[]

#Defines the snake's structure and position
def snake(snake_block,snake_list):
    for x in snake_list:
        pygame.draw.rect(dis,greencolor,[x[0], x[1],snake_block, snake_block])

def snakegame():

    game_over = False
    game_end = False
    #coordinates of the snake
    x1 = display_width / 2
    y1 = display_height / 2
    #when snake moves
    x1_change = 0
    y1_change = 0

    #defines the length of the snake
    snake_list = []
    Length_of_snake = 1

    #the coordinates of the food element
    foodx = round(random.randrange(0, display_width - snake_block) / 10)* 10
    foody = round(random.randrange(0, display_height - snake_block) / 10)* 10

    clock = pygame.time.Clock()
    while not game_over:
        clock.tick(20)
        while game_end == True:
            score = Length_of_snake - 1
            score_font = pygame.font.SysFont("comicsansms", 35)
            value = score_font.render("Your score: " + str(score), True, greencolor)
            dis.blit(value, [display_width / 3, display_heght / 5])
            pygame.display.update()
            for event in pygame.even.get():
                if event.type == pygame.quit:
                    game_over = True
                    game_end = False

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x1_change = -snake_block
                y1_change = 0
            elif event.key == pygame.K_RIGHT:
                x1_change = snake_block
                y1_change = 0
            elif event.key == pygame.K_UP:
                y1_change = -snake_block 
                x1_change = 0
            elif event.key == pygame.K_DOWN:
                y1_change = snake_block
                x1_change = 0
        if x1 >= display_width or x1 < 0 or y1 >= display_height or y1 <0:
           game_end = True

        #updated coordinates with te changed positions
        x1 += x1_change
        y1 += y1_change
        dis.fill(blackcolor)
        pygame.draw.rect(dis,bluecolor, [foodx, foody, snake_block, snake_block])
        snake_Head = [x1, y1]
        snake_list.append(snake_Head)
        #when length of the snake exceeds,delete_snakelist will end the game
        if len(snake_list) > Length_of_snake:
            del snake_list[0]
        #when snake hits itself
        for x in snake_list[:-1]:
            if x == snake_Head:
                game_end =True
        #when the snake hits the food it's length increases by 1
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, display_width - snake_block) / 10)* 10
            foody = round(random.randrange(0, display_height - snake_block) / 10)* 10
            Length_of_snake += 1
        
        snake(snake_block, snake_list)
        pygame.display.update()

    pygame.quit()
    quit()

snakegame()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM