Usa pygame para hacer un juego de serpientes

Idea básica de desarrollo

1. Hacer una ventana, insertar audio e imágenes
2. Dibujar serpientes y frutas
3. Botón de control
4. Generar comida
5. Finalizar juicio

Mostrar resultados

Inserte la descripción de la imagen aquí

Pasos de implementación específicos

(Este programa está escrito en base a Python 3.9.1)

Crea ventanas, inserta audio e imágenes

Primero, importe los módulos necesarios.

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

Después de eso, se lleva a cabo la inicialización y la inicialización del mezclador se prepara para agregar música de fondo.

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

A continuación haremos la ventana del juego. Primero defina el tamaño de la ventana que necesita y luego asigne un título a la ventana.

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

En este punto, se configura una ventana.
Inserte la descripción de la imagen aquí

Luego agregaremos la música de fondo adecuada al juego, donde (-1) significa dejar que la música de fondo se reproduzca en un bucle.

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

Luego, defina una función para finalizar el juego y allanar el camino para juzgar más tarde las condiciones finales del juego.

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

Finalmente, establezcamos el color de la serpiente y la comida.

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

A continuación ingresamos a la función principal

Dibujar serpiente y fruta

Primero establezca la posición inicial de la fruta y la posición inicial de la cabeza de la serpiente, que inicialmente tiene varios segmentos de cuerpo. Configuramos cada segmento del cuerpo y la fruta de la serpiente como un pequeño cuadrado de 20 * 20 píxeles.

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

Después de eso, se establecen variables como el número de frutos, la velocidad de la serpiente y la dirección inicial. En el código subyacente, puede ver que foodTotal se convierte en 0 después de comer la fruta, que se utiliza para generar fruta nueva. El foodNumber se usa para controlar la velocidad de la serpiente más tarde.Cada vez que se come una cierta cantidad de fruta, la serpiente aumenta su velocidad y el valor de foodNumber vuelve a 1.

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

    speed = 4  #定义初始速度

Escribamos un bucle infinito, excepto para activar pasivamente la condición de muerte o cerrar activamente la ventana del juego, el programa siempre se ejecutará en el bucle.

Control de botones

En el bucle, primero se deben adquirir dos eventos, uno es salir activamente del evento. Cuando el programa se esté ejecutando, haga clic en la cruz en la esquina superior derecha, saltará del bucle para finalizar el juego. Si no hay un evento de salida, todos encontrarán que es imposible salir activamente.

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

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

El segundo evento es un evento de pulsación de tecla, que se utiliza para controlar la dirección del movimiento de la serpiente. Presione las teclas arriba, abajo, izquierda y derecha o la tecla WSAD para darse cuenta de que la serpiente está girando. Presione la tecla esc para salir del programa.

            #按键事件
            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))

Pero debemos prestar atención a que en el juego de la serpiente no se puede hacer un giro de 180 grados, si se quiere mover en la dirección opuesta, se debe presionar la misma tecla de dirección opuesta dos veces.

        #防止蛇反方向移动
        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

Después de presionar las teclas de flecha, es natural ajustar la dirección de movimiento de la cabeza de la serpiente de acuerdo con la dirección correspondiente.

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

Generar comida

A continuación, primero configuramos el cuerpo de la serpiente para que aumente en uno por cada cuadrado que camina, y para que disminuya en uno si no come.

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

Cuando se come la comida, se regenera comida nueva, pero al mismo tiempo, se debe escribir un código para evitar que la comida se genere en la serpiente. Aquí, se llama al azar para realizar la generación aleatoria de alimentos.

        #重新生成食物
        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

Escenario de muerte

Hay dos métodos de muerte pasiva para serpientes. Una es que la cabeza de la serpiente toca el borde de la ventana y la otra es que la cabeza de la serpiente toca el cuerpo de la serpiente. Aquí usamos la función de finalización del juego definida al principio.

        #超出边框结束游戏
        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()

Lo anterior es la parte principal, las otras configuraciones deben completarse en el ciclo while de abajo.

otros ajustes

Primero, complete una bonita imagen de fondo para la ventana configurada. Algunas personas pueden preguntarse por qué no completé el fondo al configurar la ventana. De hecho, Aqi hizo eso al principio, pero hubo un error. Dado que el fondo no se actualiza constantemente en el bucle while, la cola se alargará indefinidamente cuando la serpiente se mueva, lo que da mucho miedo. Así que colocamos el fondo aquí y dibujamos la serpiente y la fruta.

        #绘制游戏背景
        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()  #更新显示到屏幕表面

La siguiente es la configuración de velocidad: cada vez que la serpiente come 4 frutas, la velocidad es +1, y la velocidad inicial se ha establecido en 4 antes.

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

Finalmente, configuramos otra función de entrada, y todo el programa ahora está completo.

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

Código general

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

Cabe señalar que la música de fondo y las imágenes de fondo seleccionadas por los amigos deben colocarse en la misma carpeta que este programa, ¡y esta carpeta debe colocarse en la unidad c! Por lo tanto, no es necesario encontrar la ruta para llamar a la imagen o al audio.

Mis amigos favoritos, ¡recuerden apoyar a Aqi!

Supongo que te gusta

Origin blog.csdn.net/qq_54831779/article/details/114943623
Recomendado
Clasificación