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.rhkb.cn/news/462614.html

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

相关文章

JS进阶级案例-----时钟

首先呢&#xff0c;是由四张图片构成&#xff0c;使用css摆放好&#xff0c;再使用JS给三个指针绑定获取时间和要旋转的角度&#xff0c;在获取对应的指针元素&#xff0c;给到定时器&#xff0c;实现时钟动态更新。 <!DOCTYPE html> <html lang"en"> &…

【前端基础】HTML 基础

目标&#xff1a;掌握标签基本语法&#xff0c;能够独立布局文章页。 核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接标记&a…

UE5相机系统初探(一)

UE5相机系统初探&#xff08;一&#xff09; 和Unity类似&#xff0c;UE的相机也是由名为Camera的component控制的。那么&#xff0c;在UE中要如何实现一个跟随玩家的第三人称相机呢&#xff1f;假设我们已经有了一个表示玩家的类ACF_Character&#xff0c;首先第一步就是要先在…

数据库->联合查询

目录 一、联合查询 1.联合查询 2.多表联合查询时MYSQL内部是如何进⾏计算的 3.多表联合查询 3.1语法 3.2指定多个表&#xff0c;进行联合查询 3.3通过表与表中的链接条件过滤掉无效数据 3.4通过指定列查询&#xff0c;精简查询结果​编辑 3.5可以通过给表起别名的方式&…

有关《WebGIS开发 从入门到实践》的分享

从30号发布了新书的上架消息之后&#xff0c;已有不少的朋友、学生下单购买了&#xff0c;有部分已经收到了书了&#xff0c;收到书大致翻阅后也第一时间向我进行了反馈。本文结合我在写本书时的思考和收到的大家反馈&#xff0c;给大家介绍一下我们花了三年写完出的《WebGIS开…

YOLO——yolo v4(2)

文章目录 一、损失函数改进1.GIOU损失2.DIOU损失3.CIOU损失 二、非极大值抑制 YOLOv4是一种先进的目标检测算法&#xff0c;它在YOLO系列的基础上进行了多项改进和优化。 一、损失函数改进 IOU损失表示预测框A和真实框B之间交并比的差值&#xff0c;反映预测检测框的检测效果。…

网络请求优化:理论与实践

文章目录 引言1. DNS 解析耗时因素优化措施扩展阅读 2. 创建连接耗时因素优化措施扩展阅读 3. 发送 / 接收数据耗时因素优化措施扩展阅读 4. 关闭连接耗时因素优化措施扩展阅读 总结 引言 网络请求的性能会直接影响到用户体验。本文将探讨网络请求的各个步骤&#xff0c;以及如…

R语言结构方程模型(SEM)

原文链接&#xff1a;R语言结构方程模型&#xff08;SEM&#xff09;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624956&idx4&sn295580a016a86cfee8ee2277c93e32d5&chksmfa8da91bcdfa200da897f1f267492039865bdfe5d75a1c6e6df92ff5005e0eb5cc33a…

android数组控件Textview

说明&#xff1a;android循环控件&#xff0c;注册和显示内容 效果图&#xff1a; step1: E:\projectgood\resget\demozz\IosDialogDemo-main\app\src\main\java\com\example\iosdialogdemo\TimerActivity.java package com.example.iosdialogdemo;import android.os.Bundl…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

【机器学习】26. 聚类评估方法

聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2&#xff1a;Correlation between two similarity matricesMethod 3&#xff1a;Visual Inspection of similarity matrix 2. Supervised measures3. 决定…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…

【FNENet】基于帧级非语言特征增强的情感分析

这篇文章语言极其晦涩难懂&#xff0c;内容和同专栏下的CENet中每一张图都百分之95相似&#xff0c;有些描述位置和内容都一模一样&#xff0c;还并且没有引用人家 abstract&#xff1a; 多模态情感分析&#xff08;Multimodal Sentiment Analysis&#xff0c; MSA&#xff09…

贪心算法习题其三【力扣】【算法学习day.20】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

shell脚本案例:RAC配置多路径时获取磁盘设备WWID和磁盘大小

使用场景 在RAC配置多路径时&#xff0c;需要获取到磁盘设备的wwid。因为RAC的磁盘配置是提前规划好的&#xff0c;只知道wwid&#xff0c;不知道磁盘对应大小&#xff0c;是不知道应该如何配置多路径的mutipath.conf文件的&#xff1b;而凭借肉眼手工去对应磁盘设备的wwid和大…

【毫米波雷达(三)】汽车控制器启动流程——BootLoader

汽车控制器启动流程——BootLoader 一、什么是Bootloader(BT)&#xff1f;二、FBL、PBL、SBL、ESS的区别三、MCU的 A/B分区的实现 一、什么是Bootloader(BT)&#xff1f; BT就是一段程序&#xff0c;一段引导程序。它包含了启动代码、中断、主程序等。 雷达启动需要由BT跳转到…

论技术思维和产品思维

大家好&#xff0c;我是农村程序员&#xff0c;独立开发者&#xff0c;前端之虎陈随易。 这是我的个人网站&#xff1a;https://chensuiyi.me。 我的所以文章都可以在我的个人网站找到&#xff0c;欢迎访问&#xff0c;也欢迎与我交朋友。 程序员做独立开发&#xff0c;技术思…

【python】flash-attn安装

这个命令&#xff1a; 确保使用正确的 CUDA 12.6 工具链 设置必要的 CUDA 环境变量 包含了常见的 GPU 架构支持 利用你的128核心进行并行编译 # 清理之前的安装 proxychains4 pip uninstall -y flash-attn# 获取 CUDA 路径 CUDA_PATH$(dirname $(dirname $(which nvcc)))# 使用…

RFID资产管理

随着物联网和智能制造的发展&#xff0c;RFID资产管理逐渐成为企业提升运营效率的重要工具。利用RFID技术&#xff0c;企业能够实时跟踪和管理各种固定资产&#xff0c;从而提高资产利用率&#xff0c;降低运营成本。在现代化的管理体系中&#xff0c;RFID资产管理不仅限于资产…

linux查看系统架构的命令

两种方式&#xff0c;以下以中标麒麟为示例&#xff1a; 1.cat /proc/verison Linux version 3.10.0-862.ns7_4.016.mips64el mips64el即为架构 2.uname -a 输出所有内容 Linux infosec 3.10.0-862.ns7_4.016.mips64el #1 SMP PREEMPT Mon Sep 17 16:06:31 CST 2018 mips64el…