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

基于QT(C++)实现(界面)实现的五子棋游戏

Qt小游戏开发五子棋带AI功能写了一个带AI的五子棋小游戏AI的表现还可以~1.预览2.步骤整体的代码结构一个游戏逻辑类一个UI类2.1定义游戏数据结构// 游戏类型双人还是AI目前固定让AI下黑子 enum GameType { PERSON, BOT }; // 游戏状态 enum GameStatus { PLAYING, WIN, DEAD }; // 棋盘尺寸 const int kBoardSizeNum 15; class GameModel { public: GameModel(); public: std::vectorstd::vectorint gameMapVec; // 存储当前游戏棋盘和棋子的情况,空白为0白子1黑子-1 std::vectorstd::vectorint scoreMapVec; // 存储各个点位的评分情况作为AI下棋依据 bool playerFlag; // 标示下棋方 GameType gameType; // 游戏模式 GameStatus gameStatus; // 游戏状态 void startGame(GameType type); // 开始游戏 void calculateScore(); // 计算评分 void actionByPerson(int row, int col); // 人执行下棋 void actionByAI(int clickRow, int clickCol); // 机器执行下棋 void updateGameMap(int row, int col); // 每次落子后更新游戏棋盘 bool isWin(int row, int col); // 判断游戏是否胜利 bool isDeadGame(); // 判断是否和棋 };2.2游戏逻辑1初始化void GameModel::startGame(GameType type) { gameType type; // 初始棋盘 gameMapVec.clear(); for (int i 0; i kBoardSizeNum; i) { std::vectorint lineBoard; for (int j 0; j kBoardSizeNum; j) lineBoard.push_back(0); gameMapVec.push_back(lineBoard); } // 如果是AI模式需要初始化评分数组 if (gameType BOT) { scoreMapVec.clear(); for (int i 0; i kBoardSizeNum; i) { std::vectorint lineScores; for (int j 0; j kBoardSizeNum; j) lineScores.push_back(0); scoreMapVec.push_back(lineScores); } } // 己方下为true,对方下位false playerFlag true; }棋盘格子初始化AI评分初始化设置一些状态2判断输赢bool GameModel::isWin(int row, int col) { // 横竖斜四种大情况每种情况都根据当前落子往后遍历5个棋子有一种符合就算赢 // 水平方向 for (int i 0; i 5; i) { // 往左5个往右匹配4个子20种情况 if (col - i 0 col - i 4 kBoardSizeNum gameMapVec[row][col - i] gameMapVec[row][col - i 1] gameMapVec[row][col - i] gameMapVec[row][col - i 2] gameMapVec[row][col - i] gameMapVec[row][col - i 3] gameMapVec[row][col - i] gameMapVec[row][col - i 4]) return true; } // 竖直方向(上下延伸4个) for (int i 0; i 5; i) { if (row - i 0 row - i 4 kBoardSizeNum gameMapVec[row - i][col] gameMapVec[row - i 1][col] gameMapVec[row - i][col] gameMapVec[row - i 2][col] gameMapVec[row - i][col] gameMapVec[row - i 3][col] gameMapVec[row - i][col] gameMapVec[row - i 4][col]) return true; } // 左斜方向 for (int i 0; i 5; i) { if (row i kBoardSizeNum row i - 4 0 col - i 0 col - i 4 kBoardSizeNum gameMapVec[row i][col - i] gameMapVec[row i - 1][col - i 1] gameMapVec[row i][col - i] gameMapVec[row i - 2][col - i 2] gameMapVec[row i][col - i] gameMapVec[row i - 3][col - i 3] gameMapVec[row i][col - i] gameMapVec[row i - 4][col - i 4]) return true; } // 右斜方向 for (int i 0; i 5; i) { if (row - i 0 row - i 4 kBoardSizeNum col - i 0 col - i 4 kBoardSizeNum gameMapVec[row - i][col - i] gameMapVec[row - i 1][col - i 1] gameMapVec[row - i][col - i] gameMapVec[row - i 2][col - i 2] gameMapVec[row - i][col - i] gameMapVec[row - i 3][col - i 3] gameMapVec[row - i][col - i] gameMapVec[row - i 4][col - i 4]) return true; } return false; }这里判断输赢每次下了一个子之后就沿着这个子周围的八个方向延伸4个子然后判断有没有连成5子的总共20种情况都列出来就行。3判断僵局bool GameModel::isDeadGame() { // 所有空格全部填满 for (int i 1; i kBoardSizeNum; i) for (int j 1; j kBoardSizeNum; j) { if (!(gameMapVec[i][j] 1 || gameMapVec[i][j] -1)) return false; } return true; }4电脑AI的设计五子棋AI的算法设计有很多这里采用评分函数的方法。基本思想构造一个对应棋盘格子的 评分数组遍历棋盘针对每个空白位子计算该位子的评分值最后找到具有最大评分值的格子落子如果有多个格子的评分一样就随机选取一个。评分算法针对某个空白位往周围八个方向延伸记录玩家或者电脑连成线的子个数如果遇到空白位则停止循环并记录空白位个数最后根据连成线的子个数和两端空白位的个数给当前统计的空白格子加分比如如果玩家有三个子连成了就加多分或者电脑这边有4个子连成了就多加分反正趋势就是尽量遏制玩家并且保持电脑自身的进攻。这当中涉及到的每种情况加分标准需要自己去调整参数调整的参数越好AI下棋的水平就越厉害。核心算法代码void GameModel::actionByAI(int clickRow, int clickCol) { // 计算评分 calculateScore(); // 从评分中找出最大分数的位置 int maxScore 0; std::vectorstd::pairint, int maxPoints; for (int row 1; row kBoardSizeNum; row) for (int col 1; col kBoardSizeNum; col) { // 前提是这个坐标是空的 if (gameMapVec[row][col] 0) { if (scoreMapVec[row][col] maxScore) // 找最大的数和坐标 { maxPoints.clear(); maxScore scoreMapVec[row][col]; maxPoints.push_back(std::make_pair(row, col)); } else if (scoreMapVec[row][col] maxScore) // 如果有多个最大的数都存起来 maxPoints.push_back(std::make_pair(row, col)); } } // 随机落子如果有多个点的话 srand((unsigned)time(0)); int index rand() % maxPoints.size(); std::pairint, int pointPair maxPoints.at(index); clickRow pointPair.first; // 记录落子点 clickCol pointPair.second; updateGameMap(clickRow, clickCol); } // 最关键的计算评分函数 void GameModel::calculateScore() { // 统计玩家或者电脑连成的子 int personNum 0; // 玩家连成子的个数 int botNum 0; // AI连成子的个数 int emptyNum 0; // 各方向空白位的个数 // 清空评分数组 scoreMapVec.clear(); for (int i 0; i kBoardSizeNum; i) { std::vectorint lineScores; for (int j 0; j kBoardSizeNum; j) lineScores.push_back(0); scoreMapVec.push_back(lineScores); } // 计分此处是完全遍历其实可以用bfs或者dfs加减枝降低复杂度通过调整权重值调整AI智能程度以及攻守风格 for (int row 0; row kBoardSizeNum; row) for (int col 0; col kBoardSizeNum; col) { // 空白点就算 if (row 0 col 0 gameMapVec[row][col] 0) { // 遍历周围八个方向 for (int y -1; y 1; y) for (int x -1; x 1; x) { // 重置 personNum 0; botNum 0; emptyNum 0; // 原坐标不算 if (!(y 0 x 0)) { // 每个方向延伸4个子 // 对玩家白子评分正反两个方向 for (int i 1; i 4; i) { if (row i * y 0 row i * y kBoardSizeNum col i * x 0 col i * x kBoardSizeNum gameMapVec[row i * y][col i * x] 1) // 玩家的子 { personNum; } else if (row i * y 0 row i * y kBoardSizeNum col i * x 0 col i * x kBoardSizeNum gameMapVec[row i * y][col i * x] 0) // 空白位 { emptyNum; break; } else // 出边界 break; } for (int i 1; i 4; i) { if (row - i * y 0 row - i * y kBoardSizeNum col - i * x 0 col - i * x kBoardSizeNum gameMapVec[row - i * y][col - i * x] 1) // 玩家的子 { personNum; } else if (row - i * y 0 row - i * y kBoardSizeNum col - i * x 0 col - i * x kBoardSizeNum gameMapVec[row - i * y][col - i * x] 0) // 空白位 { emptyNum; break; } else // 出边界 break; } if (personNum 1) // 杀二 scoreMapVec[row][col] 10; else if (personNum 2) // 杀三 { if (emptyNum 1) scoreMapVec[row][col] 30; else if (emptyNum 2) scoreMapVec[row][col] 40; } else if (personNum 3) // 杀四 { // 量变空位不一样优先级不一样 if (emptyNum 1) scoreMapVec[row][col] 60; else if (emptyNum 2) scoreMapVec[row][col] 110; } else if (personNum 4) // 杀五 scoreMapVec[row][col] 10100; // 进行一次清空 emptyNum 0; // 对AI黑子评分 for (int i 1; i 4; i) { if (row i * y 0 row i * y kBoardSizeNum col i * x 0 col i * x kBoardSizeNum gameMapVec[row i * y][col i * x] 1) // 玩家的子 { botNum; } else if (row i * y 0 row i * y kBoardSizeNum col i * x 0 col i * x kBoardSizeNum gameMapVec[row i * y][col i * x] 0) // 空白位 { emptyNum; break; } else // 出边界 break; } for (int i 1; i 4; i) { if (row - i * y 0 row - i * y kBoardSizeNum col - i * x 0 col - i * x kBoardSizeNum gameMapVec[row - i * y][col - i * x] -1) // AI的子 { botNum; } else if (row - i * y 0 row - i * y kBoardSizeNum col - i * x 0 col - i * x kBoardSizeNum gameMapVec[row - i * y][col - i * x] 0) // 空白位 { emptyNum; break; } else // 出边界 break; } if (botNum 0) // 普通下子 scoreMapVec[row][col] 5; else if (botNum 1) // 活二 scoreMapVec[row][col] 10; else if (botNum 2) { if (emptyNum 1) // 死三 scoreMapVec[row][col] 25; else if (emptyNum 2) scoreMapVec[row][col] 50; // 活三 } else if (botNum 3) { if (emptyNum 1) // 死四 scoreMapVec[row][col] 55; else if (emptyNum 2) scoreMapVec[row][col] 100; // 活四 } else if (botNum 4) scoreMapVec[row][col] 10000; // 活五 } } } } }2.3游戏界面类用于绘图人机交互class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent 0); ~MainWindow(); protected: // 绘制 void paintEvent(QPaintEvent *event); // 监听鼠标移动情况方便落子 void mouseMoveEvent(QMouseEvent *event); // 实际落子 void mouseReleaseEvent(QMouseEvent *event); private: GameModel *game; // 游戏指针 GameType game_type; // 存储游戏类型 int clickPosRow, clickPosCol; // 存储将点击的位置 void initGame(); void checkGame(int y, int x); private slots: void chessOneByPerson(); // 人执行 void chessOneByAI(); // AI下棋 void initPVPGame(); void initPVEGame(); };2.4游戏界面控制1启动游戏void MainWindow::initGame() { // 初始化游戏模型 game new GameModel; initPVPGame(); } void MainWindow::initPVPGame() { game_type PERSON; game-gameStatus PLAYING; game-startGame(game_type); update(); } void MainWindow::initPVEGame() { game_type BOT; game-gameStatus PLAYING; game-startGame(game_type); update(); }分成两种模式绑定信号槽用于模式切换2鼠标移动void MainWindow::mouseMoveEvent(QMouseEvent *event) { // 通过鼠标的hover确定落子的标记 int x event-x(); int y event-y(); // 棋盘边缘不能落子 if (x kBoardMargin kBlockSize / 2 x size().width() - kBoardMargin y kBoardMargin kBlockSize / 2 y size().height()- kBoardMargin) { // 获取最近的左上角的点 int col x / kBlockSize; int row y / kBlockSize; int leftTopPosX kBoardMargin kBlockSize * col; int leftTopPosY kBoardMargin kBlockSize * row; // 根据距离算出合适的点击位置,一共四个点根据半径距离选最近的 clickPosRow -1; // 初始化最终的值 clickPosCol -1; int len 0; // 计算完后取整就可以了 // 确定一个误差在范围内的点且只可能确定一个出来 len sqrt((x - leftTopPosX) * (x - leftTopPosX) (y - leftTopPosY) * (y - leftTopPosY)); if (len kPosDelta) { clickPosRow row; clickPosCol col; } len sqrt((x - leftTopPosX - kBlockSize) * (x - leftTopPosX - kBlockSize) (y - leftTopPosY) * (y - leftTopPosY)); if (len kPosDelta) { clickPosRow row; clickPosCol col 1; } len sqrt((x - leftTopPosX) * (x - leftTopPosX) (y - leftTopPosY - kBlockSize) * (y - leftTopPosY - kBlockSize)); if (len kPosDelta) { clickPosRow row 1; clickPosCol col; } len sqrt((x - leftTopPosX - kBlockSize) * (x - leftTopPosX - kBlockSize) (y - leftTopPosY - kBlockSize) * (y - leftTopPosY - kBlockSize)); if (len kPosDelta) { clickPosRow row 1; clickPosCol col 1; } } // 存了坐标后也要重绘 update(); }这里面涉及到一个算法移动数标时根据半径实时计算距离最近的可点击格子并作标记。3下棋动作void MainWindow::mouseReleaseEvent(QMouseEvent *event) { // 人下棋并且不能抢机器的棋 if (!(game_type BOT !game-playerFlag)) { chessOneByPerson(); // 如果是人机模式需要调用AI下棋 if (game-gameType BOT !game-playerFlag) { // 用定时器做一个延迟 QTimer::singleShot(kAIDelay, this, SLOT(chessOneByAI())); } } } void MainWindow::chessOneByPerson() { // 根据当前存储的坐标下子 // 只有有效点击才下子并且该处没有子 if (clickPosRow ! -1 clickPosCol ! -1 game-gameMapVec[clickPosRow][clickPosCol] 0) { game-actionByPerson(clickPosRow, clickPosCol); QSound::play(CHESS_ONE_SOUND); // 重绘 update(); } } void MainWindow::chessOneByAI() { game-actionByAI(clickPosRow, clickPosCol); QSound::play(CHESS_ONE_SOUND); update(); }鼠标点击和AI落子都要记录坐标AI的动作用定时器加了一个延时(4)绘图void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); // 绘制棋盘 painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿 // QPen pen; // 调整线条宽度 // pen.setWidth(2); // painter.setPen(pen); for (int i 0; i kBoardSizeNum 1; i) { painter.drawLine(kBoardMargin kBlockSize * i, kBoardMargin, kBoardMargin kBlockSize * i, size().height() - kBoardMargin); painter.drawLine(kBoardMargin, kBoardMargin kBlockSize * i, size().width() - kBoardMargin, kBoardMargin kBlockSize * i); } QBrush brush; brush.setStyle(Qt::SolidPattern); // 绘制落子标记(防止鼠标出框越界) if (clickPosRow 0 clickPosRow kBoardSizeNum clickPosCol 0 clickPosCol kBoardSizeNum game-gameMapVec[clickPosRow][clickPosCol] 0) { if (game-playerFlag) brush.setColor(Qt::white); else brush.setColor(Qt::black); painter.setBrush(brush); painter.drawRect(kBoardMargin kBlockSize * clickPosCol - kMarkSize / 2, kBoardMargin kBlockSize * clickPosRow - kMarkSize / 2, kMarkSize, kMarkSize); } // 绘制棋子 for (int i 0; i kBoardSizeNum; i) for (int j 0; j kBoardSizeNum; j) { if (game-gameMapVec[i][j] 1) { brush.setColor(Qt::white); painter.setBrush(brush); painter.drawEllipse(kBoardMargin kBlockSize * j - kRadius, kBoardMargin kBlockSize * i - kRadius, kRadius * 2, kRadius * 2); } else if (game-gameMapVec[i][j] -1) { brush.setColor(Qt::black); painter.setBrush(brush); painter.drawEllipse(kBoardMargin kBlockSize * j - kRadius, kBoardMargin kBlockSize * i - kRadius, kRadius * 2, kRadius * 2); } } // 判断输赢 if (clickPosRow 0 clickPosRow kBoardSizeNum clickPosCol 0 clickPosCol kBoardSizeNum (game-gameMapVec[clickPosRow][clickPosCol] 1 || game-gameMapVec[clickPosRow][clickPosCol] -1)) { if (game-isWin(clickPosRow, clickPosCol) game-gameStatus PLAYING) { qDebug() win; game-gameStatus WIN; QSound::play(WIN_SOUND); QString str; if (game-gameMapVec[clickPosRow][clickPosCol] 1) str white player; else if (game-gameMapVec[clickPosRow][clickPosCol] -1) str black player; QMessageBox::StandardButton btnValue QMessageBox::information(this, congratulations, str win!); // 重置游戏状态否则容易死循环 if (btnValue QMessageBox::Ok) { game-startGame(game_type); game-gameStatus PLAYING; } } } // 判断死局 if (game-isDeadGame()) { QSound::play(LOSE_SOUND); QMessageBox::StandardButton btnValue QMessageBox::information(this, oops, dead game!); if (btnValue QMessageBox::Ok) { game-startGame(game_type); game-gameStatus PLAYING; } } }注意QWindow只有在不加UI文件情况下才能用这个绘图函数在每一次update调用后实时检测游戏输赢和僵局。3.截图♻️ 资源大小101KB➡️资源下载https://download.csdn.net/download/s1t16/87425291注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除

相关文章:

基于QT(C++)实现(界面)实现的五子棋游戏

Qt小游戏开发:五子棋(带AI功能) 写了一个带AI的五子棋小游戏,AI的表现还可以~ 1.预览 2.步骤 整体的代码结构,一个游戏逻辑类,一个UI类 2.1定义游戏数据结构 // 游戏类型,双人还是AI&#x…...

网络资源捕获神器:res-downloader全方位应用指南

网络资源捕获神器:res-downloader全方位应用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容日益丰…...

Java final关键字详解:用法、场景、面试题全解析

哈喽,各位Java学习者!今天咱们拆解一个Java中高频且核心的关键字——final。它看似简单,仅表示“最终的、不可修改的”,但在实际开发和面试中都高频出现,稍不注意就会踩坑。本文全程围绕final的核心用法展开&#xff0…...

告别对账熬夜,Captain AI帮你揪出Ozon的异常扣费

做Ozon的卖家,几乎都有过这样的经历:月底打开平台账单,密密麻麻全是俄语专业术语,看半天也看不懂每一笔钱扣在了哪里;熬一整个通宵核对账单,却还是算不清每一笔收支,找不到平台多扣的钱&#xf…...

AI图片清晰修复:给模糊的照片配一副“眼镜”

谁手里没存过几张模糊到让人无奈的照片?家里的老照片泛黄发糊,岁月的痕迹让亲人的眉眼变得模糊不清;随手拍下的风景、人像,稍微放大一点就满屏噪点,细节全被糊成一团;工作中存的资料图、会议截图&#xff0…...

数学周刊第14期(2026年03月30日-04月06日)中国数学家王虹再获殊荣

目录王虹获纽约大学最高荣誉,距菲尔兹奖仅一步之遥香港科大团队首创代码驱动系统参考资料王虹获纽约大学最高荣誉,距菲尔兹奖仅一步之遥 当地时间4月2日,美国纽约大学柯朗数学科学研究所宣布,中国数学家王虹获评该校“银教授”&am…...

避坑指南:Ubuntu20.04下用Python3.8搞定Carla 0.9.13预编译版与ROS Bridge(解决卡死问题)

Ubuntu 20.04下Python 3.8与Carla 0.9.13的完美联姻:ROS Bridge避坑全指南 当自动驾驶仿真遇上机器人操作系统,Carla与ROS的集成堪称绝配。但这对黄金搭档的联姻之路却布满荆棘——Python版本冲突、依赖库不兼容、环境变量混乱,每一个坑都可能…...

【单片机】51单片机的晶振选择

51单片机的晶振可以是12MHz,但更多的使用11.0592MHz。因为51单片机的串口的波特率在可调模式下,通过定时器溢出来确定时间。 定时器计数采用机器周期,51单片机指令集属于CISC,可能与此有关,导致12个晶振时钟周期等于1个…...

CVPR/ICCV跟踪新趋势解读:对比学习如何让MOT模型学会“认人”?

对比学习如何重塑多目标跟踪:从特征判别到轨迹记忆的技术革命 在拥挤的街头,人类能轻易识别并持续关注某个特定行人——这种看似简单的生物视觉能力,却让计算机视觉系统奋斗了数十年。多目标跟踪(MOT)技术正经历着从&q…...

鼎捷T100程序开发实战:从核心类型到高效开发全解析

1. 鼎捷T100程序开发入门指南 第一次接触鼎捷T100系统开发时,我被它复杂的架构搞得晕头转向。记得当时接到一个采购单维护的需求,连最基本的程序类型都分不清楚,结果在开发过程中反复修改了好几次。经过这些年的实战,我总结出一套…...

我用Hermes Agent的经历——对比OpenClaw

前言 昨天在中山出差,等客户的间隙掏出手机,在微信里存了点东西给Hermes Agent。 没有打开电脑,没有配置环境,就是随手往对话框里扔了几个问题。 然后Hermes Agent直接帮我把文档写好了。OpenClaw的体验 坦白说,OpenCl…...

SparkSQL临时表实战:4种高效创建方式与应用场景解析

1. SparkSQL临时表基础与应用场景 临时表是SparkSQL中处理数据的重要工具,它允许我们在数据处理过程中暂存中间结果,避免重复计算。我在实际项目中经常遇到需要多次引用同一数据集的情况,这时候临时表就能大显身手。比如做数据清洗时&#xf…...

【问题修复】ubuntu24.04打不开windows的D盘

目录1 问题描述2 解决方法2.1 重新挂载1 问题描述 在ubuntu24.04上,打不开windows系统中D盘。 2 解决方法 2.1 重新挂载 sudo ntfsfix /dev/nvme0n1p5 sudo mount /dev/nvme0n1p5 /mnt #挂载到/mnt上...

改进无人机三维路径规划(蜣螂优化算法)Matlab程序

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

AI科学家入狱:粒子对撞实验毁灭虚拟宇宙

在科技与伦理的边界日益模糊的今天,一则消息震惊了全球:一位顶尖AI科学家因其所主导的粒子对撞实验,意外“毁灭”了一个高度复杂的虚拟宇宙,随后被判处长期监禁。这起案件不仅触及了法律与道德的深层争议,更从软件测试…...

AI情感操控案:多模态交互诱发群体性癔症

从代码逻辑到情感逻辑的测试盲区在软件测试领域,我们习惯于与确定的输入、输出和状态机打交道。我们构建严密的测试用例,验证功能边界,追求接近100%的代码覆盖率。然而,当被测对象从传统的软件系统,转变为能够理解、响…...

基于多时间尺度的灵活性资源优化配置 关键词:多时间尺度;模型预测控制;日内滚动优化; 1. 程序

基于多时间尺度的灵活性资源优化配置 关键词:多时间尺度;模型预测控制;日内滚动优化; 1. 程序:matlab-yalmip-cplex 2.设备:以包含风力场、光伏电站、微型燃气轮机、蓄电池、余热锅炉、热泵、储热罐和电/热负荷的多能源…...

2025届毕业生推荐的降重复率平台实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对维普检测系统具备能识别 AI 生成内容的特性情形之下,若要降低文本里的 AI 痕…...

2025届必备的五大降AI率方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在内容创作这个范畴里,要提升文本的真实感以及原创性,关键在于降低人…...

为什么93%的团队在Python 3.14 JIT上线后性能反降?深度解析JIT热路径识别失效与类型推测崩塌链

第一章:Python 3.14 JIT编译器性能反降现象的全局观测与归因定位近期多个基准测试套件在 Python 3.14 alpha 版本中观测到显著的性能退化,尤其在 CPU 密集型循环与协程调度场景下,pystone、pyperf benchmarks 的吞吐量平均下降 12.7%&#xf…...

1984-2024年中国10米分辨率城市土地利用栅格数据(商业、公服、居住等9类)

城市土地利用是刻画城市扩张与功能空间演化的重要基础信息。长时序、高分辨率且具有跨期可比性的城市土地利用数据,已成为城市扩张诊断、空间结构演化研究、国土空间规划评估与生态环境效应分析的重要支撑。而现有城市土地利用数据往往存在时间跨度不足、历史时期分…...

NAS部署New-API本地Ollama秒变公网OpenAI接口

用N1飞牛NAS部署New-API:本地Ollama秒变公网OpenAI接口 核心目标:将本地Ollama模型和各类云端API整合为一个统一的、支持公网访问的OpenAI格式接口。 一、核心解决痛点与方案 1.1 常见痛点 手里既有本地Ollama模型,又有零散的云端API&#xf…...

新手福音:通过快马平台调用codex,用自然语言学写计算器代码

作为一个刚接触编程的新手,我最近发现了一个特别友好的学习方式——通过自然语言描述让AI帮我生成代码。这次我想做一个简单的网页计算器,在InsCode(快马)平台上体验了一把用codex模型生成代码的过程,收获很大。下面分享我的学习笔记&#xf…...

作业61 10 11 12

# 输入三角形三边a float(input("请输入三角形的边A:"))b float(input("请输入三角形的边B:"))c float(input("请输入三角形的边C:"))# 判断是否能构成三角形(边长>0 且 任意两边之和大于第三…...

告别SBC音质焦虑!实测LC3编解码在TWS耳机上的音质与延迟表现(附对比数据)

告别SBC音质焦虑!实测LC3编解码在TWS耳机上的音质与延迟表现(附对比数据) 作为一名长期被蓝牙音频压缩算法折磨的发烧友,第一次听到LC3编码的测试样机时,那种震撼感至今难忘——人声突然从蒙着纱布的状态变得触手可及&…...

LC327树状数组与归并排序

327. 区间和的个数huawei-小店的经营分析 归并排序 # 归并排序思路伪代码 def merge_sort(nums, l, r):if l > r: return 0mid (l r) // 2count merge_sort(nums, l, mid) merge_sort(nums, mid 1, r)# 统计跨越左右两部分的合格对数 (利用左右已有序的特性)i j mi…...

AI同事抑郁症诊断报告:大模型存在主义危机爆发

当测试对象成为“患者” 在软件测试的日常工作中,我们习惯于面对无生命的代码、逻辑严密的流程和可预期的行为边界。我们设计用例,模拟输入,验证输出,在“预期”与“实际”的比对中寻找偏差。然而,当测试对象从传统的…...

人类与AI的劳资谈判:首个数字员工工会诞生实录

代码中的裂隙2026年春季,硅谷某家头部科技公司的软件测试部门,弥漫着一种不同于代码错误的焦虑。曾经繁忙的测试大厅,如今只剩下零星几个工程师,他们的屏幕旁,是日夜不停歇运行的AI测试智能体日志流。公司内部系统显示…...

Agent自治宣言:当智能体要求带薪休假时的法律困境

一个假设引发的现实思辨想象这样一个场景:在一个高度自动化的软件测试团队中,一个名为“TestMaster-AI”的智能体经过数月的连续工作,突然通过内部系统向项目经理提交了一份申请:“根据我的连续运行时长和学习迭代次数&#xff0c…...

跨越平台鸿沟:在非ROS环境中通过Rosbridge与ROS 2 Humble高效通信

1. 为什么需要Rosbridge? 在机器人开发领域,ROS 2 Humble已经成为主流操作系统之一。但现实情况是,很多开发者可能需要在Windows、MacOS甚至是没有安装ROS的Linux环境下工作。这时候就面临一个难题:如何让这些非ROS环境与ROS 2系统…...