fre1228 2023-03-27 09:35 采纳率: 83.3%
浏览 29
已结题

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()

  • 写回答

2条回答 默认 最新

  • Leodong. 2023-03-27 10:23
    关注

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

    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
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月30日
  • 赞助了问题酬金15元 3月29日
  • 已采纳回答 3月29日
  • 创建了问题 3月27日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度