基于python脚本实现的打砖块小游戏

news2025/3/27 5:55:58

目录

1. 打砖块游戏

2. 初始化 Pygame 和设置屏幕

3. 定义游戏对象

3.1 定义玩家操作的paddle

3.2 定义球(Ball)

3.3 砖块(Bricks)

4. 游戏主循环

4.1 事件处理

4.2 板子移动

4.3 球移动和碰撞检测

4.4 绘制游戏对象

4.5 退出游戏

5. 完整代码


1. 打砖块游戏

打砖块(Breakout)是一个经典的街机游戏

玩家通过控制一个板子来反弹球,击碎屏幕上的砖块

下面是一个使用 pygame 实现的简单打砖块游戏的代码示例。

代码说明

  1. 板子:玩家通过左右箭头键控制板子的移动。

  2. :球会在屏幕上反弹,当球碰到板子、墙壁或砖块时会改变方向。

  3. 砖块:砖块被球击中后会消失。

  4. 游戏结束:当球掉出屏幕底部时,游戏结束。

运行游戏

将上述代码保存为一个 Python 文件(例如 breakout.py),然后运行它即可开始游戏。

2. 初始化 Pygame 和设置屏幕

import pygame
import random

# 初始化pygame
pygame.init()

# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# 颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
COLORS = [RED, GREEN, BLUE]  # 砖块颜色列表

# 创建屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块")

代码模块:

  • pygame.init():初始化 Pygame 库,这是使用 Pygame 的必要步骤。

  • SCREEN_WIDTH 和 SCREEN_HEIGHT:定义游戏窗口的宽度和高度。

  • 颜色常量:定义一些常用的颜色(如白色、红色、绿色等),方便后续使用。

  • pygame.display.set_mode():创建游戏窗口,大小为 SCREEN_WIDTH x SCREEN_HEIGHT

  • pygame.display.set_caption():设置窗口标题为“打砖块”。

3. 定义游戏对象

3.1 定义玩家操作的paddle

# 板子
paddle_width = 100
paddle_height = 20
paddle_x = (SCREEN_WIDTH - paddle_width) // 2
paddle_y = SCREEN_HEIGHT - 50
paddle_speed = 10
  • paddle_width 和 paddle_height:定义板子的宽度和高度。

  • paddle_x 和 paddle_y:定义板子的初始位置,使其居中并靠近屏幕底部。

  • paddle_speed:定义板子的移动速度。

3.2 定义球(Ball)

# 球
ball_radius = 10
ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2
ball_speed_x = 5
ball_speed_y = -5
  • ball_radius:定义球的半径。

  • ball_x 和 ball_y:定义球的初始位置,使其位于屏幕中央。

  • ball_speed_x 和 ball_speed_y:定义球在水平和垂直方向上的速度。

3.3 砖块(Bricks)

# 砖块
brick_width = 75
brick_height = 30
brick_rows = 5
brick_cols = SCREEN_WIDTH // brick_width

def generate_bricks():
    """随机生成砖块"""
    bricks = []
    for row in range(brick_rows):
        for col in range(brick_cols):
            # 随机决定是否生成砖块
            if random.random() > 0.3:  # 70% 的概率生成砖块
                brick_x = col * brick_width
                brick_y = row * brick_height + 50
                brick_color = random.choice(COLORS)  # 随机选择颜色
                bricks.append((pygame.Rect(brick_x, brick_y, brick_width, brick_height), brick_color))
    return bricks

# 初始化砖块
bricks = generate_bricks()
  • brick_width 和 brick_height:定义砖块的宽度和高度。

  • brick_rows 和 brick_cols:定义砖块的行数和列数。

  • generate_bricks() 函数

    • 随机生成砖块,每个砖块有 70% 的概率生成。

    • 砖块的颜色从 COLORS 列表中随机选择。

    • 砖块的位置通过 row 和 col 计算得出。

    • 砖块存储为一个元组 (pygame.Rect, color),其中 pygame.Rect 表示砖块的位置和大小,color 表示砖块的颜色。

  • bricks:调用 generate_bricks() 函数生成初始砖块。

4. 游戏主循环

4.1 事件处理

# 游戏循环
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
  • pygame.event.get():获取所有的事件(如按键、鼠标点击等)。

  • event.type == pygame.QUIT:如果用户点击关闭按钮,则退出游戏。

4.2 板子移动

    # 移动板子
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle_x > 0:
        paddle_x -= paddle_speed
    if keys[pygame.K_RIGHT] and paddle_x < SCREEN_WIDTH - paddle_width:
        paddle_x += paddle_speed
  • pygame.key.get_pressed():获取当前按下的键。

  • K_LEFT 和 K_RIGHT:如果按下左箭头或右箭头键,则移动板子。

  • 边界检测:确保板子不会移出屏幕。

4.3 球移动和碰撞检测

    # 移动球
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 球与墙的碰撞检测
    if ball_x <= 0 or ball_x >= SCREEN_WIDTH:
        ball_speed_x = -ball_speed_x
    if ball_y <= 0:
        ball_speed_y = -ball_speed_y

    # 球与板子的碰撞检测
    if (paddle_x < ball_x < paddle_x + paddle_width) and (paddle_y < ball_y + ball_radius < paddle_y + paddle_height):
        ball_speed_y = -ball_speed_y

    # 球与砖块的碰撞检测
    for brick, color in bricks[:]:
        if brick.collidepoint(ball_x, ball_y):
            bricks.remove((brick, color))
            ball_speed_y = -ball_speed_y
            break

    # 球掉出屏幕
    if ball_y > SCREEN_HEIGHT:
        running = False
  • 球移动:更新球的位置。

  • 墙的碰撞检测

    • 如果球碰到左右墙壁,则水平速度反向。

    • 如果球碰到顶部墙壁,则垂直速度反向。

  • 板子的碰撞检测

    • 如果球碰到板子,则垂直速度反向。

  • 砖块的碰撞检测

    • 如果球碰到砖块,则移除砖块并反向垂直速度。

  • 球掉出屏幕:如果球掉出屏幕底部,则游戏结束。

4.4 绘制游戏对象

    # 清屏
    screen.fill(BLACK)

    # 绘制板子
    pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, paddle_width, paddle_height))

    # 绘制球
    pygame.draw.circle(screen, RED, (ball_x, ball_y), ball_radius)

    # 绘制砖块
    for brick, color in bricks:
        pygame.draw.rect(screen, color, brick)

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

    # 控制帧率
    clock.tick(60)
  • screen.fill(BLACK):清屏,用黑色填充背景。

  • pygame.draw.rect():绘制板子和砖块。

  • pygame.draw.circle():绘制球。

  • pygame.display.flip():更新屏幕显示。

  • clock.tick(60):控制游戏帧率为 60 FPS。

4.5 退出游戏

# 退出游戏
pygame.quit()
  • pygame.quit():退出 Pygame,释放资源。

5. 完整代码

这个打砖块游戏的代码分为以下几个部分:

  1. 初始化:设置屏幕、颜色和游戏对象(板子、球、砖块)。

  2. 砖块生成:随机生成砖块,增加游戏的多样性。

  3. 游戏主循环:处理事件、更新游戏状态、检测碰撞、绘制游戏对象。

  4. 退出游戏:释放资源。

import pygame
import random

# 初始化pygame
pygame.init()

# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# 颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
COLORS = [RED, GREEN, BLUE]  # 砖块颜色列表

# 创建屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块")

# 板子
paddle_width = 100
paddle_height = 20
paddle_x = (SCREEN_WIDTH - paddle_width) // 2
paddle_y = SCREEN_HEIGHT - 50
paddle_speed = 10

# 球
ball_radius = 10
ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2
ball_speed_x = 5
ball_speed_y = -5

# 砖块
brick_width = 75
brick_height = 30
brick_rows = 5
brick_cols = SCREEN_WIDTH // brick_width

def generate_bricks():
    """随机生成砖块"""
    bricks = []
    for row in range(brick_rows):
        for col in range(brick_cols):
            # 随机决定是否生成砖块
            if random.random() > 0.3:  # 70% 的概率生成砖块
                brick_x = col * brick_width
                brick_y = row * brick_height + 50
                brick_color = random.choice(COLORS)  # 随机选择颜色
                bricks.append((pygame.Rect(brick_x, brick_y, brick_width, brick_height), brick_color))
    return bricks

# 初始化砖块
bricks = generate_bricks()

# 游戏循环
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 移动板子
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle_x > 0:
        paddle_x -= paddle_speed
    if keys[pygame.K_RIGHT] and paddle_x < SCREEN_WIDTH - paddle_width:
        paddle_x += paddle_speed

    # 移动球
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 球与墙的碰撞检测
    if ball_x <= 0 or ball_x >= SCREEN_WIDTH:
        ball_speed_x = -ball_speed_x
    if ball_y <= 0:
        ball_speed_y = -ball_speed_y

    # 球与板子的碰撞检测
    if (paddle_x < ball_x < paddle_x + paddle_width) and (paddle_y < ball_y + ball_radius < paddle_y + paddle_height):
        ball_speed_y = -ball_speed_y

    # 球与砖块的碰撞检测
    for brick, color in bricks[:]:
        if brick.collidepoint(ball_x, ball_y):
            bricks.remove((brick, color))
            ball_speed_y = -ball_speed_y
            break

    # 球掉出屏幕
    if ball_y > SCREEN_HEIGHT:
        running = False

    # 清屏
    screen.fill(BLACK)

    # 绘制板子
    pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, paddle_width, paddle_height))

    # 绘制球
    pygame.draw.circle(screen, RED, (ball_x, ball_y), ball_radius)

    # 绘制砖块
    for brick, color in bricks:
        pygame.draw.rect(screen, color, brick)

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

    # 控制帧率
    clock.tick(60)

# 退出游戏
pygame.quit()

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

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

相关文章

地理信息系统(GIS)在智慧城市中的40个应用场景案例

在智慧城市发展进程中&#xff0c;地理信息系统&#xff08;GIS&#xff09;作为关键技术之一&#xff0c;正扮演着不可或缺的角色&#xff0c;堪称智慧城市的神经中枢。通过空间数据分析优化城市管理&#xff0c;GIS技术为智慧城市的构建提供了强大的支持。 本文分享了GIS在智…

XSS Game(DOM型) 靶场 通关

目录 靶场网址 Ma Spaghet! 分析 解题 Jefff 分析 解题 方法一 方法二 Ugandan Knuckles 分析 解题 Ricardo Milos 分析 解题 Ah Thats Hawt 分析 解题 方法一 方法二 Ligma 分析 解题 ​ Mafia 分析 解题 方法一&#xff1a;构造函数 方法二&#xf…

【大模型基础_毛玉仁】3.5 Prompt相关应用

目录 3.5 相关应用3.5.1 基于大语言模型的Agent3.5.2 数据合成3.5.3 Text-to-SQL3.5.4 GPTs 3.5 相关应用 Prompt工程应用广泛&#xff0c;能提升大语言模型处理基础及复杂任务的能力&#xff0c;在构建Agent、数据合成、Text-to-SQL转换和设计个性化GPTs等方面不可或缺。 . …

deepseek搭建本地私有知识库dify安装介绍docker compose图文教程

按照官方介绍&#xff0c;打开教程安装。下载源码&#xff0c; # 假设当前最新版本为 0.15.3 git clone https://github.com/langgenius/dify.git --branch 0.15.3 进入docker目录&#xff0c; cd dify/docker 网络科学的直接执行命令就可以了。 docker compose up -d 镜…

右击没有Word、PPT、Excel功能

右击没有Word、PPT、Excel功能 导航 文章目录 右击没有Word、PPT、Excel功能导航一、问题描述二、事情经过三、解决方案其他思路分享 一、问题描述 ​ 在安装并激活了office之后&#xff0c;业务反馈右击没有出现新建Word功能&#xff0c;仅有Word文档 二、事情经过 ​ 按道…

DeepSeek R1 本地部署指南 (6) - Windows 本地部署使用 GPU 运行

DeepSeek R1 本地部署指南 (1) - Windows 本地部署 上一篇&#xff0c;安装好 Windows 本地步骤后&#xff0c;如果发现在任务管理器中 GPU 显示 0%。 1.在命令行中输入&#xff1a; ollama ps 显示&#xff1a; PROCESSOR CPU 2.安装 CUDA Toolkit CUDA Toolkit Downloads htt…

婚姻的解构与重构 | 一场关于选择与责任的探索

注&#xff1a;本文为 “婚姻的解构与重构” 相关文章合辑。 未整理。 明明渴望爱情 为何反感催婚&#xff1f; 原创 常 晋 人民日报评论 2024 年 04 月 22 日 12:29 北京 没有催促指责&#xff0c;也毫无批评之意。面对单身、失业的 30 岁女儿&#xff0c;只是鼓励孩子&…

jangow靶机攻略

配置网卡 VMware需要配置&#xff0c;不配置扫不到ip,VirtualBox正常打开ip会直接显示出来 网卡配置都改成NAT 打开虚拟机&#xff0c;第一个框选第二行&#xff0c;回车 选第二个&#xff0c;按e键 进入下一个框后&#xff0c;将ro 后面的修改为 rw signin init/bin/bash 按…

自动化测试框架维护成本高怎么办

自动化测试框架维护成本高&#xff0c;可以通过优化测试用例设计、引入持续集成&#xff08;CI&#xff09;策略、强化代码规范和审查机制、建立明确的维护计划、定期进行技术债务清理等方式来降低成本。 其中&#xff0c;优化测试用例设计尤其关键&#xff0c;它不仅能提高测试…

日事清在敏捷开发中的实战应用:SCRUM框架下可视化项目管理+高效沟通机制驱动灵活迭代

一、行业背景 在快速发展的互联网行业中&#xff0c;软件开发模式经历了显著的演变。传统的瀑布式开发模式&#xff0c;以其线性和阶段性的特点&#xff0c;曾长期占据主导地位。然而&#xff0c;随着市场对软件迭代速度和灵活性的要求日益提高&#xff0c;敏捷开发模式应运而…

Buildroot 增加系统启动项并解决后台无法获取输入(串口)

Buildroot 增加自启动项 概述增加模块源码结构编写测试程序编译测试增加系统自启动一个问题解决方案&#xff1a;显式指定输入设备 其他/etc/init.d 目录下的 SXXxxx 文件作用解析‌ 概述 Buildroot 是一款轻量级、高度可定制的开源工具集&#xff0c;专为嵌入式系统打造。它通…

数据库取证分析

目录 一.多表关联 1.一对多联结 2.子查询 二.数据库示例分析 1.多表关联 三.选择SQL分析的原因 四.数据库概述 五.SQL语言 一.多表关联 1.一对多联结 2.子查询 二.数据库示例分析 1.多表关联 三.选择SQL分析的原因 四.数据库概述 五.SQL语言 1.select 字段

【深度技术揭秘】 Android SystemUI锁屏界面动态布局重构:横竖屏智能适配指南

1. 问题背景与需求拆解 在Android 13系统定制中&#xff0c;发现平板横屏锁屏界面存在两大视觉问题&#xff1a; 时钟控件尺寸过大&#xff0c;与竖屏样式不统一 解锁图标位置异常&#xff0c;横向居中而非顶部居中&#xff08;如图示&#xff09; 需实现&#xff1a; 横竖屏…

制作PaddleOCR/PaddleHub的Docker镜像

背景 在落地RAG知识库过程中&#xff0c;遇到了图文识别、图片表格内容识别的需求。但那时&#xff08;2024年4月&#xff09;各开源RAG项目还没有集成成熟的解决方案&#xff0c;经调研我选择了百度开源的PaddleOCR。支持国产&#xff01; 概念梳理 PaddleOCR 百度飞桨的OCR…

Ubuntu部署Docker搭建靶场

前言 我们需要部署Docker来搭建靶场题目&#xff0c;他可以提供一个隔离的环境&#xff0c;方便在不同的机器上部署&#xff0c;接下来&#xff0c;我会记录我的操作过程&#xff0c;简单的部署一道题目 Docker安装 不推荐在物理机上部署&#xff0c;可能会遇到一些问题&…

【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜

本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. &#x1f40e;文章专栏: DFS &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…

搭建Redis主从集群

主从集群说明 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从结构 这是一个简单的Redis主从集群结构 集群中有一个master节点、两个slave节点&#xff08;现在叫replica&#xff09;…

WSL2增加memory问题

我装的是Ubuntu24-04版本&#xff0c;所有的WSL2子系统默认memory为主存的一半&#xff08;我的电脑是16GB&#xff0c;wsl是8GB&#xff09;&#xff0c;可以通过命令查看&#xff1a; free -h #查看ubuntu的memory和swap &#xff08;改过的11GB&#xff09; 前几天由于配置E…

git 合并多次提交 commit

在工作中&#xff0c;有时候在反复修改代码中&#xff08;比如处理MR的检视意见&#xff0c;或者为了推送到测试环境&#xff0c;先 commit到自己的远程分支上&#xff09;不免会有多次 commit&#xff0c;这样发起 MR 的时候&#xff0c;就会有一堆 commit 信息&#xff0c;看…

如何分析和解决服务器的僵尸进程问题

### 如何分析和解决服务器的僵尸进程问题 #### **一、僵尸进程的定义与影响** **僵尸进程&#xff08;Zombie Process&#xff09;** 是已终止但未被父进程回收资源的进程。其特点&#xff1a; - **状态标识**&#xff1a;在进程列表&#xff08;如 ps 或 top&#xff09;中标…