Usa Python para hacer una serpiente codiciosa

Hoy, compartiré un pequeño caso sobre la creación de juegos; un juego de serpiente se implementa en menos de 200 líneas de código. Como el primer artículo de la serie de juegos Python, echemos un vistazo al efecto del programa.

Snake_Dynamic

Para la parte de implementación específica del programa, consulte a continuación

Biblioteca de herramientas

Las bibliotecas de Python utilizadas en el programa son:

sys
pygame
time
collection
time
random

La biblioteca principal es pygame ;

Detalles de implementacion

La parte de implementación específica de Snake se divide aproximadamente en tres módulos para introducir: inicialización del juego, ejecución del juego (movimiento de la serpiente, comer comida), finalización del juego.

1. Inicialización del juego

Primero, se inicializa la necesidad de la serpiente del juego , los alimentos, los límites del juego, el atributo de color de cada elemento, la puntuación registrada, la velocidad de grabación y similares, se establece el tamaño de la ventana inicial (600,480), el ancho de la línea negra de la ventana del juego 1 Dividida en varios cuadrados pequeños (el tamaño de cada cuadrado pequeño es (20,20))

SCREEN_WIDTH = 600 # 屏幕长
SCREEN_HEIGHT = 480 #屏幕宽
SIZE = 20 # 小方格大小
LINE_WIDTH = 1 #网格线宽度;


#游戏区域的坐标范围
SCOPE_X  = (0,SCREEN_WIDTH//SIZE-1)
SCOPE_Y = (0,SCREEN_HEIGHT//SIZE-1)

#食物分值及颜色
FOOD_STYLE_LIST = [(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]


LIGHT = (100,100,100)
DARK = (200,200,200) #蛇的颜色
BLACK = (0,0,0) #网格线颜色,黑色
RED = (200,30,30) # 红色,GAME OVER 字体颜色
BGCOLOR = (40,40,60) #背景色

imagen-20210309011214691

El tamaño inicial de la serpiente ocupa 3 cuadrados pequeños consecutivos; la comida ocupa 1 cuadrado pequeño y la comida se coloca al azar en una determinada coordenada en la ventana al principio (por supuesto, el área del cuerpo de la serpiente debe excluirse)

# 初始化蛇
def init_snake():
    snake = deque()
    snake.append((2,SCOPE_Y[0]))
    snake.append((1,SCOPE_Y[0]))
    snake.append((0,SCOPE_Y[0]))

    return snake


# 创建食物
def create_food(snake):
    food_x = random.randint(SCOPE_X[0],SCOPE_X[1])
    food_y = random.randint(SCOPE_Y[0],SCOPE_Y[1])

    while (food_x,food_y) in snake:
        # 食物出现在蛇身上,重新生成
        food_x = random.randint(SCOPE_X[0],SCOPE_X[1])
        food_y = random.randint(SCOPE_Y[0],SCOPE_Y[1])

    return food_x,food_y

2. Puntuación del juego

Cuando comienza el juego, la dirección del movimiento de la ** serpiente ** debe establecerse como un parámetro inicial, que se almacena en forma de tupla bidimensional y se asigna a la variable p. Hay cuatro situaciones:

  • p = (1,0), a la derecha;
  • P = (0, -1), abajo;
  • p = (0,1), hacia arriba;
  • p = (-1,0), a la izquierda;

En respuesta a los eventos del teclado, cuando el usuario presiona las teclas arriba (w), abajo (s), izquierda (a) y derecha (d), el programa ejecutará la operación correspondiente.

        for event in pygame.event.get():#事件刷新
            if event.type == QUIT:
                sys.exit()#退出
            elif event.type == KEYDOWN:
                if event.key == K_RETURN:
                    if game_over:
                        start = True
                        game_over = False
                        b =True
                        snake = init_snake()
                        food = create_food(snake)
                        food_style = get_food_style()
                        pos = (1,0)#方向
                        score = 0
                        last_move_time = time.time()#上次移动时间

                elif event.key == K_SPACE:
                    if not game_over:
                        pause = not pause
                elif event.key in(K_w,K_UP):
                    #判断防止蛇向上移动时按了向下键,导致Game Over
                    if b and not pos[1]:
                        pos = (0,-1)
                        b = False
                elif event.key in (K_s,K_DOWN):
                    if b and not pos[1]:
                        pos =(0,1)
                        b = False
                elif event.key in (K_a,K_LEFT):
                    if b and not pos[0]:
                        pos = (-1,0)
                        b =False
                elif event.key in (K_d,K_RIGHT):
                    if b and not pos[0]:
                        pos =(1,0)
                        b = False

El cuerpo de la serpiente se mueve

La voluntad programa de serpiente ocupado todos los pequeños coordenadas de cuadrícula almacenados secuencialmente en una cola, moviendo una vez más fuera de la cola para completar la operación: la cola borrar un elemento, la cabeza de la columna para insertar unas nuevas coordenadas de cuadrícula, donde los contrabandistas;

if(SCOPE_X[0]<= next_s[0]<= SCOPE_X[1] and SCOPE_Y[0]<= next_s[1]<= SCOPE_Y[1] and next_s not in snake):
                            # 下个坐标在范围内
                            #依次进出元素
                            snake.appendleft(next_s)
                            snake.pop()

imagen-20210309011333183

Comer alimentos

Cada uno come una comida 蛇身多增加一个小方格区域,其队列插入一个新元素、长度加一,

 next_s = (snake[0][0] + pos[0],snake[0][1] +pos[1])#蛇移动
                    if next_s == food:#吃到了食物
                        snake.appendleft(next_s)#蛇变大
                        speed = orispeed - 0.03*(score//100) # 更新速度
                        food = create_food(snake)
                        food_style = get_food_style()

3. El juego ha terminado

Hay dos tipos de condiciones límite para la terminación del juego.

1. El área en movimiento excede el límite de la ventana;

imagen-20210309003704727

2. La cabeza de la serpiente golpea el cuerpo de la serpiente;

imagen-20210309003631731

El programa usa la variable booleana game_over para identificar si el juego terminó (Verdadero o Falso). El valor predeterminado es Falso antes de actualizar la página. Cuando el juego se ejecuta normalmente, los dos eventos anteriores se establecen en Verdadero. El juego se está ejecutando, de lo contrario, el juego termina.

        if game_over:#游戏结束
            if start:
                print_text(screen,font2,(SCREEN_WIDTH-fwidth)//2,(SCREEN_HEIGHT-fheight)//2,'GAME OVER',RED)

        pygame.display.update()#刷新页面

Con el fin de mejorar la experiencia de juego, el programa representa una puntuación por variable de puntuación, velocidad para expresar la velocidad de movimiento, puntuando 100 por cada velocidad de movimiento adicional actualizada cada Puntajemovimiento, con el paso del tiempo también aumentando la dificultad del juego.

 score += food_style[0]
 speed = orispeed - 0.03*(score//100) # 更新速度

resumen

La producción del Snake solo tiene algunas funciones básicas, todavía hay mucho margen de mejora, como que el módulo mezclador mediante Pygame agregue algunos efectos de sonido que se disparan en ciertos eventos del juego, agregando una página de inicio de inicialización del juego. , etc.; en general, este pequeño juego solo es apto para aprender y no para jugar. Si quieres jugar, se recomienda pasar a áreas de juego de alta gama como King Glory

Adquisición de código fuente

Para obtener todo el código fuente de este caso, siga la cuenta oficial : Xiao Zhang Python y la palabra clave de respuesta de back-end: 210309 ;

Supongo que te gusta

Origin blog.csdn.net/weixin_42512684/article/details/114650009
Recomendado
Clasificación