通义灵码实操—飞机大战游戏

简介: 在这个实践课程中,你将独立编写一个有趣的小游戏——“飞机大战”。借助通义灵码智能编程助手,你将从零开始,逐步构建一个个性化的游戏,体验编程的创造力和乐趣。通过学习 Pygame 库的使用,你不仅能掌握游戏开发的基本技能,还能深入了解游戏逻辑和图形界面的设计。快来加入我们,开启你的编程之旅吧!

有没有想象过自己独立编写一个有趣的小游戏。在本实践课程中,你不仅可以实现这个想法,而且还将得到通义灵码智能编程助手的支持与指导。我们将携手步入编程的神奇世界,以一种简洁、高效且具有创造性的方式,一步步构建起一个完全属于你自己的个性化小游戏。这将开启你对游戏开发深远理解的大门,让你享受到创作的乐趣和编程带来的无限可能。

实验步骤

步骤一:下载安装登录通义灵码

参考安装教程https://tongyi.aliyun.com/lingma

步骤二:实验源码

import pygame
import sys
from random import randint

# 初始化 Pygame
pygame.init()

# 设置屏幕尺寸
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("飞机大战")

# 加载图像
player_image = pygame.image.load('images/player.svg')
enemy_image = pygame.image.load('images/enemy.svg')
bullet_image = pygame.image.load('images/bullet.svg')
explosion_image = pygame.image.load('images/explosion.svg')
background_image = pygame.image.load('images/background1.png')  # 背景图片

# 加载声音
shoot_sound = pygame.mixer.Sound('sounds/sound.wav')

class Player:
    def __init__(self):
        self.image = player_image
        self.rect = self.image.get_rect()
        self.rect.topleft = (screen_width // 2, screen_height - 100)
        self.speed = 5

    def move(self, keys):
        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
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < screen_height:
            self.rect.y += self.speed

    def draw(self, surface):
        surface.blit(self.image, self.rect)

class Enemy:
    def __init__(self):
        self.image = enemy_image
        self.rect = self.image.get_rect()
        self.rect.topleft = (randint(0, screen_width - self.rect.width), -self.rect.height)
        self.speed = 2

    def move(self):
        self.rect.y += self.speed

    def draw(self, surface):
        surface.blit(self.image, self.rect)

class Bullet:
    def __init__(self, x, y):
        self.image = bullet_image
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.speed = 10

    def move(self):
        self.rect.y -= self.speed

    def draw(self, surface):
        surface.blit(self.image, self.rect)

class Explosion:
    def __init__(self, x, y):
        self.image = explosion_image
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.duration = 50  # 爆炸持续时间(毫秒)

    def draw(self, surface):
        surface.blit(self.image, self.rect)

    def update(self):
        self.duration -= 1
        return self.duration <= 0

def main():
    clock = pygame.time.Clock()
    player = Player()
    enemies = []
    bullets = []
    explosions = []
    enemy_spawn_time = 0
    score = 0  # 添加分数变量

    font = pygame.font.Font(None, 36)  # 创建字体对象

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    bullet = Bullet(player.rect.centerx, player.rect.top)
                    bullets.append(bullet)
                    shoot_sound.play()  # 播放射击声音

        keys = pygame.key.get_pressed()
        player.move(keys)

        # 敌人生成
        current_time = pygame.time.get_ticks()
        if current_time - enemy_spawn_time > 1000:
            enemy = Enemy()
            enemies.append(enemy)
            enemy_spawn_time = current_time

        # 更新敌人位置
        for enemy in enemies:
            enemy.move()
            if enemy.rect.top > screen_height:
                enemies.remove(enemy)

        # 更新子弹位置
        for bullet in bullets:
            bullet.move()
            if bullet.rect.bottom < 0:
                bullets.remove(bullet)

        # 检测碰撞
        for enemy in enemies[:]:
            if player.rect.colliderect(enemy.rect):
                print("Game Over!")
                pygame.quit()
                sys.exit()
            for bullet in bullets[:]:
                if bullet.rect.colliderect(enemy.rect):
                    enemies.remove(enemy)
                    bullets.remove(bullet)
                    explosion = Explosion(enemy.rect.centerx, enemy.rect.centery)
                    explosions.append(explosion)
                    score += 10  # 增加分数

        # 更新爆炸效果
        for explosion in explosions[:]:
            if explosion.update():
                explosions.remove(explosion)

        # 绘制背景图片
        screen.blit(background_image, (0, 0))

        # 绘制玩家
        player.draw(screen)

        # 绘制敌人
        for enemy in enemies:
            enemy.draw(screen)

        # 绘制子弹
        for bullet in bullets:
            bullet.draw(screen)

        # 绘制爆炸效果
        for explosion in explosions:
            explosion.draw(screen)

        # 绘制分数
        score_text = font.render(f"Score: {score}", True, (255, 255, 255))
        screen.blit(score_text, (10, 10))

        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()

代码解析与功能说明

  1. 初始化与设置

    • pygame.init():初始化 Pygame。
    • screen:创建一个 800x600 的游戏窗口,并设置标题为“飞机大战”。
    • player_image, enemy_image, bullet_image, explosion_image, background_image:加载玩家、敌人、子弹、爆炸和背景图像。
    • shoot_sound:加载射击声音。
  2. 类定义

    • Player 类

      • __init__:初始化玩家的位置和速度。
      • move:根据按键移动玩家。
      • draw:在屏幕上绘制玩家。
    • Enemy 类

      • __init__:初始化敌人的位置和速度。
      • move:向下移动敌人。
      • draw:在屏幕上绘制敌人。
    • Bullet 类

      • __init__:初始化子弹的位置和速度。
      • move:向上移动子弹。
      • draw:在屏幕上绘制子弹。
    • Explosion 类

      • __init__:初始化爆炸的位置和持续时间。
      • draw:在屏幕上绘制爆炸。
      • update:更新爆炸的持续时间,如果持续时间结束则返回 True
  3. 主循环

    • clock:创建一个时钟对象来控制帧率。
    • player:创建一个玩家对象。
    • enemies, bullets, explosions:分别存储敌人、子弹和爆炸的列表。
    • enemy_spawn_time:记录上一次生成敌人的时刻。
    • score:记录玩家的得分。
    • font:创建一个字体对象用于显示分数。
  4. 事件处理

    • 处理退出事件和射击事件。
    • 根据按键移动玩家。
  5. 敌人生成

    • 每隔 1 秒生成一个新的敌人。
  6. 更新位置

    • 更新敌人和子弹的位置。
    • 如果敌人或子弹超出屏幕范围,则移除它们。
  7. 碰撞检测

    • 检测玩家与敌人的碰撞,如果碰撞则游戏结束。
    • 检测子弹与敌人的碰撞,如果碰撞则移除敌人和子弹,并生成爆炸效果,增加分数。
  8. 绘制

    • 绘制背景、玩家、敌人、子弹和爆炸效果。
    • 绘制分数。
  9. 更新屏幕

    • 使用 pygame.display.flip() 更新屏幕。
    • 控制帧率为 60 帧/秒。

运行说明

  • 确保所有图像文件(player.svg, enemy.svg, bullet.svg, explosion.svg, background1.png)和声音文件(sound.wav)存在于 imagessounds 文件夹中。
  • 运行 main() 函数即可启动游戏。
  • 使用方向键控制玩家移动,空格键发射子弹。
  • 游戏目标是击毁尽可能多的敌人,避免被敌人撞到。

运行效果

导出GIF部分1

欢迎大家体验、试用阿里云百炼大模型和阿里云服务产品,链接如下:

阿里云百炼大模型

https://bailian.console.aliyun.com/

通义灵码_智能编码助手面向用户上线个人和企业版产品

https://tongyi.aliyun.com/lingma/pricing?userCode=jl9als0w

云工开物_阿里云高校计划助力高校科研与教育加速。

https://university.aliyun.com/mobile?userCode=jl9als0w

无影云电脑个人版简单易用、安全高效的云上桌面服务

https://www.aliyun.com/product/wuying/gws/personal_edition?userCode=jl9als0w

云服务器ECS省钱攻略五种权益,限时发放,不容错过

https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?userCode=jl9als0w

相关文章
|
22天前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
138 47
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
9月前
|
人工智能 自然语言处理 IDE
基于通义灵码完成 Hello World 上手实操
通过本实践课程,你将在通义灵码智能编码助手的能力下,智能开发一个web服务程序显示Hello World。本实践旨在了解编码助手帮你快速开发0到1的可运行程序,感受AI帮你提效的体验,感受通义灵码文生代码、代码解释、智能问答等功能。
1048 21
|
9月前
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
127 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
29天前
|
编解码 Cloud Native 算法
通义万相:视觉生成大模型再进化
通义万相是阿里云推出的视觉生成大模型,涵盖图像和视频生成。其2.0版本在文生图和文生视频方面进行了重大升级,采用Diffusion Transformer架构,提升了模型的灵活性和可控性。通过高质量美学标准和多语言支持,大幅增强了画面表现力。此外,视频生成方面引入高压缩比VAE、1080P长视频生成及多样化艺术风格支持,实现了更丰富的创意表达。未来,通义万相将继续探索视觉领域的规模化和泛化,打造更加通用的视觉生成大模型。
|
5月前
|
人工智能 自动驾驶 云栖大会
大模型赋能智能座舱,NVIDIA 深度适配通义千问大模型
9月20日杭州云栖大会上, NVIDIA DRIVE Orin系统级芯片实现了与阿里云通义千问多模态大模型Qwen2-VL的深度适配。阿里云、斑马智行联合NVIDIA英伟达推出舱驾融合大模型解决方案,基于通义大模型开发“能听会看”的智能座舱助理,让车内人员通过语音交流就能操作座舱内的各类应用,享受极致丰富的交互体验。
311 14
|
19天前
|
人工智能 自然语言处理 API
用AI Agent做一个法律咨询助手,罗老看了都直呼内行 feat.通义千问大模型&阿里云百炼平台
本视频介绍如何使用通义千问大模型和阿里云百炼平台创建一个法律咨询助手AI Agent。通过简单配置,无需编写代码或训练模型,即可快速实现智能问答功能。演示包括创建应用、配置知识库、上传民法典文档、构建知识索引等步骤。最终,用户可以通过API调用集成此AI Agent到现有系统中,提供专业的法律咨询服务。整个过程简便高效,适合快速搭建专业领域的小助手。
146 21
|
2月前
|
关系型数据库 机器人 OLAP
智答引领|AnalyticDB与通义千问大模型联手打造社区问答新体验
PolarDB开源社区推出基于云原生数据仓库AnalyticDB和通义千问大模型的“PolarDB知识问答助手”,实现一站式全链路RAG能力,大幅提升查询效率和问答准确率。该系统整合静态和动态知识库,提供高效的数据检索与查询服务,支持多种场景下的精准回答,并持续优化用户体验。欢迎加入钉群体验并提出宝贵意见。
智答引领|AnalyticDB与通义千问大模型联手打造社区问答新体验
|
2月前
|
开发框架 自然语言处理 JavaScript
千问开源P-MMEval数据集,面向大模型的多语言平行评测集
近期,通义千问团队联合魔搭社区开源的多语言基准测试集 P-MMEval,涵盖了高效的基础和专项能力数据集。
千问开源P-MMEval数据集,面向大模型的多语言平行评测集
|
2月前
|
机器学习/深度学习 人工智能 安全
通义视觉推理大模型QVQ-72B-preview重磅上线
Qwen团队推出了新成员QVQ-72B-preview,这是一个专注于提升视觉推理能力的实验性研究模型。提升了视觉表示的效率和准确性。它在多模态评测集如MMMU、MathVista和MathVision上表现出色,尤其在数学推理任务中取得了显著进步。尽管如此,该模型仍存在一些局限性,仍在学习和完善中。
|
5月前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。

热门文章

最新文章