Python实现打砖块游戏

news2024/12/23 14:20:36

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

在本文中,我们将使用 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()

八、进阶版游戏

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

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

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

相关文章

GDPU 天码行空11

&#xff08;一&#xff09;实验目的 1、掌握JAVA中IO中各种类及其构造方法&#xff1b; 2、重点掌握IO中类所具有的IO操作方法&#xff1b; 3、熟悉软件中登录模块的开发方法&#xff1b; 4、掌握IO中读写常用方法。 5、进一步熟悉正则规则的使用方法。 &#xff08;二&…

猫咪没精神不吃饭?这招主食冻干喂养教你让猫咪恢复食欲

猫突然不吃东西没精神是生病了吗&#xff1f;当猫咪不吃东西、精神不振时&#xff0c;可能的原因有健康问题、环境因素或食物原因。首先应进行身体检查&#xff0c;观察是否有其他并发症&#xff0c;如无则可排除健康问题。还要给猫咪提供一个舒适的环境&#xff0c;多给它们一…

企业终端安全管理软件有哪些?终端安全管理软件哪个好?

终端安全的重要性大家众所周知&#xff0c;关系到生死存亡的东西。 各类终端安全管理软件应运而生&#xff0c;为企业提供全方位、多层次的终端防护。 有哪些企业终端安全管理软件&#xff1f; 一、主流企业终端安全管理软件 1. 域智盾 域智盾是一款专为企业打造的全面终端…

Windows使用Miniconda3安装python、环境配置以及conda常用命令

Windows使用Miniconda3安装python以及conda常用命令 这是学习使用python的第一篇文章&#xff0c;这将是一个关于python学习和使用的一个系列文章的开始&#xff0c;有兴趣的可以给个关注持续获取更新内容。 Miniconda3是什么&#xff1f; Miniconda3是一个轻量级的Anaconda发…

创建操作手册知识库的终极指南

在繁忙的工作中&#xff0c;有一个方便好用的操作手册知识库能帮我们节省大量时间&#xff0c;避免走弯路。那么&#xff0c;如何创建这样一个知识库呢&#xff1f;下面就给大家讲解一下简单易学的创建步骤。 一、明确目标与需求 在创建操作手册知识库之前&#xff0c;首先要明…

快速修复vcruntime140_1.dll丢失问题,多个亲测有效的方法分享

vcruntime140_1.dll 是Microsoft Visual C Redistributable包中的一个关键动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它对于运行基于Visual C开发的应用程序至关重要。此文件属于运行时组件&#xff0c;为应用程序提供必要的运行时支持&#xff…

35.Docker-数据卷,目录挂载

注意&#xff1a;在容器内修改文件是不推荐的。 1.修改不方便&#xff0c;比如vi命令都无法使用。 2.容器内修改&#xff0c;没有日志记录的。 问题&#xff1a;那应该如何修改容器中的文件呢&#xff1f; 数据卷 volume是一个虚拟目录&#xff0c;指向宿主机文件系统中的…

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…

【负载均衡式在线OJ项目day1】项目结构

一.功能 查看题目列表&#xff0c;在线编程&#xff0c;判题功能&#xff0c;即leetcode的部分功能 二.宏观结构 整个项目是BS模式&#xff0c;客户端是浏览器&#xff0c;和用户交互并向服务器发起请求。 服务端从功能上来说分为两个模块&#xff0c;第一个是OJServer&…

做抖音小店需要注意什么?这几点很多人不知道,看完防踩坑

大家好&#xff0c;我是电商笨笨熊 抖音小店虽然推出了一段时间&#xff0c;但是依旧有新手玩家陆陆续续加入其中&#xff1b; 对于很多新手来说&#xff0c;只看到了其中红利&#xff0c;但却没有看到其中包含的一些运营小细节&#xff0c;且这些细节决定你店铺未来发展&…

Summer ‘24来啦!15个最热门的功能抢先看!

Salesforce Summer 24即将发布&#xff01;本篇文章我们将深入了解Summer 24最热门的声明性功能。 01 自动化Lightning应用程序 新的自动化Lightning应用程序中包含所有与自动化相关的内容。访问该应用程序的用户可以在主应用程序中看到Flow、错误信息和其他基于社区的链接。…

mysql的数据结构及索引使用情形

先来说下数据的一般存储方式&#xff1a;内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式&#xff1a;速度 旋转&#xff0c;磁盘页的概念&#xff1a;每一页大概16KB。 1、存储结构 哈希 是通过hash函数计算出一个hash值的&#xff0c;哈希的优点就是查找的时间复杂度…

重新规划路线

题目链接 重新规划路线 题目描述 注意点 题目数据 保证 每个城市在重新规划路线方向后都能到达城市 02 < n < 5 * 10^4connections.length n-1connections[i].length 20 < connections[i][0], connections[i][1] < n-1connections[i][0] ! connections[i][1] …

[leetcode]Z 字形变换

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;int c (n t - 1) / t * (r - 1);vector<string> mat(r, string(c, 0)…

Spring框架学习笔记(一):Spring基本介绍(包含容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…

ISIS的工作原理

1.邻居关系建立 &#xff08;1&#xff09;IS-IS领接关系建立原则 1、通过将以太网接口模拟成点到点接口&#xff0c;可以建立点到点链路邻接关系。 2、当链路两端IS-IS接口的地址不在同一网段时&#xff0c;如果配置接口对接收的Hello报文不作IP地址检查&#xff0c;也可以建…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

【LeetCode刷题】410. 分割数组的最大值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 410. 分割数组的最大值 2. 题目描述 3. 解题方法 题目中提到的是某个和的最大值是最小的&#xff0c;这种题目是可以用二分来解决的。 确定区间&#xff0c;根据题目的数据范围&#xff0c;可以确定区间就是[0, 1e9]…

省份数量00

题目链接 省份数量 题目描述 注意点 1 < n < 200isConnected[i][j] 为 1 或 0isConnected[i][i] 1isConnected[i][j] isConnected[j][i] 解答思路 最初想到的是广度优先遍历&#xff0c;当某个城市不属于省份&#xff0c;需要从该城市开始&#xff0c;根据isConne…

直说了,你可能从没真正理解MPLS

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 尽管 MPLS 技术已经相当成熟&#xff0c;有关它的文章数不胜枚举&#xff0c;涵盖了从基本原理到 SR-MPLS 等…