¿Es difícil hacer juegos en Python? Veamos qué tan interesante lo hago~

Desde que se publicó el código de confesión, muchos estudiantes me han preguntado si hay otros minijuegos además de este tipo de confesión y cómo se hace el juego. ¿Es difícil? Usaré dos artículos para presentar, si usa Python para hacer juegos.

Conejo y riego

tetris

gobang casual

caminar por el laberinto


Sokoban 

 

Xiao Xiaole

Hay tantos minijuegos jugando sin parar ↓

 

 
 Se pueden discutir más minijuegos en el área de comentarios. Si desea apoyar, siga + mensaje privado "Mini Juegos" para obtener el código fuente. ! Haga clic para conocer
el código fuente del mini juego https://docs.qq.com/doc/DU2t4VW1aQU9DcGdZ
icono-predeterminado.png?t=M666

Hacer juegos con PyGame es muy simple. Nuestro primer artículo de hoy te permitirá implementar un cerdo que se puede mover en el mapa.

marco básico


En primer lugar, no importa qué juego estés haciendo, no te preocupes por 3721, primero copia y pega el siguiente código en tu editor. Todos los juegos requieren estas líneas de código:

importar pygame


def main():
    pygame.init()
    pygame.display.set_caption('Código desconocido: un juego creado por Qingnan') # Título del juego
    ganado = pygame.display.set_mode((800, 600)) # Tamaño de la ventana, ancho 800 High 600
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # Haga clic en la x en la esquina superior izquierda o superior derecha para cerrar la ventana, detener la
                ejecución del programa = Falso


El efecto de operación de main()
se muestra en la siguiente figura:

Cargando el material
Ahora, busquemos dos imágenes al azar, una para el fondo y otra para el protagonista. No te preocupes demasiado por el tamaño, está casi bien, porque podemos ajustarlo dinámicamente con código. Las siguientes dos imágenes son los materiales que encontré casualmente. Preste atención al lugar encerrado por el marco rojo en la imagen, que es del tamaño de estas dos imágenes.

 

 

Usamos el siguiente código para cargar la imagen:

img_surf = pygame.image.load('dirección de imagen').convert_alpha()
donde .convert_alpha() es para retener el fondo transparente de la imagen png. Si la imagen que cargó no es una imagen png, puede cambiar convert_alpha() a convert().

Si desea modificar el tamaño de la imagen, utilice el siguiente código:

img_surf = pygame.transform.scale(img_surf, (ancho, alto))
Para mostrar la imagen en la ventana, use las siguientes dos líneas de código:

win.blit(objeto material, (la abscisa de la esquina superior izquierda del material, la ordenada de la esquina superior izquierda del material) ) El código completo de
pygame.display.flip() es el siguiente:

importar pygame


def main():
    pygame.init()
    pygame.display.set_caption('Código desconocido: un juego creado por Qingnan') # Título del juego
    ganado = pygame.display.set_mode((800, 600)) # Tamaño de la ventana
    bg_small = pygame .image.load('bg.png').convert_alpha()
    bg_big = pygame.transform.scale(bg_small, (800, 600))
    pig = pygame.image.load('pig_in_car.png').convert_alpha()
    en ejecución = Verdadero
    mientras se ejecuta:
        para evento en pygame.event.get():
            if event.type == pygame.QUIT: # Haga clic en la x en la esquina superior izquierda o superior derecha para cerrar la ventana, detenga la
                ejecución del programa = Falso

        win.blit(bg_big, (0, 0)) # La imagen de fondo se carga primero y las coordenadas son (izquierda, arriba)
        win.blit(pig, (200, 300))
        pygame.display.flip()


El efecto de operación de main()
se muestra en la siguiente figura:

Cabe señalar que tanto win.blit como pygame.display.flip() se colocan dentro del ciclo while. donde el primer parámetro de win.blit es el objeto material que acabamos de cargar. El segundo parámetro es una tupla, que marca las coordenadas de la esquina superior izquierda de la imagen en el lienzo. La esquina superior izquierda de todo el lienzo corresponde a las coordenadas (0, 0). Dado que el tamaño de la imagen de fondo también es (800, 600), la esquina superior izquierda de la imagen de fondo se coloca en (0, 0), que puede cubrir todo el lienzo.

¿Dónde puedo encontrar materiales?
Lo que estamos haciendo es un juego estilo píxel, puedes encontrar materiales en itch.io:

 

Este sitio mejora mucho el material del juego, y la mayor parte del material es gratuito para uso personal no comercial. Después de encontrar el material que te gusta, puedes descargarlo directamente y ni siquiera necesitas iniciar sesión durante todo el proceso (más conciencia que los sitios web nacionales de material basura).

¿Por qué mi material se ve así?
Después de descargar el material, puede encontrar algo muy extraño, ¿cómo es que todos los materiales están dibujados en una sola imagen?

 

 

De hecho, esta es la práctica de la industria. La persona que hace el material acomodará cada tipo de material en una imagen. Cuando quiera usarlo, debe cortarlo usted mismo. Por ejemplo, todas las plantas en un mapa, todas las estatuas en un mapa y texturas de base en un mapa.

La imagen de fondo que usamos para la demostración anterior parece una imagen verde a primera vista, pero en realidad contiene varios elementos básicos. Tenga en cuenta la parte que enmarqué en rojo:

 

En el juego oficial, tenemos que sacar todos los elementos básicos y volver a armarlos. Al reorganizar, algunos elementos deben copiarse y reutilizarse, y algunos elementos deben rotarse y escalarse. Finalmente combinado en el siguiente mapa que se ve bien:

 

En términos generales, el tamaño del material de estilo de píxel es principalmente 16x16, 32x32, 64x64, 128x128. Los autores del material normalmente proporcionan instrucciones de recorte. Si no se proporciona, también puede mirarlo a simple vista y adivinar.

Por ejemplo, quiero recortar la diosa enmarcada en rojo del material de la estatua:

 

Entonces, puedo escribir código como este:

img_surf = pygame.image.load('Statue material.png').convert_alpha()
diosa= img_surf.subsurface(( la abscisa de la esquina superior izquierda de la diosa, la ordenada de la esquina superior izquierda de la diosa, el ancho de la diosa, el ancho de la diosa Alto))
efecto de operación se muestra en la siguiente figura:

 

Algunos estudiantes pueden preguntar: ¿Por qué las coordenadas de la diosa son así? Solo puedo decir que esta coordenada es la que he probado muchas veces y probé.

Uso de sprites para administrar objetos
Además de la imagen de fondo, cada elemento que agregamos es un objeto, como el cerdo y la diosa de arriba. En principio, el código anterior es suficiente para que el juego sea hermoso. Si desea agregar algo, simplemente siga cargando el material de la imagen y colóquelo en el lugar correcto.

Pero podemos usar métodos de diseño orientados a objetos para hacer que el código sea más fácil de mantener y más simple. En PyGame, hay una clase llamada Sprite.Podemos implementar una clase para cada objeto, heredar Sprite y luego establecer el material del objeto en la propiedad .surf y la posición del objeto en la propiedad .rect. Por ejemplo, el código anterior, vamos a modificarlo:

importar pygame


class Bg(pygame.sprite.Sprite):
    def __init__(self):
        super(Bg, self).__init__()
        bg_small = pygame.image.load('bg.png').convert_alpha()
        grass_land = bg_small.subsurface( (0, 0, 128, 128))
        self.surf = pygame.transform.scale(grass_land, (800, 600))
        self.rect = self.surf.get_rect(left=0, top=0) # 左上角定位


class Pig(pygame.sprite.Sprite):
    def __init__(self):
        super(Pig, self).__init__()
        self.surf = pygame.image.load('pig_in_car.png').convert_alpha()
        self.rect = self.surf.get_rect(center=(400, 300)) # 中心定位


class Goddess(pygame.sprite.Sprite):
    def __init__(self):
        super(Goddess, self).__init__()
        building = pygame.image.load('building.png').convert_alpha()
        self.surf = building. subsurface(((7 * 64 - 10, 0, 50, 100)))
        self.rect = self.surf.get_rect(center=(500, 430)) # poner el centro de la diosa en el lienzo (500, 430 ) Ubicación


def main():
    pygame.init()
    pygame.display.set_caption('Código desconocido: un juego creado por Qingnan') #
    Ganar título del juego = pygame.display.set_mode((800, 600)) # Tamaño de la ventana

    bg = Bg()
    diosa = Diosa()
    cerdo = Cerdo()
    all_sprites = [bg, diosa, cerdo] # Preste atención al orden de adición, la capa del objeto añadido más tarde está por encima de la capa del objeto añadido primero

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # Haga clic en la x en la esquina superior izquierda o superior derecha para cerrar la ventana, detener la
                ejecución del programa = False

        para sprite en all_sprites:
            win.blit(sprite.surf, sprite.rect)
        pygame.display.flip()


if __name__ == '__main__': El efecto de
    main()
se muestra en la siguiente figura:

 

Tenga en cuenta all_sprites = [bg, diosa, cerdo] en el código, aquí estoy usando una lista. Posteriormente habrá una estructura de datos más avanzada SpriteGroup para almacenarlos. Usar una lista es suficiente hoy.

El objeto material .get_rect() devolverá un objeto de posicionamiento de coordenadas, que tiene múltiples propiedades, como .left, .top, .center, .width, .height. En el caso de que no haya parámetros, el predeterminado .left=0, .top=0, PyGame calculará automáticamente .width, .height y .center de acuerdo con el tamaño de este objeto. Podemos configurarlo activamente en forma de parámetros entrantes. Cuando configura la esquina superior izquierda, puede calcular automáticamente las coordenadas del punto central; cuando pasa las coordenadas del centro, puede calcular automáticamente las coordenadas de la esquina superior izquierda.

En teoría, dentro de cada clase, el objeto material puede tener cualquier nombre, no necesariamente .surf. El objeto de posicionamiento de coordenadas no tiene que usar .rect, siempre que le corresponda en win.blit. Pero si usa .surf y .rect juntos, obtendrá muchos beneficios. En este punto hablaremos del lugar donde choca el objeto. Así que te sugiero que uses ambos nombres.

Deja que el cerdo se mueva
Ya que es un juego, debes presionar el teclado para hacer que el protagonista se mueva. De lo contrario, ¿cuál es la diferencia con una pintura? Todos presten atención al ciclo while running en la función main() Si agrega una línea de código al ciclo: print(111), encontrará que cuando ejecute el juego, 111 se imprimirá continuamente.

En esencia, PyGame dibuja imágenes continuamente a través de win.blit. Dado que este ciclo while se ejecuta muchas veces por segundo, si cada vez que se ejecuta, dejamos que el segundo parámetro de win.blit, es decir, las coordenadas del objeto material tengan diferencias sutiles. , entonces para el ojo humano, el objeto material se está moviendo.

Nuestro objetivo es mantener presionadas las teclas de flecha arriba, abajo, izquierda y derecha en el teclado, y el lechón se mueve en 4 direcciones diferentes. En PyGame, obtenga la tecla que el teclado mantiene presionada y use el siguiente código para lograrlo:

keys = pygame.key.get_pressed()
Devuelve un objeto que parece una lista (pero no una lista). Cuando queremos juzgar si se presiona una tecla, solo necesitamos juzgar si las teclas [lo que quiere juzgar clave ], si devuelve True, significa que se mantuvo presionado. Basándonos en este principio, escribamos dos piezas de código. Primero modifique la clase Pig y agregue un método .update:

class Pig(pygame.sprite.Sprite):
    def __init__(self):
        super(Pig, self).__init__()
        self.surf = pygame.image.load('pig_in_car.png').convert_alpha()
        self.rect = self.surf.get_rect(center=(400, 300)) # 中心定位

    def update(self, keys):
        if keys[pygame.K_LEFT]:
            self.rect.move_ip((-5, 0)) # abscisa a la izquierda
        elif keys[pygame.K_RIGHT]:
            self.rect.move_ip((5 , 0)) # abscisa a la derecha
        teclas elif[pygame.K_UP]:
            self.rect.move_ip((0, -5)) # ordenada hacia arriba
        teclas elif[pygame.K_DOWN]:
            self.rect.move_ip((0 , 5)) # ordenada hacia abajo

        # Evita que el cerdo se salga de la pantalla
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > 800:
            self.rect.right = 800
        if self.rect.top < 0:
            self .rect.top = 0
        si self.rect.bottom > 600:
            self.rect.bottom = 600 El
método .update recibe claves de parámetro, que es el objeto similar a una lista devuelto por la clave. Luego determine qué tecla de dirección se presionó. En función de la tecla que se pulse, el objeto de posicionamiento de coordenadas .rect modifica el valor de la dirección correspondiente. rect.move_ip La ip aquí es la abreviatura de inplace, que es para modificar la propiedad .rect en sí. Su argumento es una tupla correspondiente a la abscisa y ordenada. Si las coordenadas horizontal y vertical son menores a 0, significa a la izquierda o hacia arriba, y si es mayor a 0, significa a la derecha o hacia abajo.

La función main() original solo necesita agregar dos líneas de código antes de win.blit:

keys = pygame.key.get_pressed()
pig.update(keys) El
código completo es el siguiente:

importar pygame


class Bg(pygame.sprite.Sprite):
    def __init__(self):
        super(Bg, self).__init__()
        bg_small = pygame.image.load('bg.png').convert_alpha()
        grass_land = bg_small.subsurface( (0, 0, 128, 128))
        self.surf = pygame.transform.scale(grass_land, (800, 600))
        self.rect = self.surf.get_rect(left=0, top=0) # 左上角定位


class Pig(pygame.sprite.Sprite):
    def __init__(self):
        super(Pig, self).__init__()
        self.surf = pygame.image.load('pig_in_car.png').convert_alpha()
        self.rect = self.surf.get_rect(center=(400, 300)) # 中心定位

    def actualizar(self, keys):
        if keys[pygame.K_LEFT]:
            self.rect.move_ip((-5, 0))
        elif keys[pygame.K_RIGHT]:
            self.rect.move_ip((5, 0))
        elif teclas[pygame.K_UP]:
            self.rect.move_ip((0, -5))
        elif teclas[pygame.K_DOWN]:
            self.rect.move_ip((0, 5))

        # Evita que el cerdo se salga de la pantalla
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > 800:
            self.rect.right = 800
        if self.rect.top < 0:
            self .rect.top = 0
        si self.rect.bottom > 600:
            self.rect.bottom = 600


class Goddess(pygame.sprite.Sprite):
    def __init__(self):
        super(Goddess, self).__init__()
        building = pygame.image.load('building.png').convert_alpha()
        self.surf = building. subsurface(((7 * 64 - 10, 0, 50, 100)))
        self.rect = self.surf.get_rect(center=(500, 430)) # poner el centro de la diosa en el lienzo (500, 430 ) Ubicación


def main():
    pygame.init()
    pygame.display.set_caption('Código desconocido: un juego creado por Qingnan') #
    Ganar título del juego = pygame.display.set_mode((800, 600)) # Tamaño de la ventana

    bg = Bg()
    diosa = Diosa()
    cerdo = Cerdo()
    all_sprites = [bg, diosa, cerdo] # Preste atención al orden de adición, la capa del objeto añadido más tarde está por encima de la capa del objeto añadido primero

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # Haga clic en la x en la esquina superior izquierda o superior derecha para cerrar la ventana, detener la
                ejecución del programa = False

        teclas = pygame.key.get_pressed()
        pig.update(keys)
        para sprite en all_sprites:
            win.blit(sprite.surf, sprite.rect)
        pygame.display.flip()


if __name__ == '__main__': El efecto de la operación final de
    main()
se muestra en el siguiente video:

PyGame es realmente muy simple de hacer juegos, siempre y cuando puedas cargar los materiales, puedes hacer un juego que todavía se puede ver. Hoy aprendimos cómo agregar material y cómo capturar eventos de teclado.

Supongo que te gusta

Origin blog.csdn.net/m0_59485658/article/details/125722497
Recomendado
Clasificación