pygame制作游戏飞机大战想给敌机增加血量没有报错但无法运行,想增加道具使飞船子弹杀伤力加1变成了数量乘2

pygame制作游戏飞机大战想给敌机增加血量没有报错但无法运行,想增加道具使飞船子弹杀伤力加1变成了数量乘2


import pygame
import random
import os
FPS=60
WHITE=(255,255,255)
GREEN=(0,255,0)
RED=(255,0,0)
YELLOW=(0,0,255)
BLACK=(0,0,0)
WIDTH=500
HEIGHT=600
color_blue = (30, 144, 255)
color_red = (255, 0, 0)
pygame.init()
screen=pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("飞机大战")
clock=pygame.time.Clock()
#载入图片
background_img=pygame.image.load(os.path.join("img","background.png")).convert()
player_img=pygame.image.load(os.path.join("img","player.png")).convert()
rock_img=pygame.image.load(os.path.join("img","rock.png")).convert()
bullet_img=pygame.image.load(os.path.join("img","bullet.png")).convert()
plane_img=pygame.image.load(os.path.join("img","plane.png")).convert()
supply_img=pygame.image.load(os.path.join("img","supply.png")).convert()
font_name=pygame.font.match_font('arail')
# 创建陨石事件
CREATE_ROCK_EVENT = pygame.USEREVENT
pygame.time.set_timer(CREATE_ROCK_EVENT, 1000)

def draw_text(surf,text,size,x,y):
    font=pygame.font.Font(font_name,size)
    text_surface=font.render(text,True,WHITE)
    text_rect=text_surface.get_rect()
    text_rect.centerx=x
    text_rect.top=y
    surf.blit(text_surface,text_rect)
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=player_img
        self.image.set_colorkey(WHITE)
        self.rect=self.image.get_rect()
        self.rect.centerx=WIDTH/2
        self.rect.bottom=HEIGHT-10
        self.speedx=5
    def update(self): 
        # 英雄在水平方向移动
        self.rect.x += self.speedx
        # 限制英雄在屏幕内
        if self.rect.x < 0:
            self.rect.x = 0
        self.speedx=0
    def shoot(self):
        bullet=Bullet(self.rect.centerx,self.rect.top)
        all_sprites.add(bullets)
        bullets.add(bullet)
class Bullet(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image=bullet_img
        self.image.set_colorkey(WHITE)
        self.damage=1
        self.rect=self.image.get_rect()
        self.rect.centerx=x
        self.rect.bottom=y
        self.speedy=-10
    def update(self):
        self.rect.y+=self.speedy
        if self.rect.bottom < 0:
            self.kill()
            
class Rock(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)     
        self.image_orig = rock_img
        self.image = self.image_orig.copy()  # 复制一份新的Surface对象,避免图像变形
        self.rect=self.image.get_rect()
        self.image.set_colorkey(WHITE)
        self.radius=int(self.rect.width*0.85/2)
        self.rect.x=random.randrange(0,WIDTH-self.rect.width)
        self.rect.y=random.randrange(-180,-100)
        self.speedy=random.randrange(0,6)
        self.speedx=random.randrange(-3,3)
        self.rect.centerx = WIDTH / 2
        self.degree = 0                             # 初始化当前角度为0
        self.rot_speed = random.randint(-10, 10)      # 旋转变化的方向和角度随机
        self.last_update = pygame.time.get_ticks()  # 记录当前时间点

    def rotate(self):
        now = pygame.time.get_ticks()           # 获取当前时间点
        if now - self.last_update > 50:         # 间隔超过50毫秒时才旋转,以免转得过快
            self.last_update = now              # 刷新最后更新时间点
            # 增加旋转角度,对360取余数是为了让角度数值不超过360度
            self.degree = (self.degree + self.rot_speed*10) % 360
            # 旋转的是原始的Surface对象
            new_image= pygame.transform.rotate(self.image_orig, self.degree)
            roate_image = pygame.transform.rotate(self.image_orig, self.degree)
            new_image = pygame.transform.scale(roate_image, (self.rect.width+1, self.rect.height+1))
            old_center = self.rect.center       # 将原始的rect中心坐标暂存到变量old_center
            self.image = new_image              # 将旋转后的对象重新赋值给self.image
            self.rect = self.image.get_rect()   # 重新获取rect 
            self.rect.center = old_center       # 旋转后的rect中心坐标仍然与原来的中心相同

    def update(self):
        self.rotate()
        self.rect.y+=self.speedy
        self.rect.x+=self.speedx
        if self.rect.y >= HEIGHT or self.rect.x >= WIDTH or self.rect.x < 0:
            self.kill()
        if self.rect.top>HEIGHT or self.rect.left>WIDTH or self.rect.right<0:
            self.rect.x=random.randrange(0,WIDTH-self.rect.width)
            self.rect.y=random.randrange(-100,-40)
            self.speedy=random.randrange(2,10)
            self.speedx=random.randrange(-3,3)
            
class bloodline(object):
    def __init__(self, color, x, y, length, width=2, value=2):
        self.color = color
        self.x = x
        self.y = y
        self.length = length
        self.width = width  # 线宽
        self.value = value * 1.0  # 血量用浮点数
        self.weight = length / value  # 每一滴血表示的距离
        self.color_init = color

    def update(self, canvas):
        if self.length <= self.value * self.weight / 2:
            self.color = color_red
        else:
            self.color = self.color_init
        self.bar_rect = pygame.draw.line(canvas, self.color, (self.x, self.y), (self.x + self.length, self.y),
                                         self.width)


class Plane(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=plane_img
        self.rect=self.image.get_rect()
        self.radius=int(self.rect.width*0.85/2)
        self.image.set_colorkey(WHITE) 
        self.rect.x=random.randrange(0,WIDTH-self.rect.width)
        self.rect.y=random.randrange(-100,-40)
        self.speedy=2
        if self.number==1:
            self.bar=bloodline(color_blue,self.rect.x,self.rect.y,self.rect.width)
        else:
            self.bar=bloodline(color_blue,self.rect.x,self.rect.y,self.rect.width,3,4)
    def update(self):
        self.rect.y+=self.speedy
        
class Supply(pygame.sprite.Sprite):#道具
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=supply_img
        self.rect=self.image.get_rect()
        self.image.set_colorkey(WHITE)
        self.rect.x=random.randrange(0,WIDTH-self.rect.width)
        self.rect.y=random.randrange(-100,-30)
        self.speedy=2
    def update(self):
        self.rect.y+=self.speedy 
            
all_sprites=pygame.sprite.Group() 
rocks=pygame.sprite.Group()#陨石
bullets=pygame.sprite.Group()
planes=pygame.sprite.Group()#敌机
supplies=pygame.sprite.Group()#道具
player=Player()
all_sprites.add(player)
for k in range(3):
    s=Supply()
    supplies.add(s)
    all_sprites.add(s)
for j in range(8):
    p=Plane()
    planes.add(p)
    all_sprites.add(p)
for i in range(8):
   r=Rock()
   rocks.add(r)
   all_sprites.add(r)

score=0
running=True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
        elif event.type == CREATE_ROCK_EVENT:
            r=Rock()
            rocks.add(r)
        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_SPACE:
                player.shoot()
            # 判断按键按住以及按下 - 元组
    keys_pressed  = pygame.key.get_pressed()
    # 判断元组中对应的按键索引值,按为1
    if keys_pressed[pygame.K_RIGHT]:
        player.speedx = 3
    elif keys_pressed[pygame.K_LEFT]:
        player.speedx = -3
    else :
        player.speed = 0
    hits=pygame.sprite.groupcollide(rocks,bullets,True,True)#陨石和子弹的碰撞
    for hit in hits:
        score+=hit.radius
        r=Rock()
        all_sprites.add(r)
        rocks.add(r)
    hits=pygame.sprite.spritecollide(player,rocks,False)#飞船和陨石的碰撞
    if hits:
        running=False
    hits=pygame.sprite.groupcollide(bullets, rocks, True, True)#子弹和陨石的碰撞
    for hit in hits:
        score+=1
        
        
          
    hits=pygame.sprite.groupcollide(planes,bullets,True,True)#敌机和子弹的碰撞
    for hit in hits:
        score+=hit.radius
        p=Plane()
        all_sprites.add(p)
        planes.add(p)
    hits=pygame.sprite.spritecollide(player,planes,False)#飞船和敌机的碰撞
    if hits:
         running=False
    hits =pygame.sprite.groupcollide(bullets,planes, True, True)
    for hit in hits:
         score+=1
    
    hits=pygame.sprite.spritecollide(player,supplies,False)
    for hit in hits:
        s=Supply()
        all_sprites.add(s)
        supplies.add(s)
        bullets.damage=2
        
    
    
    screen.blit(background_img,(0,0))
    all_sprites.update()
    all_sprites.draw(screen)
    rocks.update()
    rocks.draw(screen)
    bullets.update()
    bullets.draw(screen)
    draw_text(screen,str(score),18,WIDTH/2,10)
    pygame.display.update()
pygame.quit()

面是修改后的代码,你在自己本地跑一下试试,具体如下:

import pygame
import random
import os

FPS = 60
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
YELLOW = (0, 0, 255)
BLACK = (0, 0, 0)
WIDTH = 500
HEIGHT = 600
color_blue = (30, 144, 255)
color_red = (255, 0, 0)

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞机大战")
clock = pygame.time.Clock()

# 载入图片
background_img = pygame.image.load(os.path.join("img", "background.png")).convert()
player_img = pygame.image.load(os.path.join("img", "player.png")).convert()
rock_img = pygame.image.load(os.path.join("img", "rock.png")).convert()
bullet_img = pygame.image.load(os.path.join("img", "bullet.png")).convert()
plane_img = pygame.image.load(os.path.join("img", "plane.png")).convert()
supply_img = pygame.image.load(os.path.join("img", "supply.png")).convert()

font_name = pygame.font.match_font('arial')

# 创建陨石事件
CREATE_ROCK_EVENT = pygame.USEREVENT
pygame.time.set_timer(CREATE_ROCK_EVENT, 1000)


def draw_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, WHITE)
    text_rect = text_surface.get_rect()
    text_rect.centerx = x
    text_rect.top = y
    surf.blit(text_surface, text_rect)


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_img
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0  # 将初始速度设置为0

    def update(self):
        # 获取键盘按键状态
        keystate = pygame.key.get_pressed()
        # 更新速度
        self.speedx = 0
        if keystate[pygame.K_LEFT]:
            self.speedx = -5
        if keystate[pygame.K_RIGHT]:
            self.speedx = 5
        # 移动飞船
        self.rect.x += self.speedx
        # 限制飞船在屏幕内
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.image.set_colorkey(WHITE)
        self.damage = 1
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom < 0:
            self.kill

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢