2 votes

L'apparition de plusieurs ennemis pygame

J'ai une tâche où je dois faire apparaître 3 ennemis à des positions aléatoires, mais je n'arrive à faire apparaître qu'un seul ennemi, quelqu'un peut-il m'aider ?

import pygame
import random

# Initialize the pygame modules to get everything started.
pygame.init()

# The screen that will be created needs a width and a height.
screen_width = 1300
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))

# This creates the player and gives it the image found in this folder.
player = pygame.image.load("player.jpg")

# Creating multiple enemies
enemy = []
enemy_height = []
enemy_width = []
enemyXPosition = []
enemyYPosition = []
num_enemies = 3

for i in range(num_enemies):
    enemy.append().image.load("monster.jpg")
    enemyheight = enemy.get_height()
    enemywidth = enemy.get_width()
    enemyXPosition = random.randint(1100, screen_width)
    enemyYPosition = random.randint(0, screen_height - enemyheight)

# Get the width and height of the images in order to do boundary detection (i.e. make sure the image stays within screen boundaries or know when the image is off the screen).
image_height = player.get_height()
image_width = player.get_width()

print("This is the height of the player image: " + str(image_height))
print("This is the width of the player image: " + str(image_width))

# Store the positions of the player as variables.
playerXPosition = 100
playerYPosition = 50

# Creating conditions for game to run
keyUp = False
keyDown = False
keyLeft = False
keyRight = False

# The game loop for running game till told to stop and drawing player and enemy
while 1:

    screen.fill(0)
    screen.blit(player, (playerXPosition, playerYPosition))
    screen.blit(enemies[i], (enemiesXPosition[i], enemiesYPosition[i]))

    pygame.display.flip()

    # This loops through events in the game.
    for event in pygame.event.get():

        # This event checks if the user quits the program, then if so it exits the program.
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)

        # Event for Key presses
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_UP:
                keyUp = True
            if event.key == pygame.K_DOWN:
                keyDown = True
            if event.key == pygame.K_LEFT:
                keyLeft = True
            if event.key == pygame.K_RIGHT:
                keyRight = True

        # Event to check if key is released
        if event.type == pygame.KEYUP:

            if event.key == pygame.K_UP:
                keyUp = False
            if event.key == pygame.K_DOWN:
                keyDown = False
            if event.key == pygame.K_LEFT:
                keyLeft = False
            if event.key == pygame.K_RIGHT:
                keyRight = False

    # Checks which keys are pressed and moves player accordingly
    if keyUp == True:
        if playerYPosition > 0:
            playerYPosition -= 1

    if keyDown == True:
        if playerYPosition < screen_height - image_height:
            playerYPosition += 1

    if keyLeft == True:
        if playerXPosition > 0:
            playerXPosition -= 1

    if keyRight == True:
        if playerXPosition < screen_width - image_width:
            playerXPosition += 1

    # Bounding box for the player:
    playerBox = pygame.Rect(player.get_rect())
    playerBox.top = playerYPosition
    playerBox.left = playerXPosition

    # Make enemy approach the player.
    for i in range(num_enemies):
        enemiesXPosition[i] -= 0.15

        # Bounding box for the enemy:
        enemyBox = pygame.Rect(enemies[i].get_rect())
        enemyBox.top = enemiesYPosition[i]
        enemyBox.left = enemiesXPosition[i]

    #Test collision of the boxes:
    if playerBox.colliderect(enemyBox):
        print("You lose!")

    # If the enemy is off the screen the user wins the game:
    if enemiesXPosition[i] < 0 - enemy_width[i]:
        print("You win!")

1voto

Rabbid76 Points 52493

Créer une liste des ennemis et de leurs coordonnées. Charger l'image de l'ennemi et ajouter les ennemis à des positions aléatoires :

enemies = []
enemiesXPosition = []
enemiesYPosition = []
num_enemies = 3

enemy = pygame.image.load("monster.jpg")
enemyheight = enemy.get_height()
enemywidth = enemy.get_width()

for i in range(num_enemies):

    enemyx = random.randint(1100, screen_width - enemywidth)
    enemyy = random.randint(0, screen_height - enemyheight)

    enemies.append(enemy)
    enemiesXPosition.append(enemyx)
    enemiesYPosition.append(enemyy)

Dessinez les ennemis en boucle :

while 1:

    screen.fill(0)
    screen.blit(player, (playerXPosition, playerYPosition))
    for i in range(num_enemies):
        screen.blit(enemies[i], (enemiesXPosition[i], enemiesYPosition[i]))

Déplacez les ennemis et testez les collisions dans une boucle :

while 1:
    # [...]

    # Make enemy approach the player.
    for i in range(num_enemies):
        enemiesXPosition[i] -= 0.15

        # Bounding box for the enemy:
        enemyBox = pygame.Rect(enemies[i].get_rect())
        enemyBox.top = enemiesYPosition[i]
        enemyBox.left = enemiesXPosition[i]

        #Test collision of the boxes:
        if playerBox.colliderect(enemyBox):
            print("You lose!")

        # If the enemy is off the screen the user wins the game:
        if enemiesXPosition[i] < 0 - enemywidth:
            print("You win!")

Exemple de code complet :

import pygame
import random

# Initialize the pygame modules to get everything started.
pygame.init()

# The screen that will be created needs a width and a height.
screen_width = 1300
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))

# This creates the player and gives it the image found in this folder.
player = pygame.image.load("player.jpg")

# Creating multiple enemies
enemies = []
enemiesXPosition = []
enemiesYPosition = []
enemy_width = []
enemy_height = []
num_enemies = 3

enemy = image.load("monster.jpg")
enemyheight = enemy.get_height()
enemywidth = enemy.get_width()

for i in range(num_enemies):

    enemyx = random.randint(1100, screen_width - enemywidth)
    enemyy = random.randint(0, screen_height - enemyheight)

    enemies.append(enemy)
    enemiesXPosition.append(enemyx)
    enemiesYPosition.append(enemyy)
    enemy_width.append(enemywidth)
    enemy_height.append(enemyheight)

# Get the width and height of the images in order to do boundary detection (i.e. make sure the image stays within screen boundaries or know when the image is off the screen).
image_height = player.get_height()
image_width = player.get_width()

print("This is the height of the player image: " + str(image_height))
print("This is the width of the player image: " + str(image_width))

# Store the positions of the player as variables.
playerXPosition = 100
playerYPosition = 50

# Creating conditions for game to run
keyUp = False
keyDown = False
keyLeft = False
keyRight = False

# The game loop for running game till told to stop and drawing player and enemy
while 1:

    screen.fill(0)
    screen.blit(player, (playerXPosition, playerYPosition))
    for i in range(num_enemies):
        screen.blit(enemies[i], (enemiesXPosition[i], enemiesYPosition[i]))

    pygame.display.flip()

    # This loops through events in the game.
    for event in pygame.event.get():

        # This event checks if the user quits the program, then if so it exits the program.
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)

        # Event for Key presses
        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_UP:
                keyUp = True
            if event.key == pygame.K_DOWN:
                keyDown = True
            if event.key == pygame.K_LEFT:
                keyLeft = True
            if event.key == pygame.K_RIGHT:
                keyRight = True

        # Event to check if key is released
        if event.type == pygame.KEYUP:

            if event.key == pygame.K_UP:
                keyUp = False
            if event.key == pygame.K_DOWN:
                keyDown = False
            if event.key == pygame.K_LEFT:
                keyLeft = False
            if event.key == pygame.K_RIGHT:
                keyRight = False

    # Checks which keys are pressed and moves player accordingly
    if keyUp == True:
        if playerYPosition > 0:
            playerYPosition -= 1

    if keyDown == True:
        if playerYPosition < screen_height - image_height:
            playerYPosition += 1

    if keyLeft == True:
        if playerXPosition > 0:
            playerXPosition -= 1

    if keyRight == True:
        if playerXPosition < screen_width - image_width:
            playerXPosition += 1

    # Bounding box for the player:
    playerBox = pygame.Rect(player.get_rect())
    playerBox.top = playerYPosition
    playerBox.left = playerXPosition

    # Make enemy approach the player.
    for i in range(num_enemies):
        enemiesXPosition[i] -= 0.15

        # Bounding box for the enemy:
        enemyBox = pygame.Rect(enemies[i].get_rect())
        enemyBox.top = enemiesYPosition[i]
        enemyBox.left = enemiesXPosition[i]

        #Test collision of the boxes:
        if playerBox.colliderect(enemyBox):
            print("You lose!")

        # If the enemy is off the screen the user wins the game:
        if enemiesXPosition[i] < 0 - enemywidth:
            print("You win!")

1voto

code11 Points 1245

Vous vous attendez probablement à ce que les propriétés de l'objet ennemi soient contenues dans les listes suivantes :

enemy = []
enemy_height = []
enemy_width = []
enemyXPosition = []
enemyYPosition = []

Cependant, dans l'initialisation de l'ennemi, vous affectez directement ces variables au lieu de les ajouter :

enemyXPosition = random.randint(1100, screen_width)
enemyYPosition = random.randint(0, screen_height - enemyheight)

En outre, il semble qu'il manque des traits de soulignement dans la hauteur et la largeur.

enemyheight = enemy.get_height()
enemywidth = enemy.get_width()

si l'on veut ajouter ces valeurs à la rubrique enemy_height y enemy_width

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X