You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyGame敌人血条实现问题:单敌受击却全敌掉血

Hey there! Let's tackle this problem step by step. The core issue here is that you're using a single global badguy_health variable for all enemies—so when one gets hit, everyone's health drops. And since you want to avoid classes (totally understandable for a beginner!), we can fix this by storing each enemy's health directly in the badguys list as part of their individual data.

What's Wrong With the Current Code?

  • Shared Health Variable: badguy_health is global, so every enemy uses the same value. Hit one, and all lose health.
  • No Per-Enemy Data: Each entry in badguys only tracks position ([x, y]), not unique health.
  • Collision Logic Issues: Your current loop hits all enemies when a bullet collides with one, and modifying lists mid-for loop causes index errors or unexpected behavior.

Fix Using Only Lists (No Classes)

We'll expand each enemy's entry in the badguys list to include their health, turning [x, y] into [x, y, current_health]. This way every enemy has their own independent health value.

1. Update Enemy List Structure

First, adjust how you initialize and spawn enemies to include health:

# Variable definition update
badguys=[[800,100, 65]]  # Now each enemy is [x, y, starting_health]

# Enemy spawning logic update
if badtimer==0:
    random_Y_position = random.randint(50,430)
    badguys.append([800, random_Y_position, 65])  # Add health to new enemies
    badtimer=100-(badtimer1*2)
    if badtimer1>=35:
        badtimer1=35
    else:
        badtimer1+=5

2. Fix Collision Detection to Target Individual Enemies

Use while loops instead of for loops when modifying lists (to avoid index errors), and only adjust health for the specific enemy that was hit:

# 6.3.2 - Check for collisions
index1 = 0
while index1 < len(arrows):
    bullet = arrows[index1]
    bullrect = pygame.Rect(arrow.get_rect())
    bullrect.left = bullet[1]
    bullrect.top = bullet[2]

    enemy_hit = False
    index2 = 0
    while index2 < len(badguys):
        badguy = badguys[index2]
        # Create a rect for THIS specific enemy
        badrect = pygame.Rect(random.choice(enemyArray).get_rect())
        badrect.left = badguy[0]
        badrect.top = badguy[1]

        if badrect.colliderect(bullrect):
            weapon_damage = random.randint(8,20)
            enemy.play()
            acc[0] += 1
            # Only reduce health for the hit enemy
            badguy[2] -= weapon_damage

            if badguy[2] <= 0:
                # Draw death effect at the enemy's position
                arrow1 = pygame.transform.rotate(badguydead, 360-projectile[0]*57.29)
                screen.blit(arrow1, (badguy[0], badguy[1]))
                # Remove the dead enemy from the list
                badguys.pop(index2)
            else:
                # Draw hit effect at the enemy's position
                screen.blit(explosion, (badguy[0], badguy[1]))

            # Remove the used bullet
            arrows.pop(index1)
            enemy_hit = True
            break  # Exit enemy loop since bullet only hits one enemy
        index2 += 1

    if not enemy_hit:
        index1 += 1

3. Update Enemy Drawing & Health Bar Logic

Now draw health bars using the unique health value stored in each enemy's sublist:

index=0
for badguy in badguys:
    if badguy[0] < -64:
        badguys.pop(index)
    else:
        badguy[0] -=7
        # Draw health bar above the enemy (adjust y-offset as needed)
        screen.blit(enemy_healthbar, (badguy[0], badguy[1]-10))
        # Draw health blocks based on this enemy's current health
        for health2 in range(badguy[2]):
            screen.blit(enemy_health_block, (badguy[0]+health2, badguy[1]-10))
        # Draw the enemy sprite (pick a random sprite or store one in the sublist!)
        rand_enemy = random.choice(enemyArray)
        screen.blit(rand_enemy, (badguy[0], badguy[1]))
    index +=1

4. Clean Up Global Variables

You can now delete the global badguy_health variable—each enemy tracks its own health in the badguys list.

Why This Works

By storing each enemy's health as part of their sublist in badguys, we ensure:

  • Attacks only affect the specific enemy that was hit
  • Removing an enemy doesn't reset others' health (no shared global variable)
  • All enemy data stays organized in a single list, no classes required

内容的提问来源于stack exchange,提问作者Daniel Van Schoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:55