pygame开发课程系列(7):打砖块,飞行射击,跳跃游戏实例开发

news2024/9/21 4:35:13

第七章 实践项目

在本章中,我们将通过三个实践项目来巩固和应用前面章节中学到的知识。这些项目涵盖了经典打砖块游戏、飞行射击游戏和简单的平台游戏,它们将帮助你更好地理解 Pygame 的使用,并为你开发自己的游戏提供灵感和实践经验。

7.1 项目 1: 经典打砖块在这里插入图片描述

目标: 设计一个简单的打砖块游戏,玩家控制一个挡板,反弹一个球,打破砖块以获得分数。

7.1.1 设计基本逻辑
  1. 初始化 Pygame

    import pygame
    import sys
    
    pygame.init()
    
  2. 设置游戏窗口

    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("经典打砖块")
    
  3. 定义颜色

    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    
  4. 创建挡板、球和砖块

    # 挡板
    paddle = pygame.Rect(350, 550, 100, 20)
    paddle_speed = 5
    
    # 球
    ball = pygame.Rect(390, 530, 20, 20)
    ball_speed_x = 3
    ball_speed_y = -3
    
    # 砖块
    bricks = [pygame.Rect(60 + i * 60, 50 + j * 30, 50, 20) for i in range(10) for j in range(5)]
    
  5. 游戏循环

    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            paddle.x -= paddle_speed
        if keys[pygame.K_RIGHT]:
            paddle.x += paddle_speed
    
        # 更新球的位置
        ball.x += ball_speed_x
        ball.y += ball_speed_y
    
        # 碰撞检测
        if ball.left <= 0 or ball.right >= 800:
            ball_speed_x = -ball_speed_x
        if ball.top <= 0:
            ball_speed_y = -ball_speed_y
        if ball.colliderect(paddle):
            ball_speed_y = -ball_speed_y
    
        # 砖块碰撞
        for brick in bricks[:]:
            if ball.colliderect(brick):
                ball_speed_y = -ball_speed_y
                bricks.remove(brick)
    
        # 绘制
        screen.fill(BLACK)
        pygame.draw.rect(screen, WHITE, paddle)
        pygame.draw.ellipse(screen, RED, ball)
        for brick in bricks:
            pygame.draw.rect(screen, WHITE, brick)
    
        pygame.display.flip()
        clock.tick(60)
    

完整代码如下:

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("经典打砖块")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)

# 挡板
paddle = pygame.Rect(350, 550, 100, 20)
paddle_speed = 5

# 球
ball = pygame.Rect(390, 530, 20, 20)
ball_speed_x = 3
ball_speed_y = -3

# 砖块
bricks = [pygame.Rect(60 + i * 60, 50 + j * 30, 50, 20) for i in range(10) for j in range(5)]

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        paddle.x -= paddle_speed
    if keys[pygame.K_RIGHT]:
        paddle.x += paddle_speed

    # 更新球的位置
    ball.x += ball_speed_x
    ball.y += ball_speed_y

    # 碰撞检测
    if ball.left <= 0 or ball.right >= 800:
        ball_speed_x = -ball_speed_x
    if ball.top <= 0:
        ball_speed_y = -ball_speed_y
    if ball.colliderect(paddle):
        ball_speed_y = -ball_speed_y

    # 砖块碰撞
    for brick in bricks[:]:
        if ball.colliderect(brick):
            ball_speed_y = -ball_speed_y
            bricks.remove(brick)

    # 绘制
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, paddle)
    pygame.draw.ellipse(screen, RED, ball)
    for brick in bricks:
        pygame.draw.rect(screen, WHITE, brick)

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

最终运行效果如图:
在这里插入图片描述

7.2 项目 2: 飞行射击游戏

目标: 创建一个简单的飞行射击游戏,玩家控制飞行器,射击敌人,避免被敌人击中。

7.2.1 设计基本逻辑
  1. 初始化 Pygame设置窗口

    import pygame
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("飞行射击游戏")
    
  2. 定义颜色和资源

    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    
    # 飞行器
    player = pygame.Rect(375, 500, 50, 30)
    player_speed = 5
    
    # 子弹
    bullets = []
    
    # 敌人
    enemies = [pygame.Rect(i * 60, j * 50, 40, 30) for i in range(10) for j in range(3)]
    
  3. 游戏循环

    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= player_speed
        if keys[pygame.K_RIGHT]:
            player.x += player_speed
        if keys[pygame.K_SPACE]:
            bullets.append(pygame.Rect(player.centerx - 5, player.top - 10, 10, 20))
    
        # 更新子弹位置
        for bullet in bullets[:]:
            bullet.y -= 10
            if bullet.bottom < 0:
                bullets.remove(bullet)
    
        # 碰撞检测
        for bullet in bullets[:]:
            for enemy in enemies[:]:
                if bullet.colliderect(enemy):
                    bullets.remove(bullet)
                    enemies.remove(enemy)
    
        # 绘制
        screen.fill(BLACK)
        pygame.draw.rect(screen, WHITE, player)
        for bullet in bullets:
            pygame.draw.rect(screen, WHITE, bullet)
        for enemy in enemies:
            pygame.draw.rect(screen, WHITE, enemy)
    
        pygame.display.flip()
        clock.tick(60)
    

整体代码:

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("飞行射击游戏")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 飞行器
player = pygame.Rect(375, 500, 50, 30)
player_speed = 5

# 子弹
bullets = []

# 敌人
enemies = [pygame.Rect(i * 60, j * 50, 40, 30) for i in range(10) for j in range(3)]

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= player_speed
    if keys[pygame.K_RIGHT]:
        player.x += player_speed
    if keys[pygame.K_SPACE]:
        bullets.append(pygame.Rect(player.centerx - 5, player.top - 10, 10, 20))

    # 更新子弹位置
    for bullet in bullets[:]:
        bullet.y -= 10
        if bullet.bottom < 0:
            bullets.remove(bullet)

    # 碰撞检测
    for bullet in bullets[:]:
        for enemy in enemies[:]:
            if bullet.colliderect(enemy):
                bullets.remove(bullet)
                enemies.remove(enemy)

    # 绘制
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, player)
    for bullet in bullets:
        pygame.draw.rect(screen, WHITE, bullet)
    for enemy in enemies:
        pygame.draw.rect(screen, WHITE, enemy)

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

运行效果如下:
在这里插入图片描述

7.3 项目 3: 简单的爬梯跳跃游戏

目标: 设计一个基本的小游戏玩家可以在梯子上移动和跳跃。

7.3.1 设计基本逻辑
  1. 初始化 Pygame设置窗口

    import pygame
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("简单的平台游戏")
    
  2. 定义颜色和资源

    WHITE = (255, 255, 255)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    
    # 玩家
    player = pygame.Rect(50, 500, 40, 60)
    player_speed = 5
    player_jump = False
    player_y_velocity = 0
    
    # 平台
    platforms = [pygame.Rect(0, 550, 800, 50), pygame.Rect(200, 400, 200, 20)]
    gravity = 0.5
    
  3. 游戏循环

    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= player_speed
        if keys[pygame.K_RIGHT]:
            player.x += player_speed
        if keys[pygame.K_SPACE] and not player_jump:
            player_y_velocity = -10
            player_jump = True
    
        # 应用重力
        player_y_velocity += gravity
        player.y += player_y_velocity
    
        # 平台碰撞
        for platform in platforms:
            if player.colliderect(platform):
                if player_y_velocity > 0:
                    player.bottom = platform.top
                    player_y_velocity = 0
                    player_jump = False
    
        # 边界检测
        if player.bottom > 600:
            player.bottom = 600
            player_y_velocity = 0
            player_jump = False
    
        # 绘制
        screen.fill(BLUE)
        pygame.draw.rect(screen, WHITE, player)
        for platform in platforms:
            pygame.draw.rect(screen, GREEN, platform)
    
        pygame.display.flip()
        clock.tick(60)
    

运行效果如下:
在这里插入图片描述

小结

在本章中,我们通过三个实践项目展示了如何使用 Pygame 开发简单的游戏。这些项目不仅让你了解了游戏开发的基本流程,还帮助你掌握了 Pygame 的核心功能。你可以使用这些项目作为起点,继续扩展和改进你的游戏,或者尝试创建更多不同类型的游戏。通过不断实践和优化,你将能够创建更复杂、更有趣的游戏项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java毕业论文 【二手书电子商城网站】源码见github (原创项目,从0-1自己实现)

文章目录 项目背景主要功能模块分布模块分布具体部分功能 系统架构功能演示买家部分界面&#xff1a;卖家部分界面【8002模块】&#xff1a;管理员部分界面&#xff1a; 项目github地址 项目背景 主要面向高校学生&#xff0c;将高年级同学的书回收到低年级学生的手上&#xf…

EmguCV学习笔记 C# 5.2 仿射变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)

教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程&#xff0c;主要是对学校班级&#xff0c;学生信息进行管理维护&#xff08;包含选型、开发、发布、部署&#xff09;&#xff01; 什么是SQLite&#xff1f; SQLite 是一个软件库&#xff0c;实现了自给自…

【蓝牙协议栈】【BLE】精讲引用(包含)服务(Included service)

1.欢迎大家关注和订阅匠心之作&#xff0c;【精讲蓝牙协议栈】、【精讲BLE协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01; 2. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OP…

【安全靶场】-DC-8

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 目标&#xff1a;192.168.216.150 一、收集信息 1.端口扫描 nmap -T4 -A 192.168.216.150 -p- 看到80端…

【comfyui 】comfyui mac配置教程

comfyui mac配置教程 1. 安装工程依赖与环境配置2. 安装Comfyui3. Comfyui模型下载与运行 1. 安装工程依赖与环境配置 首先&#xff0c;我们找到Mac电脑的终端并打开&#xff0c;我们复制下列代码并粘贴到终端&#xff0c;然后回车&#xff0c;即可开始安装Xcode工具。 xcode…

C++(week17): C++提高:(七)workflow

文章目录 一、Http协议二、Nginx1.概念2.nginx的安装和部署(1)安装nginx(2)使用nginx服务器部署静态资源 3.HTTP服务器架构(1)基于进程、基于线程&#xff1a;APache(2)事件驱动模型&#xff1a;Nginx(3)反向代理(4)负载均衡 三、workflow异步事件引擎 (异步回调模型)1.服务器底…

day26-测试之接口测试postma的请求前置脚本、关联、测试报告

目录 一、请求前置脚本 1.1.概念 1.2.步骤 1.3.代码 1.4.工作原理 二、关联 2.1.应用场景 2.2.实现步骤 2.3.代码 三、测试报告 3.1.安装newman 3.2.命令说明 一、请求前置脚本 1.1.概念 1).书写在”pre-request”标签中 2).postman在http请求发送之前&#xff0c;会自动执行…

easyexcel--多sheet页导入导出

多sheet页导出 核心代码就是下图里面的&#xff0c;使用EasyExcel.writeSheet创建一个sheet,然后用excelWriter写入就行了&#xff0c;很简单 GetMapping("downloadMultiSheet")public void downloadMultiSheet(HttpServletResponse response) throws IOException {…

Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)

0 前言 在大数据时代&#xff0c;我们要面对大量数据&#xff0c;有时需要对数据进行替换、删除、新增、选取等特定工作。 在Linux中提供很多数据处理命令&#xff0c;如果我们要以行为单位进行数据处理&#xff0c;可以使用sed。 1 sed 的帮助信息&#xff0c;功能&#xff…

Golang | Leetcode Golang题解之第352题将数据流变为多个不相交区间

题目&#xff1a; 题解&#xff1a; type SummaryRanges struct {*redblacktree.Tree }func Constructor() SummaryRanges {return SummaryRanges{redblacktree.NewWithIntComparator()} }func (ranges *SummaryRanges) AddNum(val int) {// 找到 l0 最大的且满足 l0 < val…

opencv-python图像增强十一:文档阴影去除

文章目录 一&#xff0c;简介二&#xff0c;方案简述三&#xff0c;算法实现流程&#xff1a;3.1 闭运算提取背景&#xff1a;3.2 背景减除获取文字 四&#xff0c;整体代码&#xff1a;五&#xff0c;效果: 一&#xff0c;简介 图像阴影是光学现象的一种&#xff0c;当物体遮…

从文本到向量:Weaviate在RAG中的应用案例

探索向量数据库在RAG中的应用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;向量数据库如Weaviate正变得越来越流行&#xff0c;因为它们为文本数据的管理和检索提供了强大的支持。特别是&#xff0c;它们在实现Retrieval-Augmented Generation&#xff08;R…

无人机适航证取证技术详解

随着无人机技术的飞速发展和广泛应用&#xff0c;无人机的安全性与适航性成为了全球航空领域关注的焦点。无人机适航证作为衡量无人机是否符合安全飞行标准的重要凭证&#xff0c;其取证过程涉及技术、法规、测试等多个方面。本文旨在深入解析无人机适航证取证技术&#xff0c;…

算法的学习笔记—顺时针打印矩阵(牛客JZ29)

&#x1f600;前言 在算法的学习过程中&#xff0c;二维数组的操作是一个非常重要的内容&#xff0c;其中顺时针打印矩阵是一个经典的问题。这个问题不仅考察我们对矩阵的理解&#xff0c;还要求我们具备较强的逻辑思维能力。本文将详细解析如何通过Java代码来实现这一功能。 &…

SpringBoot响应式编程(3)R2DBC

一、概述 1.1简介 R2DBC基于Reactive Streams反应流规范&#xff0c;它是一个开放的规范&#xff0c;为驱动程序供应商和使用方提供接口&#xff08;r2dbc-spi&#xff09;&#xff0c;与JDBC的阻塞特性不同&#xff0c;它提供了完全反应式的非阻塞API与关系型数据库交互。 …

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

目录 前言&#xff1a; 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…

AIoT智能物联网平台定义

随着科技的飞速发展&#xff0c;我们正步入一个由智能设备和互联网络构成的新时代。AIoT&#xff0c;即人工智能物联网&#xff08;Artificial Intelligence of Things&#xff09;&#xff0c;是这个时代的标志性产物。本文旨在探讨AIoT智能物联网平台的定义、核心组件、应用场…

wordpress站群搭建6外部库的引入和测试

wordpress站群搭建6wordpress外部库的引入和测试 本次目标我们主要讲解引入wordpress外部库并测试。 我们将一些外部库和工具包放入到pkg项目&#xff0c;方便其他项目引用。 1.安装go-wordpress库 进入到pkg项目 go get github.com/robbiet480/go-wordpress2.编写工具类 …

22 交换机双工模式

交换机双工模式 一、双工模式 &#xff08;一&#xff09;单工、半双工、全双 ​ 单工&#xff1a; ​ 只有一个信道&#xff0c;传输方向只能是单向的 ​ 半双工&#xff1a; ​ 只有一个信道&#xff0c;在同一时刻&#xff0c;只能是单向传输 ​ 全双工&#xff1a; …