大数跨境
0
0

从零打造飞机大战游戏 (Python版)

从零打造飞机大战游戏 (Python版) 趣聊科技圈
2024-10-04
1

效果演示


大家好,我是程序员黎明,一位热衷于编程与教学的博主。今天我们将共同学习如何使用 Python 和 Pygame 来构建一个简单但功能完整的飞机大战游戏。如果你对编程和游戏开发感兴趣,这篇教程将为你揭示如何从零编写一款经典的 2D 飞机大战游戏,快来学习吧!

游戏介绍

我们今天要开发的是一款飞机大战游戏。在游戏中,你将控制一架飞机躲避敌机的攻击,并且发射子弹击败它们。


代码实现

import pygame
import random
# 初始化Pygame
pygame.init()
# 设置屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 定义颜色
WHITE = (255255255)
BLACK = (000)
RED = (25500)
# 加载图片资源
player_img = pygame.image.load('player.png')
enemy_img = pygame.image.load('enemy.png')
bullet_img = pygame.image.load('bullet.png')
# 飞机类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (5050))
        self.rect = self.image.get_rect()
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.bottom = SCREEN_HEIGHT - 10
        self.speed = 5
    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
            self.rect.x += self.speed
    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)
# 敌机类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(enemy_img,(5050))
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
        self.rect.y = random.randint(-100-40)
        self.speedy = random.randint(26)
    def update(self):
        self.rect.y += self.speedy
        if self.rect.top > SCREEN_HEIGHT + 10:
            self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
            self.rect.y = random.randint(-100-40)
            self.speedy = random.randint(26)
# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.transform.scale(bullet_img,(50,50))
        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()
# 初始化精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# 创建玩家
player = Player()
all_sprites.add(player)
# 创建敌机
for i in range(8):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)
# 游戏主循环
def game_loop():
    running = True
    game_over = False
    # 控制帧率
    clock = pygame.time.Clock()
    # 游戏循环
    while running:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.shoot()
        # 游戏结束时显示Game Over
        if game_over:
            screen.fill(BLACK)
            font = pygame.font.SysFont(None55)
            text = font.render("Game Over"True, WHITE)
            screen.blit(text, (SCREEN_WIDTH // 3, SCREEN_HEIGHT // 3))
            pygame.display.flip()
            pygame.time.wait(2000)
            return
        # 更新所有精灵
        all_sprites.update()
        # 检测子弹与敌机碰撞
        hits = pygame.sprite.groupcollide(enemies, bullets, TrueTrue)
        for hit in hits:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)
        # 检测敌机与玩家碰撞
        hits = pygame.sprite.spritecollide(player, enemies, False)
        if hits:
            game_over = True
        # 绘制屏幕
        screen.fill(BLACK)
        all_sprites.draw(screen)
        pygame.display.flip()
# 游戏开始界面
def show_start_screen():
    screen.fill(BLACK)
    font = pygame.font.SysFont(None55)
    text = font.render("Press Any Key to Start"True, WHITE)
    screen.blit(text, (SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2))
    pygame.display.flip()
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYUP:
                waiting = False
# 运行游戏
while True:
    show_start_screen()
    game_loop()
    pygame.quit()
    quit()

代码解释

  1. 初始化与基本设置:我们使用 pygame.init() 来初始化 Pygame,并设置了屏幕大小为 800x600。颜色和图片资源的加载也在这一部分完成。

  2. 玩家类 Player:定义了玩家飞机的移动和射击功能。通过 pygame.key.get_pressed() 来检查键盘输入,允许玩家左右移动,按下空格键则发射子弹。

  3. 敌机类 Enemy:定义了敌机的随机出现和移动逻辑。敌机会从屏幕顶部随机出现,并以不同速度下落,超过屏幕后会重新生成。

  4. 子弹类 Bullet:玩家发射的子弹向上移动,超出屏幕后会自动销毁。

  5. 游戏主循环:在游戏主循环中,检测到玩家按下空格键时发射子弹,同时更新所有精灵的状态,并检测子弹与敌机、敌机与玩家的碰撞。如果玩家与敌机碰撞,游戏结束,显示 "Game Over" 字样。

  6. 开始与结束界面:在游戏开始时,显示提示信息让玩家按任意键开始游戏,游戏结束后显示 "Game Over"。


总结

通过这篇文章,我们制作了一个功能完整的飞机大战游戏。游戏不仅包含玩家飞机的移动和射击功能,还包括敌机的生成、碰撞检测等逻辑等。本期就到这里啦,感谢观看,我们下期再见


【声明】内容源于网络
0
0
趣聊科技圈
🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
内容 511
粉丝 0
趣聊科技圈 🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
总阅读827
粉丝0
内容511