C++ 实现俄罗斯方块游戏

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:C++ 实现俄罗斯方块游戏

文章目录

    • 一、引言
      • 1. 俄罗斯方块的魅力
      • 2. 游戏的教育意义
      • 3. 项目的目标
    • 二、游戏设计
      • 1. 游戏界面
      • 2. 砖块设计
      • 3. 游戏逻辑
      • 4. 控制方式
      • 5. 用户体验
      • 6. 代码结构
    • 三、实现过程
      • 1. 环境设置
      • 2. 创建项目结构
      • 3. 设计数据结构
      • 4. 实现砖块生成
      • 5. 实现砖块移动和旋转
      • 6. 实现砖块下落和行消除
      • 7. 实现行消除逻辑
      • 8. 实现用户输入处理
      • 9. 实现游戏主循环
      • 10. 绘制游戏界面
      • 11. 测试和调试
      • 12. 优化和扩展
    • 四、完整代码
    • 五、结论

在这里插入图片描述

一、引言

  俄罗斯方块(Tetris)是一款风靡全球的经典益智游戏,自1984年首次发布以来,便吸引了无数玩家。其简单而富有挑战性的玩法使得这款游戏成为了电子游戏历史上的里程碑。玩家通过控制不同形状的砖块(称为“Tetrominoes”),将它们放置在一个由方格组成的游戏区域中,目的是填满水平行。当一行被完全填满时,它会消失,玩家将获得积分。随着游戏的进行,砖块下落的速度逐渐加快,增加了游戏的难度和紧迫感。

  在这篇博文中,我们将深入探讨如何用 C++ 编写一个简单的俄罗斯方块游戏。我们将从游戏的基本概念和设计入手,逐步实现游戏的各个功能模块,包括砖块的生成、移动、旋转、行的消除以及分数的计算。通过这个项目,您不仅可以学习到 C++ 编程的基本技巧,还能了解游戏开发的基本原理和逻辑。

1. 俄罗斯方块的魅力

  俄罗斯方块的魅力在于其简单易学的规则和深邃的策略性。尽管游戏的操作非常直观,但要在快速下落的砖块中做出正确的决策,仍然需要玩家具备良好的空间想象能力和快速反应能力。随着游戏的进行,玩家需要不断调整自己的策略,以应对不断增加的难度和复杂性。

2. 游戏的教育意义

  除了娱乐,俄罗斯方块还具有一定的教育意义。它可以帮助玩家提高逻辑思维能力、手眼协调能力和反应速度。许多研究表明,玩俄罗斯方块可以增强大脑的认知能力,甚至有助于缓解压力和焦虑。因此,开发这样一款游戏不仅是一个有趣的编程项目,也是一个有益于身心健康的活动。

3. 项目的目标

  本项目的目标是创建一个基本的俄罗斯方块游戏,具备以下功能:

  1. 砖块生成:随机生成不同形状的砖块。
  2. 砖块控制:允许玩家通过键盘控制砖块的移动和旋转。
  3. 行消除:检测并消除已填满的行,并更新分数。
  4. 游戏结束条件:当砖块堆叠到游戏区域顶部时,游戏结束。

  通过实现这些功能,您将能够掌握游戏开发的基本概念,并为进一步的学习和探索打下坚实的基础。接下来,我们将详细介绍游戏的设计和实现过程。

二、游戏设计

  在设计俄罗斯方块游戏时,我们需要考虑多个方面,包括游戏界面、游戏逻辑、控制方式、以及用户体验等。

1. 游戏界面

  游戏界面是玩家与游戏互动的主要场所,设计时需要确保其简洁明了,易于操作。游戏界面通常包括以下几个部分:

  • 游戏区域:这是一个由方格组成的矩形区域,通常为 10 列和 20 行。砖块将在这个区域内下落和堆叠。可以使用字符或图形来表示砖块和空白区域。

  • 分数显示:在游戏区域的上方或旁边,显示当前的分数。分数会随着消除的行数增加而更新。

  • 下一个砖块预览:在游戏区域的一侧,可以显示下一个即将出现的砖块,以帮助玩家提前规划。

  • 游戏状态信息:可以显示游戏的状态信息,例如“游戏进行中”、“游戏结束”等提示。

2. 砖块设计

  俄罗斯方块中的砖块(Tetrominoes)有七种基本形状,每种形状由四个方块组成。它们分别是:

  • I 形:一条直线,适合横向或纵向放置。
  • O 形:一个正方形,无法旋转。
  • T 形:一个“T”字形,具有多种放置方式。
  • L 形:一个“L”字形,具有多种放置方式。
  • J 形:一个“J”字形,具有多种放置方式。
  • S 形:一个“S”字形,具有多种放置方式。
  • Z 形:一个“Z”字形,具有多种放置方式。

每种砖块的生成是随机的,玩家在游戏中需要根据当前砖块的形状和位置,灵活调整放置策略。

3. 游戏逻辑

  游戏逻辑是游戏的核心部分,主要包括以下几个方面:

  • 砖块生成:在游戏开始时和每次消除行后,随机生成一个新的砖块,并将其放置在游戏区域的顶部中心位置。

  • 砖块移动:玩家可以通过键盘控制砖块的左右移动和下落。需要检测砖块是否与其他砖块或边界发生碰撞,以确保砖块不会超出游戏区域或重叠。

  • 砖块旋转:玩家可以通过键盘旋转砖块。旋转时需要检查砖块的新位置是否有效,避免与其他砖块或边界发生碰撞。

  • 行消除:每当砖块下落后,需要检查游戏区域的每一行,判断是否被完全填满。如果一行被填满,则将其消除,并将上方的砖块下移。

  • 游戏结束条件:当新的砖块生成时,如果其初始位置与已堆叠的砖块重叠,则游戏结束。

4. 控制方式

  为了增强游戏的可玩性,控制方式需要简单直观。通常使用以下键盘控制:

  • 左箭头:向左移动当前砖块。
  • 右箭头:向右移动当前砖块。
  • 下箭头:加速砖块下落。
  • 上箭头:旋转当前砖块。

这些控制方式可以通过捕获键盘事件来实现,确保玩家能够快速反应并做出决策。

5. 用户体验

  用户体验是游戏设计中不可忽视的一部分。为了提升玩家的体验,可以考虑以下几点:

  • 音效和音乐:为游戏添加背景音乐和音效,可以增强游戏的氛围。例如,消除行时的音效和游戏结束时的提示音。

  • 视觉效果:使用不同颜色或图案来区分不同形状的砖块,使游戏更加生动有趣。

  • 难度调整:可以设计多个难度级别,随着玩家的进步,逐渐增加砖块下落的速度和复杂性。

  • 暂停和重启功能:允许玩家在游戏中暂停,或在游戏结束后选择重新开始。

6. 代码结构

  在实现游戏时,合理的代码结构可以提高可读性和可维护性。可以将代码分为多个模块,例如:

  • 主程序模块:负责游戏的主循环和初始化。
  • 游戏逻辑模块:处理砖块的生成、移动、旋转和行消除等逻辑。
  • 界面模块:负责绘制游戏界面和更新显示。
  • 输入模块:处理键盘输入和用户交互。

通过这样的设计,代码将更加清晰,便于后续的扩展和维护。

三、实现过程

  在实现俄罗斯方块游戏的过程中,我们将按照以下步骤进行,确保每个功能模块都能顺利集成。整个过程将涵盖从环境设置到代码实现的各个方面。

1. 环境设置

  首先,确保您有一个适合开发 C++ 的环境。推荐使用以下工具:

  • 编译器:如 GCC、Clang 或 Microsoft Visual C++。
  • IDE:如 Visual Studio、Code::Blocks、CLion 或任何您熟悉的文本编辑器(如 VSCode、Sublime Text)。
  • 控制台:由于我们将使用控制台进行游戏显示,确保您的开发环境支持控制台应用程序。

2. 创建项目结构

  在您的开发环境中创建一个新的 C++ 项目,并设置基本的文件结构。可以考虑以下文件:

  • main.cpp:主程序文件,包含游戏的入口和主循环。
  • Tetris.hTetris.cpp:游戏逻辑的头文件和实现文件,包含砖块生成、移动、旋转等功能。
  • InputHandler.hInputHandler.cpp:处理用户输入的模块。
  • Renderer.hRenderer.cpp:负责绘制游戏界面的模块。

3. 设计数据结构

  在 Tetris.h 中定义必要的数据结构。我们需要一个表示砖块的结构体和一个表示游戏区域的类。

// Point 结构体表示砖块的坐标
struct Point {int x, y;
};// Tetris 类表示游戏逻辑
class Tetris {
public:Tetris();void run();// 其他成员函数...private:vector<vector<char>> board; // 游戏区域vector<Point> currentBlock;  // 当前砖块int score;                   // 当前分数bool gameOver;               // 游戏状态// 其他成员变量...
};

4. 实现砖块生成

  在 Tetris.cpp 中实现砖块生成逻辑。可以使用随机数生成器来选择砖块的形状,并将其坐标存储在 currentBlock 中。

vector<Point> Tetris::generateBlock() {vector<Point> block;int shape = rand() % 7; // 生成 0 到 6 之间的随机数switch (shape) {case 0: // I 形block = {{4, 0}, {4, 1}, {4, 2}, {4, 3}};break;case 1: // O 形block = {{4, 0}, {5, 0}, {4, 1}, {5, 1}};break;// 其他形状...}return block;
}

5. 实现砖块移动和旋转

  在 Tetris.cpp 中实现砖块的移动和旋转逻辑。需要检查砖块的新位置是否有效,避免与其他砖块或边界发生碰撞。

void Tetris::move(int dx) {for (const auto& p : currentBlock) {if (p.x + dx < 0 || p.x + dx >= WIDTH || board[p.y][p.x + dx] != EMPTY) {return; // 碰撞检测}}for (auto& p : currentBlock) {p.x += dx; // 移动砖块}
}void Tetris::rotate() {// 简单的旋转逻辑for (auto& p : currentBlock) {int temp = p.x;p.x = p.y;p.y = -temp + 3; // 调整旋转中心}
}

6. 实现砖块下落和行消除

  实现砖块的下落逻辑,并在每次下落后检查是否有行被填满。

void Tetris::drop() {for (const auto& p : currentBlock) {if (p.y + 1 >= HEIGHT || board[p.y + 1][p.x] != EMPTY) {placeBlock(); // 放置砖块return;}}for (auto& p : currentBlock) {p.y++; // 下落砖块}
}void Tetris::placeBlock() {for (const auto& p : currentBlock) {board[p.y][p.x] = BLOCK; // 更新游戏区域}clearLines(); // 检查并消除行currentBlock = generateBlock(); // 生成新砖块
}

7. 实现行消除逻辑

  在 Tetris.cpp 中实现行消除的逻辑,检查每一行是否被填满,并更新分数。

void Tetris::clearLines() {for (int y = HEIGHT - 1; y >= 0; y--) {bool fullLine = true;for (int x = 0; x < WIDTH; x++) {if (board[y][x] == EMPTY) {fullLine = false;break;}}if (fullLine) {board.erase(board.begin() + y); // 删除满行board.insert(board.begin(), vector<char>(WIDTH, EMPTY)); // 在顶部插入空行score += 100; // 增加分数}}
}

8. 实现用户输入处理

  在 InputHandler.cpp 中实现用户输入的处理逻辑,捕获键盘事件并调用相应的控制函数。

void Tetris::input() {if (_kbhit()) {switch (_getch()) {case 'a': move(-1); break; // 左移case 'd': move(1); break;  // 右移case 's': drop(); break;    // 加速下落case 'w': rotate(); break;   // 旋转}}
}

9. 实现游戏主循环

  在 main.cpp 中实现游戏的主循环,负责初始化游戏、调用绘制和逻辑更新函数。

int main() {srand(static_cast<unsigned>(time(0))); // 随机数种子Tetris game;game.run(); // 启动游戏return 0;
}

10. 绘制游戏界面

  在 Renderer.cpp 中实现绘制游戏界面的逻辑,使用字符在控制台中显示游戏区域和分数。

void Tetris::draw() {system("cls"); // 清屏for (int y = 0; y < HEIGHT; y++) {for (int x = 0; x < WIDTH; x++) {if (isBlockAt(x, y)) {cout << BLOCK; // 绘制砖块} else {cout << board[y][x]; // 绘制空白}}cout << endl;}cout << "Score: " << score << endl; // 显示分数
}

11. 测试和调试

  在完成代码实现后,进行全面的测试和调试。确保所有功能正常工作,包括砖块的生成、移动、旋转、行消除和游戏结束条件。可以通过添加调试信息来帮助识别潜在问题。

12. 优化和扩展

在基本功能实现后,可以考虑优化代码和扩展功能。例如:

  • 增加不同难度级别:根据玩家的表现调整砖块下落速度。
  • 添加音效和背景音乐:提升游戏的沉浸感。
  • 实现暂停和重启功能:增强用户体验。
  • 保存高分记录:记录玩家的最高分数。

四、完整代码

  以下是一个简单的 C++ 俄罗斯方块游戏的实现代码。你可以将其复制到你的 C++ 开发环境中进行编译和运行。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <conio.h> // For _kbhit() and _getch()using namespace std;const int WIDTH = 10;
const int HEIGHT = 20;
const char EMPTY = ' ';
const char BLOCK = '#';struct Point {int x, y;
};class Tetris {
public:Tetris() {board.resize(HEIGHT, vector<char>(WIDTH, EMPTY));currentBlock = generateBlock();score = 0;gameOver = false;}void run() {while (!gameOver) {draw();input();logic();}cout << "Game Over! Your score: " << score << endl;}private:vector<vector<char>> board;vector<Point> currentBlock;int score;bool gameOver;vector<Point> generateBlock() {// Generate a random block shapevector<Point> block;int shape = rand() % 7;switch (shape) {case 0: // Iblock = {{4, 0}, {4, 1}, {4, 2}, {4, 3}};break;case 1: // Oblock = {{4, 0}, {5, 0}, {4, 1}, {5, 1}};break;case 2: // Tblock = {{4, 0}, {3, 1}, {4, 1}, {5, 1}};break;case 3: // Lblock = {{4, 0}, {4, 1}, {4, 2}, {5, 2}};break;case 4: // Jblock = {{4, 0}, {4, 1}, {4, 2}, {3, 2}};break;case 5: // Sblock = {{4, 1}, {5, 1}, {3, 0}, {4, 0}};break;case 6: // Zblock = {{4, 0}, {5, 0}, {3, 1}, {4, 1}};break;}return block;}void draw() {system("cls"); // Clear the consolefor (int y = 0; y < HEIGHT; y++) {for (int x = 0; x < WIDTH; x++) {if (isBlockAt(x, y)) {cout << BLOCK;} else {cout << board[y][x];}}cout << endl;}cout << "Score: " << score << endl;}bool isBlockAt(int x, int y) {for (const auto& p : currentBlock) {if (p.x == x && p.y == y) {return true;}}return false;}void input() {if (_kbhit()) {switch (_getch()) {case 'a': move(-1); break; // Move leftcase 'd': move(1); break;  // Move rightcase 's': drop(); break;    // Drop blockcase 'w': rotate(); break;   // Rotate block}}}void move(int dx) {for (auto& p : currentBlock) {if (p.x + dx < 0 || p.x + dx >= WIDTH || board[p.y][p.x + dx] != EMPTY) {return; // Collision detected}}for (auto& p : currentBlock) {p.x += dx;}}void drop() {for (auto& p : currentBlock) {if (p.y + 1 >= HEIGHT || board[p.y + 1][p.x] != EMPTY) {placeBlock();return;}}for (auto& p : currentBlock) {p.y++;}}void rotate() {// Simple rotation logic (not perfect)for (auto& p : currentBlock) {int temp = p.x;p.x = p.y;p.y = -temp + 3; // Adjust rotation center}}void placeBlock() {for (const auto& p : currentBlock) {if (p.y < 0) {gameOver = true; // Game over if block is placed above the board}board[p.y][p.x] = BLOCK;}clearLines();currentBlock = generateBlock();}void clearLines() {for (int y = HEIGHT - 1; y >= 0; y--) {bool fullLine = true;for (int x = 0; x < WIDTH; x++) {if (board[y][x] == EMPTY) {fullLine = false;break;}}if (fullLine) {board.erase(board.begin() + y);board.insert(board.begin(), vector<char>(WIDTH, EMPTY));score += 100; // Increase score}}}
};int main() {srand(static_cast<unsigned>(time(0))); // Seed random number generatorTetris game;game.run();return 0;
}

代码说明:

  1. 数据结构:使用 Point 结构体表示砖块的坐标,使用二维向量 board 表示游戏区域。
  2. 砖块生成generateBlock 函数随机生成砖块的形状。
  3. 游戏循环run 函数包含游戏的主循环,负责绘制界面、处理输入和更新逻辑。
  4. 输入处理:使用 _kbhit()_getch() 函数处理键盘输入。
  5. 砖块移动和旋转:实现了砖块的移动、下落和旋转逻辑。
  6. 行消除clearLines 函数检查并消除已填满的行。

五、结论

  本文展示了如何使用 C++ 实现一个简单的俄罗斯方块游戏。虽然这个实现相对基础,但它提供了一个良好的起点,您可以在此基础上添加更多功能,例如计时器、不同难度级别、音效等。希望您能在这个项目中获得乐趣,并进一步探索游戏开发的世界!


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

《高频电子线路》—— 相位平衡条件判断准则

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 相位平衡条件判断准则 反馈电压或者从电感上获得&#xff0c;或者从电容上获得。分别为电感反馈三端振荡器&#xff0c;或者是电容反馈…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日&#xff0c;是一年中的第256天&#xff0c;也是程序员节&#xff0c;同时也是怿星的生日。2014年到2024年&#xff0c;年华似水匆匆一瞥&#xff0c;多少岁月轻描淡写&#xff0c;怿星人欢聚一堂&#xff0c;共同为怿星科技的十周年庆生&#xff01; 01.回忆往昔&…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

mysql上课总结(5)(MySQL的完整性约束(详细介绍))

目录 一、完整性约束。 &#xff08;1&#xff09;概念与目的。 <1>概念。 <2>目的。 &#xff08;2&#xff09;各个约束的详细&#xff08;表格&#xff09; &#xff08;3&#xff09;各个约束的简要总结。 <1>主键约束。 <2>唯一约束。 <3>非…

msys2更换国内源(多个文件(不是3个文件的版本!))

msys2更换国内源 起因排查答案如下mirrorlist.mingw64mirrorlist.ucrt64mirrorlist.mingw32mirrorlist.mingwmirrorlist.clang64mirrorlist.clang32mirrorlist.msys 不想看经过的直接跳到答案 起因 查了很多个教程大部分都是【打开MSYS2软件内的\etc\pacman.d\ 中3个文件&…

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…

TCP Analysis Flags 之 TCP Keep-Alive

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

关于数学建模的一些介绍

为了更好了解世界&#xff0c;我们可以通过数学来描述许多特定的现象&#xff0c;而数学模型就是现实世界的理想化&#xff0c;不过它永远不能完全精确地表示现实世界。 在这篇文章中&#xff0c;我将介绍一些数学建模的基本概念以及相应的基础知识&#xff0c;而关于更具体的…

CSRA的LINUX操作系统24年11月2日下午上课笔记

压缩和解压缩&#xff1a;zip 、gzip、bz、xz # zip 压缩 # 压缩文件夹 # 解压缩 # unzip -v 查看压缩包中的内容 # bzip2 dir1/* :将dir1中的所有文件压缩 # gzip # 压缩文件夹 # 解压缩 tar 归档命令&#xff1a; # 创建tar包 tar -c*f # 释放tar包 tar -xf[c] # c …

Java JUC(四) 自定义线程池实现与原理分析

目录 一. 阻塞队列 BlockingQue 二. 拒绝策略 RejectPolicy 三. 线程池 ThreadPool 四. 模拟运行 在 Java基础&#xff08;二&#xff09; 多线程编程 中&#xff0c;我们简单介绍了线程池 ThreadPoolExecutor 的核心概念与基本使用。在本文中&#xff0c;我们将基于前面学…

施耐德M310PLC通讯之ModbusTCP(一)

这是另一个专题----施耐德国产化PLC(M310)的通讯篇 本节是ModbusTcp通讯 测试对象: M310plc与M241PLC 通讯协议: ModbusTcp 主站:M310PLC 从站:M241PLC 1.M310端: 1.1 新建工程(M310采用EcoStruxure Motion Expert 软件) 新建工程,这里不区分PLC型号的,只要是M310即…

电能表预付费系统-标准传输规范(STS)(30)

6.5.3.2 CONTROLBlock construction The 1 6 digit CONTROLBlock is constructed from the data elements in the APDU as defined in Table 36 and Table 37.The most significant digit is in position 1 5 and the least significant digit in position 0. APDU中的数据元素…

Jmeter基础篇(19)JSR223预处理器

前言 JSR223预处理器是Apache JMeter中的一个组件&#xff0c;它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大&#xff0c;因为它让测试人员能够利用如Groovy、JavaScript&#xff08;Nashorn引擎&#xff09;、BeanShell…

Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变种如门控循环…

echart实现地图数据可视化

文章目录 [TOC](文章目录) 前言一、基本地图展示2.数据可视化 总结 前言 最近工作安排使用echarts来制作图形报表&#xff0c;记录一下我的步骤&#xff0c;需求呈现一个地图&#xff0c;地图显示标签&#xff0c;根据业务指标值给地图不同省市填充不同颜色&#xff0c;鼠标放…

数学真题总结

举反例 看清正负号 对应的特征值一致 不用裁开计算行列式要注意符号&#xff01;&#xff01;&#xff01; 根据值的大小确定正负 没有思路就构建tanx求极值要考虑端点线性方程&#xff1a;求通解归并x几何意义 整体思想 u e^x y都设计好了&#xff0c;曲线是f(x,y) 0,直接把…

ES跟Kafka集成

配合流程 1. Kafka作为分布式流处理平台&#xff0c;能够实时收集和处理不同数据源的数据流&#xff1b; 2. 通过Kafka Connect或者Logstash等中间件&#xff0c;可以将Kafka中的数据流实时推送到Elasticsearch中&#xff1b; 3. Elasticsearch接收到数据后&#xff0c;会根据…

价格文本对齐

记录一下工作里常遇到的一些简单问题&#xff1a; 需求是一个购买按钮上同时展示原价和现价&#xff1a; 1.原价现价文本格式不同 2.原价切需要加打折红线&#xff0c;不方便用富文本一个文本处理。 3.需要对两条文本适配父节点的宽度&#xff0c;不能超出按钮 以下是实现代…

c++:vector模拟实现

一、vector成员变量 库里实现用的就是这三个成员变量&#xff0c;咱们实现跟库里一样&#xff0c; namespace myvector {template<class T>class vector{public://vecttor的迭代器是原生指针typedef T* iterator;typedef const T* const_iterator; private:iterator _sta…

【热门主题】000023 计算机视觉:算法与应用的深度探索

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…