Python实现打砖块游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待!

在本文中,我们将使用 Pygame 和 Tkinter 创建一个简单的打砖块游戏。游戏的目标是通过控制挡板来击碎屏幕上的砖块,同时避免小球掉落到屏幕底部。游戏包含了一些额外的功能,比如吃到掉落的筛子可以增加得分或者生成新的小球。 

玩法:移动鼠标接住小球即可。

目录

一、准备工作 

二、初始化游戏环境 

三、定义游戏元素类 

四、初始化游戏元素

五、游戏主循环 

六、结束游戏

七、完整代码

八、进阶版游戏


一、准备工作 

首先,我们需要导入必要的库。在这个游戏中,我们将使用 Pygame 来创建游戏窗口和处理游戏逻辑,同时使用 Tkinter 来显示游戏结束时的消息框。

import pygame
import random
import sys
import tkinter as tk
from tkinter import messagebox

二、初始化游戏环境 

接下来,我们需要初始化 Pygame 并设置游戏窗口的大小和标题。

pygame.init()
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块游戏")

三、定义游戏元素类 

class Paddle(pygame.sprite.Sprite):
    # 挡板类

class Ball(pygame.sprite.Sprite):
    # 小球类

class Brick(pygame.sprite.Sprite):
    # 砖块类

四、初始化游戏元素

我们需要创建挡板、小球和砖块,并将它们添加到游戏中。

paddle = Paddle()
balls = [Ball()]
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls)

bricks = pygame.sprite.Group()
# 创建砖块对象并添加到精灵组中

五、游戏主循环 

游戏主循环中包含了游戏的逻辑,包括事件处理、元素更新、碰撞检测、绘制等。

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    # 游戏逻辑
    all_sprites.update()
    # 碰撞检测
    # 绘制
    pygame.display.flip()
    clock.tick(60)

六、结束游戏

游戏结束时,我们弹出一个消息框显示得分,并询问玩家是否想要重试游戏。

root = tk.Tk()
root.withdraw()
messagebox.showinfo("游戏结束", "游戏结束,您的得分:" + str(score))
if messagebox.askyesno("重试?", "你想重试吗?"):
    # 重置游戏
else:
    running = False

七、完整代码

素材联系博主提供!

import pygame
import random
import sys
import tkinter as tk
from tkinter import messagebox

# 初始化 Pygame
pygame.init()

# 游戏窗口大小
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 600

# 颜色定义
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# 定义挡板类
class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface([100, 10])
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = (SCREEN_WIDTH - self.rect.width) // 2
        self.rect.y = SCREEN_HEIGHT - 20

    def update(self):
        pos = pygame.mouse.get_pos()
        self.rect.x = pos[0]
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.x > SCREEN_WIDTH - self.rect.width:
            self.rect.x = SCREEN_WIDTH - self.rect.width

# 定义小球类
class Ball(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface([20, 20])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.x = SCREEN_WIDTH // 2
        self.rect.y = SCREEN_HEIGHT // 2
        self.speed_x = random.choice([-5, 5])
        self.speed_y = -5

    def update(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        # 碰到墙壁反弹
        if self.rect.x <= 0 or self.rect.x >= SCREEN_WIDTH - self.rect.width:
            self.speed_x = -self.speed_x
        if self.rect.y <= 0:
            self.speed_y = -self.speed_y

# 定义砖块类
class Brick(pygame.sprite.Sprite):
    def __init__(self, color, width, height):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()

# 初始化游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块游戏")

# 加载背景图
background = pygame.image.load('23.jpg')

# 创建挡板和小球对象
paddle = Paddle()
balls = [Ball()]  # 创建一个小球列表
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls)  # 将小球列表添加到精灵组

# 定义颜色列表
colors = [(255, 0, 0),  # 红色
          (255, 165, 0),  # 橙色
          (255, 255, 0),  # 黄色
          (0, 128, 0),  # 绿色
          (0, 0, 255),  # 蓝色
          (75, 0, 130),  # 靛色
          (238, 130, 238)]  # 紫色
# 创建砖块对象
bricks = pygame.sprite.Group()
for row in range(6):
    for column in range(10):
        color = colors[row % len(colors)]  # 从颜色列表中选择颜色
        brick = Brick(color, 60, 20)
        brick.rect.x = column * (brick.rect.width + 5) + 30
        brick.rect.y = row * (brick.rect.height + 5) + 50
        bricks.add(brick)
        all_sprites.add(brick)

# 游戏主循环
clock = pygame.time.Clock()
running = True
score = 0
falling_dice = False
falling_dice_speed = 5
falling_dice_value = 1
falling_dice_x = 0
falling_dice_y = 0

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

    # 游戏逻辑
    all_sprites.update()

    # 碰撞检测
    for ball in balls:  # 遍历小球列表
        hits = pygame.sprite.spritecollide(ball, bricks, True)
        for brick in hits:
            score += 1
            ball.speed_y = -ball.speed_y

        # 小球与挡板的碰撞检测
        if pygame.sprite.collide_rect(ball, paddle):
            ball.speed_y = -ball.speed_y
            if ball.rect.y > paddle.rect.y:  # 只有当小球在挡板上方时才会反弹
                ball.speed_x = -ball.speed_x  # 反弹后小球的横向速度取反

    if not bricks:
        running = False
        root = tk.Tk()
        root.withdraw()
        messagebox.showinfo("恭喜", "恭喜您已经通过,您的得分:" + str(score))
        if messagebox.askyesno("再来一次?", "你想再玩一次吗?"):
            # 重置游戏
            balls = [Ball()]
            all_sprites = pygame.sprite.Group()
            all_sprites.add(paddle, *balls)
            bricks = pygame.sprite.Group()
            for row in range(6):
                for column in range(10):
                    brick = Brick(RED, 60, 20)
                    brick.rect.x = column * (brick.rect.width + 5) + 30
                    brick.rect.y = row * (brick.rect.height + 5) + 50
                    bricks.add(brick)
                    all_sprites.add(brick)
            score = 0
            running = True
        else:
            running = False

    # 生成掉落的筛子
    if not falling_dice:
        if random.randint(1, 1000) == 1:
            falling_dice = True
            falling_dice_value = random.randint(1, 6)
            falling_dice_x = random.randint(0, SCREEN_WIDTH - 20)
            falling_dice_y = 0

    # 移动掉落的筛子
    if falling_dice:
        falling_dice_y += falling_dice_speed
        if falling_dice_y > SCREEN_HEIGHT:
            falling_dice = False
        elif paddle.rect.colliderect(pygame.Rect(falling_dice_x, falling_dice_y, 20, 20)):
            score *= falling_dice_value
            falling_dice = False
            # 吃到筛子生成新的小球
            new_ball = Ball()
            balls.append(new_ball)  # 将新的小球添加到小球列表
            all_sprites.add(new_ball)

    # 小球掉出底部,游戏结束
    for ball in balls:  # 遍历小球列表
        if ball.rect.y > SCREEN_HEIGHT:
            balls.remove(ball)  # 如果小球掉出底部,从小球列表中移除
            all_sprites.remove(ball)  # 从精灵组中移除
    if len(balls) == 0:  # 如果小球列表为空,即所有的小球都掉出底部,游戏结束
        running = False
        root = tk.Tk()
        root.withdraw()
        messagebox.showinfo("游戏结束", "游戏结束,您的得分:" + str(score))
        if messagebox.askyesno("重试?", "你想重试吗?"):
            # 重置游戏
            balls = [Ball()]
            all_sprites = pygame.sprite.Group()
            all_sprites.add(paddle, *balls)
            bricks = pygame.sprite.Group()
            for row in range(6):
                for column in range(10):
                    color = colors[row % len(colors)]  # 从颜色列表中选择颜色
                    brick = Brick(color, 60, 20)
                    brick.rect.x = column * (brick.rect.width + 5) + 30
                    brick.rect.y = row * (brick.rect.height + 5) + 50
                    bricks.add(brick)
                    all_sprites.add(brick)
            score = 0
            running = True
        else:
            running = False

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

    # 绘制
    all_sprites.draw(screen)

    # 绘制得分
    font = pygame.font.Font(None, 36)
    text = font.render("Score: " + str(score), True, RED)
    screen.blit(text, [10, 10])

    # 绘制掉落的筛子
    if falling_dice:
        pygame.draw.rect(screen, GREEN, [falling_dice_x, falling_dice_y, 20, 20])

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

pygame.quit()
sys.exit()

八、进阶版游戏

以上只是个功能基础版本游戏,高阶打砖块游戏可以联系博主进行购买!包售后,主打就是诚信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PTQ4SAM、Mamba-Attention、AniTalker、IceFormer、U-DiTs、CogDPM

本文首发于公众号&#xff1a;机器感知 PTQ4SAM、Mamba-Attention、AniTalker、IceFormer、U-DiTs、CogDPM PTQ4SAM: Post-Training Quantization for Segment Anything Segment Anything Model (SAM) has achieved impressive performance in many computer vision tasks. Ho…

华为机考入门python3--(23)牛客23- 删除字符串中出现次数最少的字符

分类&#xff1a;字符串 知识点&#xff1a; 访问字典中keychar的值&#xff0c;不存在则返回0 my_dict.get(char, 0) 字典的所有值 my_dict.value() 列表中的最小值 min(my_list) 题目来自【牛客】 import sysdef delete_min_freq_char(s):# 计算字母出现的频次…

套管外径测量仪 多尺寸型号 规格全可定制

套管&#xff08;bushing&#xff09;是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管&#xff0c;后者称为穿墙套管。套管通常用在建筑地下室&#xff0c;是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

鸿蒙OpenHarmony实战开发-MiniCanvas

介绍 基于OpenHarmony的Cavas组件封装了一版极简操作的MiniCanvas&#xff0c;屏蔽了原有Canvas内部复杂的调用流程&#xff0c;支持一个API就可以实现相应的绘制能力&#xff0c;该库还在继续完善中&#xff0c;也欢迎PR。 使用说明 1.添加MiniCanvas依赖 在项目entry目录…

07 - 步骤 javaScript代码

简介 JavaScript 代码是通过 JavaScript 脚本步骤来执行 JavaScript 脚本的一种方式。这允许用户在 Kettle 的数据流程中使用 JavaScript 编写自定义的脚本逻辑&#xff0c;用于数据处理、转换、计算等操作。 使用 场景 我需要在数据流加一个字段 createTime 当前时间&…

【嵌入式DIY实例】-基于GSM的远程灌溉系统

基于GSM的远程灌溉系统 文章目录 基于GSM的远程灌溉系统1、硬件准备与接线2、软件准备3、代码实现本文将详细介绍如何搭建通过使用手机实现对灌溉系统的远程控制。该系统利用全球移动通信系统(GSM)技术在灌溉系统和移动电话之间建立通信。该系统建立在流行的开源微控制器平台…

Linux 进程间通信之共享内存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; ​ 目录 ​编辑​ 前言 共享内存直接原理…

使用双指针解决问题题集(二)

1. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 题解&a…

zabbix监控方式(zabbix-trapper)

中文&#xff1a;zabbix采集器&#xff0c;即zabbix sender 。 Zabbix-Trapper 监控方式可以一次批量发送数据给Zabbix Server&#xff0c;与主动模式不同&#xff0c;Zabbix-Trapper 可以让用户控制数据的发送&#xff0c;而不用Zabbix-Agent进程控制&#xff0c;这意味着可以…

Angular中的管道(Pipe)

Angular中的管道(Pipe) 文章目录 Angular中的管道(Pipe)前言一、内置管道1. date管道格式化日期2. currency管道格式化货币3. uppercase和lowercase管道转换字符串大小写4. 小数位数5. JavaScript 对象序列化6. slice7. 管道链 二、自定义管道 前言 Angular中的管道&#xff0…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法&#xff0c;通过边界索引确定中间索引&#xff0c;判断中间索引处的元素值和目标值的大小&#xff0c;来不断缩小查找区间。使用二分查找有如下一些限制&#…

ASP.NET通用作业批改系统设计

摘  要 该系统采用B/S结构&#xff0c;以浏览器方式登陆系统&#xff0c;用ASP.NET作为开发语言&#xff0c;数据库则使用Microsoft SQL Server 2000实现。《通用作业批改系统》包括了学生子系统、教师子系统、管理员子系统三大模块&#xff0c;该系统主要完成学生&#xff…

LibTorch入坑记--续2

一、安装faiss 我的faiss&#xff0c;用的是曾经安装过的 pip install faiss-gpu1.7 当时搞得环境名称是pni 二、配置环境 三、例子代码 #include <faiss/IndexFlat.h> #include <faiss/Index.h> #include <faiss/VectorTransform.h> #include <faiss/…

Mybatis进阶4-权限管理

权限管理 1.权限 //相当于 职责 2.用户 //相当于 职员&#xff08;职员就职于一个职位&#xff09; 3.角色 //相当于 职位&#xff08;有多个职责&#xff09; 权限管理基础表&#xff1a;权限表&#xff0c;用户表&#xff0c;角色表 问题1&#xff1a;…

SVM直观理解

https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机&#xff08;英语&#xff1a;su…

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…

Error Code: 1449. The user specified as a definer (‘admin‘@‘%‘) does not exist

前言 在进行MySQL数据库迁移或存储过程部署时&#xff0c;您可能会遇到错误 [Err] 1449 - The user specified as a definer (admin%) does not exist。这篇文章将为您提供一个详细的解决方案&#xff0c;帮助您顺利解决这一问题。 错误背景 此错误通常发生在尝试执行一个存…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

机器学习算法--朴素贝叶斯(Naive Bayes)

一、实验环境 1. python3.7 2. numpy > 1.16.4 3. sklearn > 0.23.1 二、朴素贝叶斯的介绍 朴素贝叶斯算法&#xff08;Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。NB模型所需估计的参数很少&#xff0c;对缺…

【微服务】网关(详细知识以及登录验证)

微服务网关 网关网关路由快速入门路由属性 路由断言网关登录校验自定义过滤器实现登录校验网关传递用户OpenFeign传递用户 网关 网络的关口&#xff0c;负责请求的路由&#xff0c;转发&#xff0c;身份校验 当我们把一个单体项目分成多个微服务并部署在多台服务器中&#xff…