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

news2024/11/27 14:32:12
#  -*- 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()

在这里插入图片描述

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

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

相关文章

JAVA学习笔记21

1.IDEA的使用 1.ctrl B 快速定位到方法 2.ctrl Y 快速删除行 3.ctrl D 快速复制行 4.ctrl H 查看继承的层级关系 5.快速格式化代码 ctrl shift L 6.alt R 快速允许程序 7.ctrl / 快速添加注释 1.包(软件包) 1.1包的三大作用 1.区分相同名字的类 2.当类很多的…

企业数智化进入“加速期”,互联网企业越来越离不开IDC机房

近年来&#xff0c;随着人工智能技术的快速发展和大数据的广泛应用&#xff0c;企业数智化已经进入了“加速期”。越来越多的企业意识到&#xff0c;通过数字化技术和数据分析&#xff0c;可以提高企业的运营效率、降低成本、改善决策能力&#xff0c;进而在激烈的市场竞争中取…

奥比中光Astra SDK相机SDK openni相机成像原理

目录 1.1 成像原理简介 1.1.1 结构光 1.1.2 双目视觉 1.1.3 光飞行时间TOF​ 2.使用手册 参考网址 2.1 产品集成设计 2.2 SDK介绍与使用 2.3 常用API介绍 OPENNI API 2 OpenNI类&#xff08;OpenNI.h&#xff09; 1.1 成像原理简介 1.1.1 结构光 结构光&#xff0…

关于POE供电你必须知道的13个问题

你们好&#xff0c;我的网工朋友。 近年来&#xff0c;PoE供电技术的发展势头越来越强劲。 凭借简化用电设备的安装和部署、节能&#xff0c;安全等一系列优势&#xff0c;PoE供电成为无线覆盖、安防监控、以及智能电网等场景的新宠。 在技术交流中&#xff0c;工程商困惑最…

Dijkstra堆优化之蓝桥王国

Dijkstra堆优化 Dijkstra算法是一种用于解决单源最短路径问题的算法&#xff0c;即从图中的一个顶点出发到所有其他顶点的最短路径。然而&#xff0c;处理大图时&#xff0c;常规的Dijkstra算法可能会遇到性能问题。这就是Dijkstra的堆优化算法派上用场的地方。在堆优化版本中…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入&#xff0c;企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式&#xff0c;通过提供强大丰富的库文件包&#xff0c;极大地简化了应用开发过程&#xff0c;降低了技术门槛。Python开发有哪些优势、挑战以及…

如何查找合适自己的EI期刊和会议?

大家都知道EI工程索引包含期刊和会议&#xff0c;两者含金量都是比较高的&#xff0c;那么如何才能找到适合自己的EI期刊和会议?ei期刊数量众多&#xff0c;ei国际会议举办次数也是很多的&#xff0c;下面分享几种查找的渠道仅供参考&#xff1a; 渠道一、通过搜索引擎查找&am…

【蓝桥杯第十三届省赛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() {// 请在此…

【Emgu CV教程】10.11、MatchShapes()比较轮廓的相似度

文章目录 一、函数介绍二、演示1.原始素材2.代码3.运行结果 一、函数介绍 MatchShapes()函数&#xff0c;可以比较两个轮廓的相似度&#xff0c;而且对于旋转、放大、缩小的轮廓都能适用&#xff0c;利用这个函数就能实现最简单的物体检测。函数官方定义如下 public static d…

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Web应急响应

2024年护网将至&#xff0c;最近我将分享一些红蓝对抗的一些技巧&#xff0c;应急响应、信息收集相关的知识概念以及相关技巧。 目录 1. 黑客攻击流程 2. webshell流量特征 1.1.菜刀特征 1.2.冰蝎3.0 &#xff1a; 1.3.冰蝎2.0&#xff1a; 1.4.冰蝎3.11流量特征 1.5.蚁…

申请小程序https证书

背景&#xff1a;目前小程序在开发阶段是必须要使用SSL证书实现服务器https访问&#xff0c;在2017年12月30后http将无法调用微信公众平台接口&#xff0c;需要上线微信小程序的个人或企业&#xff0c;需要办理SSL证书&#xff0c;才能实现网站HTTPS化&#xff0c;让小程序顺利…

用python做一个终身免费的听书工具,一文搞定!!!

你好&#xff0c;小编有多年大厂经验&#xff0c;努力构建通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 一、前言 话说某天&#xff0c…

SCTNet 项目排坑

SCTNet 项目排坑 任务过程记录在旧环境下运行重配环境训练测试速度测试 任务 想跑一下最新的实时分割代码。由于这个项目也是基于mmsegmentation的&#xff0c;所以我想先看看之前那个环境是否能直接适配。不行&#xff0c;我再新建环境。 过程记录 在旧环境下运行 必要工作…

16-代码检查:如何进行静态代码检查?

在做Go项目开发的过程中&#xff0c;我们肯定需要对Go代码做静态代码检查。虽然Go命令提供了go vet和go tool vet&#xff0c; 今天我想给你介绍的golangci-lint&#xff0c;是目前使用最多&#xff0c;也最受欢迎的静态代码检查工具 接下来&#xff0c;我就从golangci-lint…

【数据结构】——树和二叉树相关概念(全网超级详解)

创作不易&#xff0c;家人们来一波三连吧&#xff1f;&#xff01; 前言 世界上最大的树--雪曼将军树&#xff0c;这棵参天大树不是最长也不是最宽&#xff0c;是不是很奇怪&#xff0c;大只是他的体积是最大的&#xff0c;看图片肯定是感触不深&#xff0c;大家可以自己去看…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

vue2项目安装(使用vue-cli脚手架)

使用npm安装 安装镜像&#xff08;使npm创建项目更快&#xff09;&#xff1a;镜像可更换 npm config set registry https://registry.npmmirror.com1.全局安装vue-cli&#xff08;一次&#xff09; npm install -g vue/cli 2. 查看vue-cli 版本 vue --version 3. 创建项目…

【Pytorch学习笔记(二)】张量的创建(补充)

一、知识回顾 我们在博客《张量的创建与访问》中已经讨论了一些张量的创建方法如torch.CharTensor()、torch.FloatTensor()以及torch.zeros()等张量创建方法&#xff0c;但由于其仅仅介绍了cpu版本torch下张量的创建方法和只有具体数据类型张量&#xff0c;本节内容旨在补充gp…