跳到主要内容

一个python小游戏

· 阅读需 2 分钟

✈️ 飞机大战​

  • 做一个经典的小游戏
  • 贴上完整版🔗链接

基本逻辑​

构建飞机可以在画面最底下左右移动并且不会移动到界面以外(初始位置居中):

    class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.transform.scale(player_img,(50,38))
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.radius = 20
self.rect.centerx = WIDTH // 2
self.rect.bottom = HEIGHT - 10

后续可修改飞机速度是否有加速度,或者匀速。

构建陨石从画面上方(界面以外)生成并且掉落:

    class Rock(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image_ori = random.choice(rock_imgs)
self.image_ori.set_colorkey(BLACK)
self.image = self.image_ori.copy()
self.rect = self.image.get_rect()
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(2, 7)
self.speedx = random.randrange(-3, 3)

后续可修改陨石的随机速度范围,旋转角度,大小等。

构建子弹从飞机上方向上发射:

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

后续可添加多枚子弹以及多枚子弹效果持续时间等。

添加碰撞事件:

    #判断石头与子弹碰撞
hits = pygame.sprite.groupcollide(rocks,bullets,True,True)
for hit in hits:
random.choice(expl_sounds).play()
score += hit.radius
expl = Explosion(hit.rect.center,'lg')
all_sprites.add(expl)
if random.random() > 0.9:
pow = Power(hit.rect.center)
all_sprites.add(pow)
powers.add(pow)
new_rock()
#判断石头与飞机碰撞
hits = pygame.sprite.spritecollide(player,rocks,True,pygame.sprite.collide_circle)
for hit in hits:
new_rock()
player.health -= hit.radius
expl = Explosion(hit.rect.center,'sm')
all_sprites.add(expl)
if player.health <= 0:
die = Explosion(player.rect.center,'player')
all_sprites.add(die)
die_sound.play()
player.lives -= 1
player.health = 100
player.hide()