首页 > 编程语言 >用Python实现经典游戏——飞机大战(代码附在文末)

用Python实现经典游戏——飞机大战(代码附在文末)

时间:2024-12-21 12:55:50浏览次数:7  
标签:游戏 附在 Python self def WINDOW pygame 文末 rect

引言

在Python中,Pygame是一个非常流行的游戏开发库,适合初学者入门。本文将带你一步步实现一个经典的“飞机大战”游戏,并逐步优化代码,增加关卡系统、难度递增等功能。通过本文,你将学习到如何使用Pygame创建游戏窗口、处理用户输入、实现精灵类、碰撞检测以及游戏逻辑的优化。


1. 游戏概述

“飞机大战”是一款经典的射击游戏,玩家控制一架飞机,通过左右移动和发射子弹来消灭敌人。游戏的目标是尽可能多地消灭敌人,并避免被敌人击中。随着分数的增加,游戏会进入下一关,敌人的速度和数量也会增加,从而增加游戏难度。


2. 环境准备

在开始编写代码之前,请确保你已经安装了Pygame库。如果没有安装,可以通过以下命令进行安装:

pip install pygame

3. 游戏窗口与基本设置

首先,我们需要创建一个游戏窗口,并设置一些基本参数,如窗口大小、颜色等。

import pygame
import random

# 游戏窗口大小
WINDOW_WIDTH = 600
WINDOW_HEIGHT = 800

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# 初始化Pygame
pygame.init()

# 创建游戏窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("飞机大战")

# 创建时钟对象,用于控制游戏帧率
clock = pygame.time.Clock()

4. 飞机类

接下来,我们定义一个飞机类,玩家可以通过键盘控制飞机的移动。

class Plane(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface([50, 50])  # 飞机的形状
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.x = WINDOW_WIDTH // 2
        self.rect.y = WINDOW_HEIGHT - 100
        self.speed = 5

    def update(self):
        # 获取键盘按键状态
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.rect.x += self.speed

        # 限制飞机在窗口范围内移动
        if self.rect.x < 0:
            self.rect.x = 0
        if self.rect.x > WINDOW_WIDTH - 50:
            self.rect.x = WINDOW_WIDTH - 50

    def shoot(self):
        bullet = Bullet(self.rect.x + 23, self.rect.y)
        all_sprites.add(bullet)
        bullets.add(bullet)

5. 子弹类

子弹类负责生成子弹,并让子弹向上移动。

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface([5, 10])  # 子弹的形状
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 10

    def update(self):
        self.rect.y -= self.speed
        if self.rect.y < -10:
            self.kill()

6. 敌人类

敌人类负责生成敌人,并让敌人向下移动。

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface([30, 30])  # 敌人的形状
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WINDOW_WIDTH - 30)
        self.rect.y = 0
        self.speed = random.randint(1, 5)

    def update(self):
        self.rect.y += self.speed
        if self.rect.y > WINDOW_HEIGHT:
            self.rect.x = random.randint(0, WINDOW_WIDTH - 30)
            self.rect.y = 0
            self.speed = random.randint(1, 5)

7. 游戏主循环

游戏的主循环负责处理事件、更新精灵、检测碰撞以及绘制画面。

def game_loop():
    global score, last_shot_time, level
    running = True
    while running:
        # 处理事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    current_time = pygame.time.get_ticks()
                    if current_time - last_shot_time > SHOOT_COOLDOWN:
                        player.shoot()
                        last_shot_time = current_time

        # 更新所有精灵
        all_sprites.update()

        # 检测子弹与敌人的碰撞
        if pygame.sprite.groupcollide(bullets, enemies, True, True):
            score += 1

        # 检测玩家与敌人的碰撞
        if pygame.sprite.spritecollide(player, enemies, True):
            game_over()
            running = False

        # 动态生成敌人
        if len(enemies) < 10 + level * 2:  # 每关增加2个敌人
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

        # 检查是否达到下一关的分数
        if score >= LEVEL_UP_SCORE:
            level_up()

        # 绘制背景
        window.fill(BLACK)

        # 绘制所有精灵
        all_sprites.draw(window)

        # 绘制分数和关卡
        draw_score_and_level()

        # 刷新屏幕
        pygame.display.flip()

        # 控制帧率
        clock.tick(60)


8. 关卡系统

每20分进入下一关,并增加敌人的速度和数量。

def level_up():
    global score, level
    level += 1
    score = 0  # 重置分数
    increase_difficulty()
    print(f"进入第 {level} 关!")

def increase_difficulty():
    for enemy in enemies:
        enemy.speed += 1  # 增加敌人速度

9. 游戏结束界面

当玩家被敌人击中时,显示游戏结束界面。

def game_over():
    font = pygame.font.Font(None, 72)
    game_over_text = font.render("Game Over", True, WHITE)
    window.blit(game_over_text, (WINDOW_WIDTH // 2 - 150, WINDOW_HEIGHT // 2 - 50))
    pygame.display.flip()
    pygame.time.delay(2000)  # 延迟2秒

10. 总结

通过本文,我们实现了一个简单的“飞机大战”游戏,并逐步增加了关卡系统、难度递增等功能。Pygame是一个非常适合初学者的游戏开发库,通过学习本文,你可以掌握如何使用Pygame创建游戏窗口、处理用户输入、实现精灵类以及碰撞检测等基本功能。

完整代码(下载可直接使用)https://download.csdn.net/download/weixin_74773078/90162562?spm=1001.2014.3001.5503

标签:游戏,附在,Python,self,def,WINDOW,pygame,文末,rect
From: https://blog.csdn.net/weixin_74773078/article/details/144629703

相关文章

  • python毕设 家政服务管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于家政服务管理系统的研究,现有研究多以传统的管理模式或特定技术框架下(如Javaweb)的实现为主 [1] 。专门针对Python语言来构建家政......
  • [Python学习日记-73] 面向对象实战1——答题系统
    [Python学习日记-73]面向对象实战1——答题系统简介需求模型——5w1h8c领域模型设计模型实现模型案例:年会答题系统简介    在学习完面向对象之后你会发现,你还是不会自己做软件做系统,这是非常正常的,这是因为计算机软件和系统的制作是一个系统性工程,在大学里面......
  • python毕设 旅游景区智能门票系统规划设计论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于旅游景区智能门票系统规划设计的研究,现有研究多侧重于景区的数字化转型、售票方式的多样化等方面,如国内三亚景区利用人工智能、大......
  • 【Python逆向】深入Pyd逆向
    pyd文件是编译生成的Python扩展模块,是类似so、dll的一种Python文件。pyd文件无法像pyc文件那样恢复源码,只能通过逆向手段去恢复逻辑。一、理解pyd文件1.1编译pyd自己编译一个pyd保留符号来看。test.py:importbase64key=[ord(i)foriin"key"]res="GVhil......
  • 应届生也能速通软考高级:第五章-逐章节重点解读1(文末送资料)
    前情提要欢迎来到应届生也能速通软考高级专栏!一起学起来吧!在专栏的前篇博客中,我们已经做好了软考学习的所有准备,接下来就要进入正式的内容学习阶段咯!应届生也能速通软考高级:第一章-软考概述应届生也能速通软考高级:第二章-高级架构师概述应届生也能速通软考高级:第三章-高......
  • 【Python GUI 编程】tkinter :Ttk 组合框 Combobox
    在本文中,将介绍如何创建一个tkinterCombobox组合框小部件,该小部件允许用户从一组值中选择一个值。Combobox组合框小部件是新增的Ttk主题小部件,是Entry文本框和Listbox列表框的组合。除了允许在一组值中选择一个值外,它还允许输入自定义值。创建组合框要创建组合框小部......
  • 使用 pickle 模块在 Python 中进行 pickling 和 unpickling
    pickle—Python对象序列化python 是一种广泛使用的通用高级编程语言。在本文中,我们将学习使用pickle模块在Python中进行pickling和unpickling。PythonPickle模块pickle模块用于实现二进制协议,用于序列化和反序列化Python对象结构。Pickli......
  • 【Python GUI 编程】tkinter:Ttk 选项卡 Notebook
    在本文中,将介绍如何使用TkinterNotebook小部件创建选项卡。Notebook是由TkinterTtk模块引入的强大小部件。允许开发者创建包含多个选项卡的界面,每个选项卡可以包含不同的内容。创建Notebook小部件,请使用如下构造函数:notebook=ttk.Notebook(master,**kw)添加选项卡......
  • 使用Python进行量化交易,关键知识点有哪些?
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 【2024最新】基于Python+Mysql+django的公务员考试信息管理系统Lw+PPT
    作者:计算机搬砖家开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选实战项目源码......