当前位置: 首页 > article >正文

Python趣学篇:Pygame重现经典打砖块游戏

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《Python星球日记》

目录

    • 一、游戏背景与技术选型
      • 1. 打砖块游戏的传奇历史
      • 2. 为什么选择Pygame?
    • 二、环境准备与项目架构
      • 1. 环境搭建
      • 2. 项目结构设计
    • 三、核心功能实现详解
      • 1. 游戏对象设计
        • Paddle类 - 玩家挡板
        • Ball类 - 弹球物理引擎
      • 2. 碰撞检测系统
        • 球与挡板的智能碰撞
        • 砖块消除机制
      • 3. 中文字体完美支持
    • 四、游戏循环与状态管理
      • 1. 主游戏循环结构
      • 2. 游戏状态管理
    • 五、视觉效果与用户体验
      • 1. 彩色砖块设计
      • 2. 用户界面设计
    • 六、完整代码与扩展思路
      • 1. 完整代码及功能清单
      • 2. 可扩展功能思路
      • 3. 性能优化建议
    • 七、总结与收获

欢迎大家来到Python星球日记的趣学篇,在趣学篇,我们将带来很多有趣的适合初学者的项目,项目均由个人团队开发及AI vide coding的辅助…

还记得那个让无数玩家沉迷的经典游戏吗?一个小球、一根挡板、一墙彩色砖块,简单却充满魅力。今天我们就用Python和Pygame从零开始,重现这款1976年诞生的传奇游戏!

一、游戏背景与技术选型

1. 打砖块游戏的传奇历史

打砖块(Breakout)是世界上第一款打砖块游戏,1976年由美国雅达利公司发行。令人惊讶的是,这款游戏的原型设计者正是后来创立苹果电脑的史蒂夫·乔布斯与史蒂夫·沃兹尼亚克两人。这款看似简单的游戏,却开创了一个全新的游戏类型,影响至今。

在这里插入图片描述

游戏的核心魅力在于:

  • 🎯 规则简单:任何人都能立即上手
  • 🎮 节奏紧张:需要精准的反应和控制
  • 🌈 视觉丰富:彩色砖块带来满足的破坏感
  • 🔄 重玩价值:每次游戏都有不同的体验

2. 为什么选择Pygame?

Pygame是一款专门为开发和设计2D电子游戏而生的软件包,它在SDL(Simple DirectMedia Layer)的基础上开发而成,具有良好的跨平台性。

Pygame的优势:

  • 免费开源:完全免费,无需担心版权问题
  • 简单易学:API设计友好,适合初学者
  • 功能完备:图像、声音、输入处理一应俱全
  • 跨平台:Windows、Mac、Linux都能运行

二、环境准备与项目架构

1. 环境搭建

首先确保你的Python环境已经准备就绪,然后安装Pygame库:

# 使用pip安装Pygame
pip install pygame# 验证安装是否成功
python -c "import pygame; print('Pygame版本:', pygame.version.ver)"

2. 项目结构设计

我们的打砖块游戏采用面向对象的设计思路,主要包含以下几个核心类:

🎮 游戏架构
├── Game类        # 游戏主控制器
├── Paddle类      # 玩家挡板
├── Ball类        # 弹球
├── Brick类       # 砖块
└── 工具函数       # 字体处理等辅助功能

三、核心功能实现详解

在这里插入图片描述

1. 游戏对象设计

Paddle类 - 玩家挡板
class Paddle:def __init__(self):self.width = PADDLE_WIDTHself.height = PADDLE_HEIGHTself.x = SCREEN_WIDTH // 2 - self.width // 2self.y = SCREEN_HEIGHT - 50self.speed = PADDLE_SPEEDself.rect = pygame.Rect(self.x, self.y, self.width, self.height)def move_left(self):if self.x > 0:self.x -= self.speedself.rect.x = self.xdef move_right(self):if self.x < SCREEN_WIDTH - self.width:self.x += self.speedself.rect.x = self.x

设计要点:

  • 使用pygame.Rect进行碰撞检测
  • 边界检测防止挡板移出屏幕
  • 平滑的移动控制
Ball类 - 弹球物理引擎
class Ball:def __init__(self):self.size = BALL_SIZEself.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect = pygame.Rect(self.x, self.y, self.size, self.size)def update(self):self.x += self.speed_xself.y += self.speed_yself.rect.x = self.xself.rect.y = self.y# 边界碰撞检测if self.x <= 0 or self.x >= SCREEN_WIDTH - self.size:self.speed_x = -self.speed_xif self.y <= 0:self.speed_y = -self.speed_y

物理模拟精髓:

  • 🎯 真实反弹:球体碰撞边界时改变方向
  • 🎲 随机性:初始方向随机,增加游戏变化
  • 🔄 连续运动:每帧更新位置实现平滑动画

2. 碰撞检测系统

球与挡板的智能碰撞
# 检查球与挡板的碰撞
if self.ball.rect.colliderect(self.paddle.rect) and self.ball.speed_y > 0:self.ball.speed_y = -self.ball.speed_y# 根据球撞击挡板的位置调整反弹角度hit_pos = (self.ball.x - self.paddle.x) / self.paddle.widthself.ball.speed_x = BALL_SPEED * (hit_pos - 0.5) * 2

创新设计:

  • 💡 位置影响角度:球撞击挡板不同位置会有不同反弹角度
  • 🎮 策略性增强:玩家可以通过控制撞击位置改变球的轨迹
  • 🎯 游戏性提升:增加了技巧和策略元素

在这里插入图片描述

砖块消除机制
# 检查球与砖块的碰撞
for brick in self.bricks:if not brick.destroyed and self.ball.rect.colliderect(brick.rect):brick.destroyed = Trueself.score += 10self.ball.speed_y = -self.ball.speed_ybreak

3. 中文字体完美支持

为了确保游戏界面的中文能够正确显示,我们实现了跨平台字体适配系统:

def get_chinese_font(size):"""获取支持中文的字体"""system = platform.system()font_names = []if system == "Windows":font_names = ['Microsoft YaHei', 'SimHei', 'SimSun', 'KaiTi', 'FangSong']elif system == "Darwin":  # macOSfont_names = ['PingFang SC', 'STHeiti', 'STSong', 'STKaiti']else:  # Linuxfont_names = ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Noto Sans CJK SC']# 尝试加载字体for font_name in font_names:try:font = pygame.font.SysFont(font_name, size)return fontexcept:continuereturn pygame.font.Font(None, size)

字体方案亮点:

  • 🌐 全平台覆盖:Windows、macOS、Linux自动适配
  • 🎨 优雅降级:找不到中文字体时自动使用默认字体
  • 性能优化:只在初始化时检测,避免重复加载

四、游戏循环与状态管理

1. 主游戏循环结构

def run(self):running = Truewhile running:running = self.handle_events()  # 处理用户输入self.update()                   # 更新游戏状态self.draw()                     # 绘制游戏画面self.clock.tick(60)             # 控制帧率为60FPS

设计哲学:

  • 🔄 清晰分离:输入、逻辑、渲染三层分离
  • 性能稳定:60FPS确保流畅体验
  • 🎮 响应及时:实时处理用户输入

2. 游戏状态管理

我们实现了完整的游戏状态系统:

# 游戏状态
self.game_over = False    # 游戏结束
self.game_won = False     # 游戏获胜
self.lives = 3            # 生命数量
self.score = 0            # 玩家得分# 胜利条件检查
if all(brick.destroyed for brick in self.bricks):self.game_won = True# 失败条件检查
if self.ball.y > SCREEN_HEIGHT:self.lives -= 1if self.lives <= 0:self.game_over = True

五、视觉效果与用户体验

1. 彩色砖块设计

参考原版游戏8排砖块、不同颜色得分不同的设计,我们创建了6种颜色的砖块:

# 砖块颜色列表 - 从暖色到冷色的渐变
BRICK_COLORS = [RED, ORANGE, YELLOW, GREEN, CYAN, BLUE]def create_bricks(self):for row in range(BRICK_ROWS):for col in range(BRICK_COLS):x = start_x + col * (BRICK_WIDTH + brick_spacing)y = start_y + row * (BRICK_HEIGHT + brick_spacing)color = BRICK_COLORS[row % len(BRICK_COLORS)]brick = Brick(x, y, color)self.bricks.append(brick)

2. 用户界面设计

信息显示:

  • 📊 实时得分:左上角显示当前得分
  • ❤️ 生命显示:剩余生命数量
  • 🎮 操作提示:屏幕底部显示控制说明
  • 🏆 状态提示:游戏结束或获胜时的友好提示

六、完整代码与扩展思路

1. 完整代码及功能清单

完整代码:

import pygame
import sys
import random
import platform# 初始化pygame
pygame.init()# 游戏常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
BALL_SIZE = 15
BRICK_WIDTH = 75
BRICK_HEIGHT = 30
BRICK_ROWS = 6
BRICK_COLS = 10
PADDLE_SPEED = 8
BALL_SPEED = 5# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
PURPLE = (128, 0, 128)
CYAN = (0, 255, 255)# 砖块颜色列表
BRICK_COLORS = [RED, ORANGE, YELLOW, GREEN, CYAN, BLUE]def get_chinese_font(size):"""获取支持中文的字体"""system = platform.system()font_names = []if system == "Windows":font_names = ['Microsoft YaHei', 'SimHei', 'SimSun', 'KaiTi', 'FangSong']elif system == "Darwin":  # macOSfont_names = ['PingFang SC', 'STHeiti', 'STSong', 'STKaiti']else:  # Linuxfont_names = ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Noto Sans CJK SC']# 尝试加载字体for font_name in font_names:try:font = pygame.font.SysFont(font_name, size)# 测试是否能渲染中文test_surface = font.render("测试", True, (255, 255, 255))return fontexcept:continue# 如果都失败了,使用默认字体print("警告:无法找到合适的中文字体,可能显示异常")return pygame.font.Font(None, size)class Paddle:def __init__(self):self.width = PADDLE_WIDTHself.height = PADDLE_HEIGHTself.x = SCREEN_WIDTH // 2 - self.width // 2self.y = SCREEN_HEIGHT - 50self.speed = PADDLE_SPEEDself.rect = pygame.Rect(self.x, self.y, self.width, self.height)def move_left(self):if self.x > 0:self.x -= self.speedself.rect.x = self.xdef move_right(self):if self.x < SCREEN_WIDTH - self.width:self.x += self.speedself.rect.x = self.xdef draw(self, screen):pygame.draw.rect(screen, WHITE, self.rect)class Ball:def __init__(self):self.size = BALL_SIZEself.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect = pygame.Rect(self.x, self.y, self.size, self.size)def update(self):self.x += self.speed_xself.y += self.speed_yself.rect.x = self.xself.rect.y = self.y# 边界碰撞检测if self.x <= 0 or self.x >= SCREEN_WIDTH - self.size:self.speed_x = -self.speed_xif self.y <= 0:self.speed_y = -self.speed_ydef draw(self, screen):pygame.draw.ellipse(screen, WHITE, self.rect)def reset(self):self.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-BALL_SPEED, BALL_SPEED])self.speed_y = BALL_SPEEDself.rect.x = self.xself.rect.y = self.yclass Brick:def __init__(self, x, y, color):self.width = BRICK_WIDTHself.height = BRICK_HEIGHTself.x = xself.y = yself.color = colorself.rect = pygame.Rect(x, y, self.width, self.height)self.destroyed = Falsedef draw(self, screen):if not self.destroyed:pygame.draw.rect(screen, self.color, self.rect)pygame.draw.rect(screen, BLACK, self.rect, 2)class Game:def __init__(self):self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("打砖块游戏")self.clock = pygame.time.Clock()# 使用支持中文的字体self.font = get_chinese_font(36)self.small_font = get_chinese_font(24)# 初始化游戏对象self.paddle = Paddle()self.ball = Ball()self.bricks = []self.score = 0self.lives = 3self.game_over = Falseself.game_won = False# 创建砖块self.create_bricks()def create_bricks(self):self.bricks = []brick_spacing = 5start_x = (SCREEN_WIDTH - (BRICK_COLS * BRICK_WIDTH + (BRICK_COLS - 1) * brick_spacing)) // 2start_y = 50for row in range(BRICK_ROWS):for col in range(BRICK_COLS):x = start_x + col * (BRICK_WIDTH + brick_spacing)y = start_y + row * (BRICK_HEIGHT + brick_spacing)color = BRICK_COLORS[row % len(BRICK_COLORS)]brick = Brick(x, y, color)self.bricks.append(brick)def handle_events(self):for event in pygame.event.get():if event.type == pygame.QUIT:return Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_r and (self.game_over or self.game_won):self.restart_game()return Truedef update(self):if self.game_over or self.game_won:return# 处理键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] or keys[pygame.K_a]:self.paddle.move_left()if keys[pygame.K_RIGHT] or keys[pygame.K_d]:self.paddle.move_right()# 更新球的位置self.ball.update()# 检查球与挡板的碰撞if self.ball.rect.colliderect(self.paddle.rect) and self.ball.speed_y > 0:self.ball.speed_y = -self.ball.speed_y# 根据球撞击挡板的位置调整反弹角度hit_pos = (self.ball.x - self.paddle.x) / self.paddle.widthself.ball.speed_x = BALL_SPEED * (hit_pos - 0.5) * 2# 检查球与砖块的碰撞for brick in self.bricks:if not brick.destroyed and self.ball.rect.colliderect(brick.rect):brick.destroyed = Trueself.score += 10self.ball.speed_y = -self.ball.speed_ybreak# 检查球是否掉落if self.ball.y > SCREEN_HEIGHT:self.lives -= 1if self.lives <= 0:self.game_over = Trueelse:self.ball.reset()# 检查是否获胜if all(brick.destroyed for brick in self.bricks):self.game_won = Truedef draw(self):self.screen.fill(BLACK)# 绘制游戏对象self.paddle.draw(self.screen)self.ball.draw(self.screen)for brick in self.bricks:brick.draw(self.screen)# 绘制UI信息score_text = self.font.render(f"得分: {self.score}", True, WHITE)lives_text = self.font.render(f"生命: {self.lives}", True, WHITE)self.screen.blit(score_text, (10, 10))self.screen.blit(lives_text, (10, 50))# 绘制游戏结束或获胜信息if self.game_over:game_over_text = self.font.render("游戏结束! 按R重新开始", True, RED)text_rect = game_over_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))self.screen.blit(game_over_text, text_rect)elif self.game_won:win_text = self.font.render("恭喜通关! 按R重新开始", True, GREEN)text_rect = win_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))self.screen.blit(win_text, text_rect)# 绘制控制说明control_text = self.small_font.render("使用左右箭头键或A/D键控制挡板", True, WHITE)self.screen.blit(control_text, (10, SCREEN_HEIGHT - 30))pygame.display.flip()def restart_game(self):self.paddle = Paddle()self.ball = Ball()self.create_bricks()self.score = 0self.lives = 3self.game_over = Falseself.game_won = Falsedef run(self):running = Truewhile running:running = self.handle_events()self.update()self.draw()self.clock.tick(60)  # 60 FPSpygame.quit()sys.exit()if __name__ == "__main__":print("正在启动打砖块游戏...")print("如果中文显示异常,请确保系统已安装中文字体")game = Game()game.run()

效果预览:

静态:

在这里插入图片描述
动态:

在这里插入图片描述

功能清单:

核心玩法:挡板控制、弹球物理、砖块消除
游戏系统:得分机制、生命系统、胜负判定
视觉效果:彩色砖块、平滑动画、中文界面
用户体验:键盘控制、重新开始、操作提示

2. 可扩展功能思路

  • 道具系统:加长挡板、多球、激光等
  • 关卡设计:不同布局的砖块排列
  • 音效添加:碰撞音效、背景音乐
  • 粒子效果:砖块破碎的视觉特效
  • AI对手:电脑控制的挡板对战模式

3. 性能优化建议

  • 使用pygame.sprite.Group管理游戏对象
  • 实现对象池避免频繁创建销毁
  • 添加碰撞检测的空间优化算法
  • 使用pygame.Surface.convert()优化图像渲染

七、总结与收获

通过这个项目,我们不仅重现了一款经典游戏,更重要的是学习了:

🎯 技术收获:

  • Pygame库的核心用法:图形渲染、事件处理、碰撞检测
  • 面向对象设计:类的设计与交互、封装与抽象
  • 游戏开发思维:物理模拟、状态管理、用户体验设计
  • 跨平台开发:字体适配、兼容性处理

🎮 开发感悟:
经典游戏之所以经典,不在于复杂的技术,而在于简单而深刻的游戏机制。一个小球的弹跳轨迹,就能带来无穷的乐趣和挑战。这提醒我们,在软件开发中,用户体验往往比技术复杂度更重要

🚀 下一步方向:
掌握了基础的2D游戏开发后,你可以尝试:

  • 开发更复杂的游戏类型(RPG、策略游戏等)
  • 学习3D游戏开发(Panda3D、OpenGL等)
  • 探索游戏AI和机器学习的结合
  • 参与开源游戏项目的贡献

愿每一行代码都充满创造的乐趣,愿每一个像素都闪耀着梦想的光芒! 🌟


让我们一起用代码重现经典,用创意点亮未来!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

相关文章:

Python趣学篇:Pygame重现经典打砖块游戏

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《Python星球日记》 目录 一、游戏背景与技术选型1. 打砖块游戏…...

电脑硬盘分几个区好

分区的基本概念和作用 在探讨分几个区合适之前&#xff0c;咱们先了解一下硬盘分区是啥。简单来说&#xff0c;硬盘分区就像是把一个大房子隔成几个小房间&#xff0c;每个房间可以用来存放不同类型的东西。分区能让我们更有条理地管理文件&#xff0c;比如把系统文件、工作资…...

Vue3 + Element Plus + TypeScript 中 el-cascader 实现模拟用户点击功能

模拟点击&#xff0c;调用 el-cascader 的公开方法 togglePopperVisible 来展开下拉框 MaterialOut.vue <script setup lang"ts" name"MaterialOut"> ...... import { ElMessage, type ElCascader } from "element-plus";// 级联组件实例…...

【java】springboot注解关键字

springboot注解关键字 ValueServiceRepositoryConfigurationControllerComponent Value Value 是 Spring Boot 中用于注入外部配置的注解&#xff0c;它允许你将配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的值注入到 Bean 的字段、方法…...

supervisor 常见问题大全

写在前面 Supervisor 是一个用 Python 开发的进程管理工具&#xff0c;常用于服务器环境下的进程监控和管理。在日常使用过程中&#xff0c;我们经常会遇到各种配置、运行和日志相关的问题。 本文将汇总记录我在实际工作中使用 Supervisor 时遇到的各种典型问题及其解决方案。…...

2024 CKA模拟系统制作 | Step-By-Step | 18、题目搭建-备份还原Etcd

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. etcd 快照创建 2. etcd 快照还原 3. TLS 证书管理 4、关键参数 三、实验环境搭建步骤 1.创建题目要求目录 2.证书准备 3.创建考试中需要还原的备份数据 四、总结 免费获取题库配套 CKA_v1.31_模…...

【Netty系列】Reactor 模式 2

目录 流程图说明 关键流程 以下是 Reactor 模式流程图&#xff0c;结合 Netty 的主从多线程模型&#xff0c;帮助你直观理解事件驱动和线程分工&#xff1a; 流程图说明 Clients&#xff08;客户端&#xff09; 多个客户端&#xff08;Client 1~N&#xff09;向服务端发起连…...

SDL_CreateRendererWithProperties报错Parameter ‘window‘ is invalid

SDL_CreateRendererWithProperties报错Parameter ‘window’ is invalid 这个错误日志表明&#xff0c;即使你的窗口(p_sdl_window)被成功创建了&#xff0c;并且你尝试通过属性集(renderer_props)将其传递给渲染器&#xff0c;但渲染器在创建时仍然认为它没有获得一个有效的窗…...

在容器里运行go程序报错:/bin/sh: ./manager: not found

解决 ARM 容器中运行 Go 程序报错的问题&#xff1a;从动态链接到静态链接 背景 在开发基于 ARM 架构&#xff08;如 arm64/aarch64&#xff09;的应用程序时&#xff0c;常常需要将编译好的二进制文件部署到 Docker 容器中运行。然而&#xff0c;在某些情况下&#xff0c;二…...

TomatoSCI分析日记:数据分析为什么用csv不用excel

其实并不是多余&#xff0c;虽然看到的内容是一样的&#xff0c;但是相比excel文件&#xff0c;csv文件没这么多繁文缛节&#xff0c;效率更高。 1.csv更干净 csv本质是纯文本&#xff0c;只有你看到的数据&#xff0c;没有花里胡哨的单元格格式、颜色、批注等隐藏信息&#…...

HTTP协议完全指南:从请求响应到HTTPS安全机制

文章目录 一、HTTP协议中的基本概念1.HTTP协议介绍&#xff08;1&#xff09;协议&#xff08;2&#xff09;传输&#xff08;3&#xff09;超文本 2.统一资源定位符&#xff08;URL&#xff09; 二、HTTP协议中的请求和响应1.HTTP客户端请求消息&#xff08;1&#xff09;请求…...

[Java 基础]Java 语言的规范

代码格式 缩进&#xff1a;代码的层次感 怎么做&#xff1a; 统一使用 4 个空格进行缩进。不要用 Tab 键&#xff0c;因为不同的编辑器对 Tab 的显示宽度可能不一致&#xff0c;容易造成混乱。 大括号&#xff1a;清晰的代码块边界 风格&#xff1a; 推荐使用 K&R 风格…...

SpringBoot插件化架构的4种实现方案

在复杂业务场景下&#xff0c;传统的单体应用架构往往面临着功能扩展困难、代码耦合严重、迭代效率低下等问题。 插件化架构作为一种模块化设计思想的延伸&#xff0c;能够使系统具备更好的扩展性和灵活性&#xff0c;实现"热插拔"式的功能扩展。 本文将介绍Spring…...

设计模式——状态设计模式(行为型)

摘要 状态设计模式是一种行为型设计模式&#xff0c;核心在于允许对象在内部状态改变时改变行为。它通过状态对象封装不同行为&#xff0c;使状态切换灵活清晰。该模式包含环境类、抽象状态类和具体状态类等角色&#xff0c;具有避免大量分支判断、符合单一职责和开闭原则等特…...

CppCon 2014 学习:Lightning Talk: Writing a Python Interpreter for Fun and Profit

Lightning Talk: Writing a Python Interpreter for Fun and Profit 这段内容在讲的是 Python 的执行模型&#xff0c;尤其是 CPython 的工作流程。下面是逐步解析&#xff1a; Python 是动态类型语言&#xff08;Dynamically typed&#xff09; 变量类型在运行时决定。x 4…...

CTFHub-RCE 命令注入-过滤运算符

观察源代码 代码里面可以发现过滤了运算符&#xff0c;我们可以尝试分号&#xff1b; 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1;ls 打开flag文件 cat这个php文件 127.0.0.1;cat flag_257413168915334.php 可是发现 文本内容显示…...

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率&#xff1a;H264 由于算法优化&#xff0c;可以低于 2Mbps 的速度实现标清数字图像传送&#xff1b;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下&#xff0c;实现 1080p 全高清视频传输。 编码架构&#xff1a;H.265/HEVC…...

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡...

飞牛fnNAS存储模式RAID 5数据恢复

目录 一、添加硬盘 二、创建RAID 5 存储空间 三、上传测试文件 四、拆除硬盘 五、更换硬盘 六、修复RAID 5 七、验证其内文件 八、NAS系统崩溃后的数据盘 前文《飞牛fnNAS存储空间模式详解》 中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇R…...

论文笔记:DreamDiffusion

【初中生也能看得懂的讲解】 想象一下&#xff0c;我们能不能直接用“脑子想”来画画&#xff1f;比如你想到一只猫&#xff0c;电脑就能画出一只猫。这听起来是不是很酷&#xff1f;科学家们一直在努力实现这个“意念画画”的梦想。 以前&#xff0c;科学家们可能会用一种叫…...

户外摄像头监控如何兼顾安全实时监控

一、技术手段提升隐私安全性 硬件与功能设计 采用支持隐私保护技术的设备&#xff0c;例如带电子开关的摄像头&#xff08;可远程控制摄像头启闭&#xff09;3&#xff0c;或搭载本地AI算法的设备&#xff0c;仅识别人形、车辆等目标&#xff0c;减少无关信息采集。 使用安全…...

Neo4j 备份与恢复:原理、技术与最佳实践

在数据驱动的应用中&#xff0c;图数据库Neo4j承载着至关重要的关联数据。确保其数据安全与业务连续性依赖于强大的备份与恢复策略。本文将深入探讨Neo4j备份恢复的核心原理、关键技术、实用技巧及行业最佳实践&#xff0c;内容基于官方最新文档。 构建健壮的 Neo4j 备份恢复体…...

简单实现Ajax基础应用

Ajax不是一种技术&#xff0c;而是一个编程概念。HTML 和 CSS 可以组合使用来标记和设置信息样式。JavaScript 可以修改网页以动态显示&#xff0c;并允许用户与新信息进行交互。内置的 XMLHttpRequest 对象用于在网页上执行 Ajax&#xff0c;允许网站将内容加载到屏幕上而无需…...

关于 java:3. Java 常用类库与数据结构

一、String 1.1 String 是什么&#xff1f; public final class String implements java.io.Serializable, Comparable<String>, CharSequence特点&#xff1a; 是 不可变对象&#xff08;immutable&#xff09; 是 final 类&#xff0c;不能被继承 内部使用 字符数组…...

数据挖掘顶刊《IEEE Transactions on Knowledge and Data Engineering》2025年5月研究热点都有些什么?

本推文对2025年5月出版的数据挖掘领域国际顶级期刊《IEEE Transactions on Knowledge and Data Engineering》进行了分析&#xff0c;对收录的62篇论文的关键词与研究主题进行了汇总&#xff0c;并对其中的研究热点进行了深入分析&#xff0c;希望能为相关领域的研究人员提供有…...

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统&#xff0c;聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块&#xff0c;结合 LabVIEW 的 FPGA 实时控制能力&#xff0c;可对活体组织、荧光纳…...

WordPress 6.5版本带来的新功能

WordPress 6.5正式上线了&#xff01;WordPress团队再一次为我们带来了许多新的改进。在全球开发者的共同努力下&#xff0c;WordPress推出了许多新的功能&#xff0c;本文将对其进行详细总结。 Hostease的虚拟主机现已支持一键安装最新版本的WordPress。对于想要体验WordPres…...

将材质球中的纹理属性对应的贴图保存至本地

通过Texture2D的EncodeToPNG方法将纹理转为图片形式 material.GetTexture方法通过属性名获取纹理贴图 material.SetTexture方法通过属性名设置纹理贴图 属性名可在shader代码中查看 using UnityEngine; using System.IO;public class TextureSaver : MonoBehaviour {public…...

Linux应用开发之网络套接字编程

套接字&#xff08;Socket&#xff09;是计算机网络数据通信的基本概念和编程接口&#xff0c;允许不同主机上的进程&#xff08;运行中的程序&#xff09;通过网络进行数据交换。它为应用层软件提供了发送和接收数据的能力&#xff0c;使得开发者可以在不用深入了解底层网络细…...

实现RabbitMQ多节点集群搭建

目录 引言 一、环境准备 二、利用虚拟机搭建 ​ 三、镜像集群配置 四、HAProxy实现负载均衡(主用虚拟机操作) 五、测试RabbitMQ集群搭建情况 引言 在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色,而 RabbitMQ 作为…...