Python 用pygame简简单单实现一个打砖块

#  -*- coding: utf-8 -*-
#  #
#  Copyright (C) 2024 , Inc. All Rights Reserved
#  #
#  @Time    : 2024/3/30 14:34
#  @Author  : 赫凯
#  @Email   : hekaiiii@163.com
#  @File    : ballgame.py
#  @Software: PyCharm
import math
import random

import pygame
import sys


# 球体类
class Ball:
    def __init__(self, radius):
        self.radius = radius
        self.pos = [screen_width // 2, screen_height - 20 - radius]
        self.velocity = [2, -2]

    def draw(self, surface):
        pygame.draw.circle(surface, WHITE, self.pos, self.radius)

    def update(self):
        self.pos[0] += self.velocity[0]
        self.pos[1] += self.velocity[1]
        # print(self.pos)
        # 碰到墙壁反弹
        # print(screen_width - self.radius)
        if self.pos[0] < self.radius or self.pos[0] > (screen_width - self.radius):
            # self.pos[0] = -self.pos[0]
            self.velocity[0] *= -1
            # if self.pos[0] < 0:
            #     self.pos[0] = -self.pos[0]

        # print(screen_height - self.radius)
        if self.pos[1] <= self.radius or self.pos[1] > (screen_height - self.radius):
            self.velocity[1] *= -1
            # if self.pos[1] < 0:
            #     self.pos[1] = -self.pos[1]


# 挡板类
class Paddle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.pos = [screen_width // 2 - width // 2, screen_height - 20]
        self.velocity = [-5, 0]

    def draw(self, surface):
        pygame.draw.rect(surface, WHITE, (self.pos[0], self.pos[1], self.width, self.height), 0, 0)

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.pos[0] > 0:
            self.pos[0] += self.velocity[0]
        if keys[pygame.K_RIGHT] and self.pos[0] < screen_width - self.width:
            self.pos[0] -= self.velocity[0]




class Brick:
    def __init__(self, x, y, width, height, color):
        self.rect = pygame.Rect(x, y, width, height)
        self.color = color

    def draw(self, surface):
        pygame.draw.rect(surface, self.color, self.rect)


def check_collision(ball, brick):
    # 检查球与砖块的左右边界碰撞
    if (brick.rect.x - ball.radius <= ball.pos[0] <= brick.rect.x + brick.rect.width + ball.radius) and (
            brick.rect.y <= ball.pos[1] <= brick.rect.y + brick.rect.height):
        return 1  # 返回1表示碰撞发生在砖块的左右边界
    # 检查球与砖块的上下边界碰撞
    if (brick.rect.y - ball.radius <= ball.pos[1] <= brick.rect.y + brick.rect.height + ball.radius) and (
            brick.rect.x <= ball.pos[0] <= brick.rect.x + brick.rect.width):
        return 2  # 返回2表示碰撞发生在砖块的上下边界

    return 0


def update_bricks(ball, bricks):
    score = 0
    for brick in bricks[:]:
        if check_collision(ball, brick) == 1:
            # 处理碰撞效果,比如删除砖块或改变球的方向
            bricks.remove(brick)
            ball.velocity[0] *= -1
            score += 10
            break
        elif check_collision(ball, brick) == 2:
            bricks.remove(brick)
            ball.velocity[1] *= -1
            score += 10
            break
            # 可能还需要更新分数或其他游戏状态
    return score




def create_explosion(brick):
    # 创建一个表示爆炸效果的对象或动画
    pass


def update_explosions(explosions, bricks):
    for explosion in explosions[:]:
        # 更新爆炸效果
        if explosion.is_finished():
            explosions.remove(explosion)
        # 如果爆炸与砖块碰撞,移除砖块
        if explosion.intersects(brick):
            bricks.remove(brick)


if __name__ == '__main__':
    # 初始化Pygame
    pygame.init()

    # 设置屏幕大小
    screen_width, screen_height = 640, 480
    screen = pygame.display.set_mode((screen_width, screen_height))

    # 设置标题和时钟
    pygame.display.set_caption('Bounce Game')
    clock = pygame.time.Clock()

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

    # 创建球体和挡板
    ball = Ball(10)
    paddle = Paddle(80, 10)

    # 创建砖块
    bricks = []
    for x in range(0, screen_width, 80):  # 假设每个砖块宽度为80像素
        for y in range(0, screen_height // 4, 20):  # 假设每个砖块高度为40像素
            brick = Brick(x + 2, y + 2, 80 - 2, 20 - 2, (255, 255, 255))  # 白色砖块
            bricks.append(brick)

    # 得分变量
    score = 0

    # 游戏主循环
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # 更新球体和挡板的位置
        ball.update()
        paddle.update()

        # print(ball.pos, paddle.pos)
        # 检测球体是否碰到挡板
        if ball.pos[1] + ball.radius > paddle.pos[1]:
            if ball.pos[0] < paddle.pos[0] or ball.pos[0] > paddle.pos[0] + paddle.width:
                # running = False
                score -= 1
            else:
                ss = abs(ball.pos[0] - (paddle.pos[0]+paddle.width//2)) / 20
                ball.velocity[0] = 2+ss*2
                ball.velocity[1] *= -1
                # screen.fill(BLACK)

        # 渲染背景
        screen.fill(BLACK)

        # 绘制球体和挡板
        ball.draw(screen)
        paddle.draw(screen)
        xx = random.randint(0, 255)

        # 绘制砖块
        for brick in bricks:
            # 渐变ß
            # r = math.sqrt((ball.pos[0] - brick.rect.x) ** 2 + (ball.pos[1] - brick.rect.y) ** 2)
            # brick.color = ((r)/720 *255 % 255,  255, (r)/720*255 % 255)
            brick.draw(screen)

        if ball.pos[1] <= screen_height//2:
           score += update_bricks(ball, bricks)

        # 显示得分
        font = pygame.font.Font(None, 36)
        score_text = font.render('Score: ' + str(score), True, RED)
        screen.blit(score_text, (10, 10))

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

        # 设置帧率
        clock.tick(60)

    # 退出游戏
    pygame.quit()
    sys.exit()

在这里插入图片描述

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

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

相关文章

C++:加减乘除运算符(14)

就是常用的一些算数符 正1010负-10-10加102030减10 - 20-10 乘 10 * 20200除10 / 200.5 加 简单的加法运算 #include<iostream> using namespace std;int main() {// 加减乘除int a1 10;int b1 20;cout << a1 b1 << endl;system("pause");ret…

鸿蒙OS开发实战:【ArkTS 实现MQTT协议(2)】

软件说明 协议传输通道仅为TCPSocket基于HarmonyOS SDK API 9开发开发语言&#xff1a;ArkTS&#xff0c;TypeScript 应用操作说明 测试首页 “连接” : 用于连接远端服务器。具备“连接 & 断开” 两个功能“设置” : 用于添加更多主题“订阅” & “解除” : 仅用于…

LLM:函数调用(Function Calling)

1 函数调用 虽然大模型能解决很多问题&#xff0c;但大模型并不能知晓一切。比如&#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月&#xff0c;GPT-4 是 2023 年12月)。另外&#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理&#xff0c;是训练文本的统计…

第九节:时间队列(终结篇)

一、概述 在常规的时间管理中是时间到了触发某个任务&#xff0c;这样一个时间点对应一个任务。在特殊的场景下&#xff0c;任务不断放送到时间队列&#xff0c;时间一到&#xff0c;全部任务执行并释放。如图&#xff1a; 二、时间队列组件 SMB提供了TimeFragment组件来构建…

Domino中的Web博客还能这么用

大家好&#xff0c;才是真的好。 最近时间比较空余&#xff08;闲得慌&#xff09;&#xff0c;计划做一个网站出来。虽然网站很不流行&#xff0c;但对80后程序员来说&#xff0c;毕竟容易实现和感觉亲切。 在Domino平台上做一个网站实在是太容易了&#xff0c;但除了手动开…

【Linux】IP协议

目录 IP报头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 IP报文分片 1.粗粒度谈谈分片 a. 确保将所有的分片全部聚到一起&#xff08;相同的标识&#xff09; b. 片偏移排序&#xff08;完成组转&#xff09; 2.分片细节 数据链路层 M…

http模块 服务器端如何响应(获取)静态资源?

一、静态资源与动态资源介绍&#xff1a; &#xff08;1&#xff09;静态资源 内容长时间不改变的资源。eg&#xff1a;图片、视频、css js html文件、字体文件... &#xff08;2&#xff09;动态资源 内容经常更新的资源。eg&#xff1a;百度首页、淘宝搜索列表... 二、服…

引领向量数据库技术新变革,Milvus 2.4 正式上线

备受关注的 Milvus 2.4 正式上线! 作为向量数据库赛道的领军者,Zilliz 一直致力于推动向量技术的进步与创新。本次发布中,Milvus 新增支持基于 NVIDIA 的 GPU 索引—— CUDA 加速图形索引(CAGRA),突破了现有向量搜索的能力。 GPU 索引是向量数据库技术中的重要里程碑,…

【码银送书第十六期】大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 文章转自&#xff1a;大模型在金融行业的应用场景和落地路径 这是最好的时代&#xff0c;也是最坏的时代。尽管…

Linux系统使用Docker部署个人IT工具箱IT-Tools结合内网穿透实现公网访问

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

【随笔】Git -- 高级命令(上篇)(六)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

CVPR 2024 | 风格迁移和人像生成汇总!扩散模型diffusion用于经典AIGC方向

风格迁移 1、DEADiff: An Efficient Stylization Diffusion Model with Disentangled Representations 基于文本到图像扩散模型在迁移参考风格方面具有巨大潜力。然而&#xff0c;当前基于编码器的方法在迁移风格时显著损害了文本到图像模型的文本可控性。本文提出DEADiff来解决…

解决win10 cmd下运行python弹出windows应用商店

Windows 10 的五月更新为 Microsoft Store 应用商店带来了 Python 3.7 原因是这个环境变量“C:\Users\hongc\AppData\Local\Microsoft\WindowsApps”的优先级比我们创建的python环境变量优先级高 所以我们只需要删除这个环境变量即可 但是为了不影响正常功能 推荐将Python的…

【机器学习】数据探索---python主要的探索函数

在上一篇博客【机器学习】数据探索(Data Exploration)—数据质量和数据特征分析中&#xff0c;我们深入探讨了数据预处理的重要性&#xff0c;并介绍了诸如插值、数据归一化和主成分分析等关键技术。这些方法有助于我们清理数据中的噪声、消除异常值&#xff0c;以及降低数据的…

每日一题(相交链表 )

欢迎大家来我们主页进行指导 LaNzikinh-CSDN博客 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节…

【蓝桥杯第十三届省赛B组】(详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

20-日志处理(上):如何设计日志包并记录日志?

通过记录日志&#xff0c;可以完成一些基本功能&#xff0c;比如开发、测试期间的Debug&#xff0c;故障排除&#xff0c;数据分析&#xff0c;监控告警&#xff0c;以及记录发生的事件等。 如何设计日志包 基础功能 基础功能&#xff0c;是优秀日志包必备的功能&#xff0c;能…

勒石燕然的窦宪,打得匈奴只得为害欧洲了

匈奴&#xff0c;一个与汉族争斗了数百年的民族&#xff0c;在大大小小上百场战役中&#xff0c;双方一直打得你来我往。在东汉&#xff0c;一个罪臣指挥了汉民族与匈奴的终局之战。更令人想不到的是&#xff0c;终局之战北匈奴的战败却整得离中国相距甚远的欧洲崩溃了。 窦家…

ARP类型

地址解析协议ARP即可实现将IP地址解析为MAC地址 动态ARP 动态ARP表项由ARP协议通过ARP报文自动生成和维护&#xff0c;可以被老化&#xff0c;可以被新的ARP报文更新&#xff0c;也可以被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。 静态ARP …

单元测试mockito(一)

1.单元测试 1.1 单元测试的特点 ●配合断言使用(杜绝System.out) ●可重复执行 。不依赖环境 ●不会对数据产生影响 ●spring的上下文环境不是必须的 ●一般都需要配合mock类框架来实现 1.2 mock类框架使用场景 要进行测试的方法存在外部依赖(如db,redis,第三方接口调用等),为…