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()

在这里插入图片描述

相关推荐

  1. PythonPygame实现一个五子棋小游戏

    2024-04-01 15:40:04       54 阅读
  2. python实现飞机游戏

    2024-04-01 15:40:04       58 阅读
  3. C++ 一款纯C实现砖块小游戏

    2024-04-01 15:40:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 15:40:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 15:40:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 15:40:04       87 阅读
  4. Python语言-面向对象

    2024-04-01 15:40:04       96 阅读

热门阅读

  1. c++基础学习第五天半(类和对象)

    2024-04-01 15:40:04       37 阅读
  2. 鸿蒙(HarmonyOS)ArkTs语言基础教程(大纲)

    2024-04-01 15:40:04       38 阅读
  3. 【Python进阶(二)】——程序调试方法

    2024-04-01 15:40:04       43 阅读
  4. C++进阶编程 --- 2.初始STL

    2024-04-01 15:40:04       43 阅读
  5. 【C语言】字符串

    2024-04-01 15:40:04       45 阅读
  6. 3498. 日期差值

    2024-04-01 15:40:04       43 阅读
  7. 第八章 贪心算法 part05

    2024-04-01 15:40:04       35 阅读
  8. CSS学习

    2024-04-01 15:40:04       42 阅读
  9. Hive查询转换与Hadoop生态系统引擎与优势

    2024-04-01 15:40:04       44 阅读
  10. python语言访问字典元素

    2024-04-01 15:40:04       35 阅读
  11. c++ vector介绍

    2024-04-01 15:40:04       35 阅读
  12. 嵌入式C语言--GPT通用定时器

    2024-04-01 15:40:04       46 阅读