Utilisez pygame pour créer un jeu de serpent

Idée de base du développement

1.Faites une fenêtre, insérez de l'audio et des images
2. Dessinez des serpents et des fruits
3. Contrôle des boutons
4. Générez de la nourriture
5. Terminez le jugement

Montrer les résultats

Insérez la description de l'image ici

Étapes de mise en œuvre spécifiques

(Ce programme est écrit basé sur Python 3.9.1)

Créez des fenêtres, insérez de l'audio et des images

Tout d'abord, importez les modules requis.

import pygame
import sys
import random
from pygame.locals import *

Après cela, l'initialisation est effectuée et l'initialisation du mélangeur consiste à préparer l'ajout de la musique de fond.

#初始化
pygame.init()        #初始化pygame
pygame.mixer.init()  #初始化混音器

Ensuite, nous allons créer la fenêtre de jeu. Définissez d'abord la taille de la fenêtre dont vous avez besoin, puis donnez un titre à la fenêtre.

#制作窗口
playSurface = pygame.display.set_mode((800,800))  #定义窗口大小
pygame.display.set_caption("贪吃蛇")  #定义标题

À ce stade, une fenêtre est mise en place!
Insérez la description de l'image ici

Ensuite, nous ajouterons une musique de fond appropriée au jeu, où (-1) signifie laisser la musique de fond jouer en boucle.

#添加音乐
pygame.mixer.music.load("贪吃蛇背景音乐.mp3")
pygame.mixer.music.play(-1)

Définissez ensuite une fonction pour terminer le jeu pour ouvrir la voie à un jugement ultérieur des conditions de fin du jeu.

#结束游戏
def gameover():
    pygame.quit()   #退出pygame窗口
    sys.exit()      #退出程序

Enfin, définissons la couleur du serpent et de la nourriture

#颜色设置
snakeBody_color = pygame.Color(0,255,0) #绿色
food_color = pygame.Color(255,0,0) #红色

Ensuite, nous entrons dans la fonction principale

Dessiner un serpent et des fruits

Réglez d'abord la position initiale du fruit et la position initiale de la tête du serpent.Ce serpent a initialement plusieurs segments de corps. Nous définissons chaque segment du corps et du fruit du serpent comme un petit carré de 20 * 20 pixels.

def main():
 	#绘制蛇与果实
    snakePosition = [200,200]                       #蛇头位置
    snakeBodys = [[200,200],[180,200],[160,200]]    #蛇身位置
    foodPosition = [500,500]        #果实位置

Après cela, des variables telles que le nombre de fruits, la vitesse du serpent et la direction initiale sont définies. Dans le code ci-dessous, vous pouvez voir que foodTotal devient 0 après la consommation du fruit, ce qui est utilisé pour générer de nouveaux fruits. Le foodNumber est utilisé pour contrôler la vitesse du serpent plus tard. Chaque fois qu'une certaine quantité de fruits est consommée, le serpent augmente sa vitesse et la valeur de foodNumber revient à 1.

	time_clock = pygame.time.Clock() #定义一个变量来控制速度
	foodTotal = 1                   #果实数量
	foodNumber = 1                  #用于增加速度的变量
    direction = 'right'             #初始方向向右
    changeDirection = direction     #定义一个改变方向的变量,按键

    speed = 4  #定义初始速度

Écrivons une boucle infinie Sauf pour déclencher passivement la condition de mort ou fermer activement la fenêtre de jeu, le programme fonctionnera toujours dans la boucle.

Contrôle des boutons

Dans la boucle, deux événements doivent être acquis en premier, l'un consiste à quitter activement l'événement. Lorsque le programme est en cours d'exécution, cliquez sur la croix dans le coin supérieur droit, il sautera hors de la boucle pour terminer le jeu. S'il n'y a pas d'événement de sortie, tout le monde trouvera qu'il est impossible de sortir activement.

	while True:
        for event in pygame.event.get():   #从队列中获取事件

            #退出事件
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

Le deuxième événement est un événement de pression de touche, qui est utilisé pour contrôler la direction du mouvement du serpent. Appuyez sur les touches haut, bas, gauche et droite ou sur la touche WSAD pour réaliser le virage du serpent. Appuyez sur la touche esc pour quitter le programme.

            #按键事件
            elif event.type == KEYDOWN:
                if event.key == K_RIGHT or event.key == K_d:
                    changeDirection = 'right'

                if event.key == K_LEFT or event.key == K_a:
                    changeDirection = 'left'
                    
                if event.key == K_UP or event.key == K_w:
                    changeDirection = 'up'
                    
                if event.key == K_DOWN or event.key == K_s:
                    changeDirection = 'down'

                if event.key == K_ESCAPE:
                    pygame.event.post(pygame.event.Event(QUIT))

Mais nous devons faire attention que dans le jeu du serpent, vous ne pouvez pas faire un virage à 180 degrés. Si vous voulez vous déplacer dans la direction opposée, vous devez appuyer deux fois sur la même touche de direction opposée.

        #防止蛇反方向移动
        if changeDirection == 'right' and not direction == 'left':
            direction = changeDirection
            
        if changeDirection == 'left' and not direction == 'right':
            direction = changeDirection
            
        if changeDirection == 'up' and not direction == 'down':
            direction = changeDirection
            
        if changeDirection == 'down' and not direction == 'up':
            direction = changeDirection

Après avoir appuyé sur les touches fléchées, il est naturel d'ajuster la direction de déplacement de la tête de serpent en fonction de la direction correspondante.

        #根据方向移动蛇头
        if direction == 'right':
            snakePosition[0] += 20
            
        if direction == 'left':
            snakePosition[0] -= 20
            
        if direction == 'up':
            snakePosition[1] -= 20
            
        if direction == 'down':
            snakePosition[1] += 20

Générer de la nourriture

Ensuite, nous réglons d'abord le corps du serpent pour qu'il augmente d'un pour chaque carré qu'il marche, et pour qu'il diminue de un s'il ne mange pas de nourriture.

        snakeBodys.insert(0, list(snakePosition))  #增加蛇的长度
        
        #判断是否吃到食物
        if snakePosition[0] == foodPosition[0] and snakePosition[1] == foodPosition[1]:
            foodTotal = 0
        else:
            snakeBodys.pop()  #每次将最后一个单位的蛇身去除列表

Lorsque la nourriture est consommée, la nouvelle nourriture est régénérée, mais en même temps, un code doit être écrit pour empêcher la nourriture d'être générée sur le serpent. Ici, le hasard est appelé pour réaliser la génération aléatoire de nourriture.

        #重新生成食物
        if foodTotal == 0:
            x = random.randrange(1,40)
            y = random.randrange(1,40)
            foodPosition = [int(x*20), int(y*20)]
            foodTotal = 1
            foodNumber += 1    
            
        #防止食物生成在蛇身上
        for body in snakeBodys[1:]:
            if foodPosition[0] == body[0] and foodPosition[1] == body[1]:
                foodTotal = 0
                foodNumber -=1

Réglage de la mort

Il existe deux méthodes de mort passive pour les serpents. L'un est que la tête du serpent touche le bord de la fenêtre, et l'autre est que la tête du serpent touche le corps du serpent. Ici, nous utilisons la fonction de fin de jeu définie au début.

        #超出边框结束游戏
        if snakePosition[0] > 800 or snakePosition[0] < 0:
            gameover()
            
        elif snakePosition[1] > 800 or snakePosition[1] < 0:
            gameover()
            
        #碰到身体结束游戏
        for body in snakeBodys[1:]:
            if snakePosition[0] == body[0] and snakePosition[1] == body[1]:
                gameover()

Ce qui précède est la partie principale, les autres réglages doivent être complétés dans la boucle while ci-dessous.

autres réglages

Tout d'abord, remplissez une belle image d'arrière-plan pour la fenêtre d'ensemble. Certaines personnes peuvent se demander pourquoi je n'ai pas renseigné l'arrière-plan lors de la configuration de la fenêtre.En fait, Aqi l'a fait au début, mais il y avait un bogue. Étant donné que l'arrière-plan n'est pas constamment actualisé dans la boucle while, la queue s'allonge indéfiniment lorsque le serpent se déplace, ce qui est très effrayant. Nous définissons donc l'arrière-plan ici et dessinons le serpent et le fruit.

        #绘制游戏背景
        background = pygame.image.load("河海大学校标.jpg")
        playSurface.blit(background,(0,0))
        pygame.display.update()

        #画出蛇与果实
        for position in snakeBodys:
            pygame.draw.rect(playSurface,snakeBody_color, Rect(position[0], position[1], 20, 20))
            pygame.draw.rect(playSurface, food_color, Rect(foodPosition[0], foodPosition[1], 20, 20))
            
            pygame.display.flip()  #更新显示到屏幕表面

Voici le réglage de la vitesse: chaque fois que le serpent mange 4 fruits, la vitesse est de +1 et la vitesse initiale a été réglée sur 4 auparavant.

        #设置递增速度
        if foodNumber % 5 ==0:
            speed += 1
            foodNumber = 1
            
        # 控制游戏速度
        time_clock.tick(speed)

Enfin, nous définissons une autre fonction d'entrée, et l'ensemble du programme est maintenant terminé.

#入口函数
if __name__ == "__main__":
    main()

Code général

import pygame
import sys
import random
from pygame.locals import *

#初始化
pygame.init()        #初始化pygame
pygame.mixer.init()  #初始化混音器

#制作窗口
playSurface = pygame.display.set_mode((800,800))  #定义窗口大小
pygame.display.set_caption("贪吃蛇")  #定义标题

#添加音乐
pygame.mixer.music.load("贪吃蛇背景音乐.mp3")
pygame.mixer.music.play(-1)

    
#结束游戏
def gameover():
    pygame.quit()   #退出pygame窗口
    sys.exit()      #退出程序
    

#颜色设置
snakeBody_color = pygame.Color(0,255,0) #绿色
food_color = pygame.Color(255,0,0) #红色


def main():

    time_clock = pygame.time.Clock() #定义一个变量来控制速度
    
    #绘制蛇与果实
    snakePosition = [200,200]                       #蛇头位置
    snakeBodys = [[200,200],[180,200],[160,200]]    #蛇身位置
    foodPosition = [500,500]        #果实位置
    foodTotal = 1                   #果实数量
    foodNumber = 1                  #用于增加速度的变量
    direction = 'right'             #初始方向向右
    changeDirection = direction     #定义一个改变方向的变量,按键

    speed = 4  #定义初始速度

    while True:
        for event in pygame.event.get():   #从队列中获取事件

            #退出事件
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            #按键事件
            elif event.type == KEYDOWN:
                if event.key == K_RIGHT or event.key == K_d:
                    changeDirection = 'right'

                if event.key == K_LEFT or event.key == K_a:
                    changeDirection = 'left'
                    
                if event.key == K_UP or event.key == K_w:
                    changeDirection = 'up'
                    
                if event.key == K_DOWN or event.key == K_s:
                    changeDirection = 'down'

                if event.key == K_ESCAPE:
                    pygame.event.post(pygame.event.Event(QUIT))

        #防止蛇反方向移动
        if changeDirection == 'right' and not direction == 'left':
            direction = changeDirection
            
        if changeDirection == 'left' and not direction == 'right':
            direction = changeDirection
            
        if changeDirection == 'up' and not direction == 'down':
            direction = changeDirection
            
        if changeDirection == 'down' and not direction == 'up':
            direction = changeDirection

        #根据方向移动蛇头
        if direction == 'right':
            snakePosition[0] += 20
            
        if direction == 'left':
            snakePosition[0] -= 20
            
        if direction == 'up':
            snakePosition[1] -= 20
            
        if direction == 'down':
            snakePosition[1] += 20

        snakeBodys.insert(0, list(snakePosition))  #增加蛇的长度
        
        #判断是否吃到食物
        if snakePosition[0] == foodPosition[0] and snakePosition[1] == foodPosition[1]:
            foodTotal = 0
        else:
            snakeBodys.pop()  #每次将最后一个单位的蛇身去除列表

        #重新生成食物
        if foodTotal == 0:
            x = random.randrange(1,40)
            y = random.randrange(1,40)
            foodPosition = [int(x*20), int(y*20)]
            foodTotal = 1
            foodNumber += 1    
            
        #防止食物生成在蛇身上
        for body in snakeBodys[1:]:
            if foodPosition[0] == body[0] and foodPosition[1] == body[1]:
                foodTotal = 0
                foodNumber -=1

        #设置递增速度
        if foodNumber % 5 ==0:
            speed += 1
            foodNumber = 1
            
        #绘制游戏背景
        background = pygame.image.load("河海大学校标.jpg")
        playSurface.blit(background,(0,0))
        pygame.display.update()

        #画出蛇与果实
        for position in snakeBodys:
            pygame.draw.rect(playSurface,snakeBody_color, Rect(position[0], position[1], 20, 20))
            pygame.draw.rect(playSurface, food_color, Rect(foodPosition[0], foodPosition[1], 20, 20))

        pygame.display.flip()  #更新显示到屏幕表面

        #超出边框结束游戏
        if snakePosition[0] > 800 or snakePosition[0] < 0:
            gameover()
            
        elif snakePosition[1] > 800 or snakePosition[1] < 0:
            gameover()
            
        #碰到身体结束游戏
        for body in snakeBodys[1:]:
            if snakePosition[0] == body[0] and snakePosition[1] == body[1]:
                gameover()

        # 控制游戏速度
        time_clock.tick(speed)

        
#入口函数
if __name__ == "__main__":
    main()

Il convient de noter que la musique de fond et les images de fond sélectionnées par les amis doivent être placées dans le même dossier que ce programme, et ce dossier doit être placé sur le lecteur c! Il n'est donc pas nécessaire de trouver le chemin pour appeler l'image ou l'audio.

Mes amis préférés, n'oubliez pas de soutenir Aqi!

Je suppose que tu aimes

Origine blog.csdn.net/qq_54831779/article/details/114943623
conseillé
Classement