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

基于QT和C++实现的中国象棋

一,源码

board.h

#ifndef BOARD_H
#define BOARD_H#include <QWidget>
#include "Stone.h"class Board : public QWidget
{Q_OBJECT
public:explicit Board(QWidget *parent = 0);bool _bRedTurn; // 红方先走int _currentPlayer; // 当前玩家,1为红方,-1为黑方Stone _s[32];int _r; /* 棋子的半径 */int _selectid;/* 返回象棋棋盘行列对应的像素坐标 */QPoint center(int row, int col);QPoint center(int id);bool getRowCol(QPoint pt, int& row, int& col);void drawStone(QPainter& painter, int id);void paintEvent(QPaintEvent *);void mouseReleaseEvent(QMouseEvent *);bool canMove(int moveid, int row, int col, int killid);bool canMoveJIANG(int moveid, int row, int col, int killid);bool canMoveSHI(int moveid, int row, int col, int killid);bool canMoveXIANG(int moveid, int row, int col, int killid);bool canMoveCHE(int moveid, int row, int col, int killid);bool canMoveMA(int moveid, int row, int col, int killid);bool canMovePAO(int moveid, int row, int col, int killid);bool canMoveBING(int moveid, int row, int col, int killid);bool isStoneAt(int row, int col);void saveGameState();
signals:public slots:};#endif // BOARD_H

Stone.h

#ifndef STONE_H
#define STONE_H#include <QString>class Stone
{
public:Stone();~Stone();int getRow()const{return _row;}int getCol()const{return _col;}enum TYPE{JIANG, CHE, PAO, MA, BING, SHI, XIANG};int _row;int _col;TYPE _type;int _id;bool _dead;bool _red;void init(int id){struct {int row, col;Stone::TYPE type;} pos[16] = {{0, 0, Stone::CHE},{0, 1, Stone::MA},{0, 2, Stone::XIANG},{0, 3, Stone::SHI},{0, 4, Stone::JIANG},{0, 5, Stone::SHI},{0, 6, Stone::XIANG},{0, 7, Stone::MA},{0, 8, Stone::CHE},{2, 1, Stone::PAO},{2, 7, Stone::PAO},{3, 0, Stone::BING},{3, 2, Stone::BING},{3, 4, Stone::BING},{3, 6, Stone::BING},{3, 8, Stone::BING},};_id = id;_dead = false;_red = id<16;if(id < 16){_row = pos[id].row;_col = pos[id].col;_type = pos[id].type;}else{_row = 9-pos[id-16].row;_col = 8-pos[id-16].col;_type = pos[id-16].type;}}QString getText(){switch(this->_type){case CHE:return "车";case MA:return "马";case PAO:return "炮";case BING:return "兵";case JIANG:return "将";case SHI:return "士";case XIANG:return "相";}return "错误";}
};#endif // STONE_H

board.cpp

#include "Board.h"
#include <QPainter>
#include <QMouseEvent>
#include <QMessageBox>
#include<QTextStream>
Board::Board(QWidget *parent) :QWidget(parent){for(int i=0; i<32; ++i){_s[i].init(i);}_selectid = -1;_bRedTurn = true;
}void Board::paintEvent(QPaintEvent*)
{QPainter painter(this);int d = 40;_r = d / 2;// 画10横线for (int i = 1; i <= 10; ++i){painter.drawLine(QPoint(d, i * d), QPoint(9 * d, i * d));}// 画9竖线for (int i = 1; i <= 9; ++i){if (i == 1 || i == 9)painter.drawLine(QPoint(i * d, d), QPoint(i * d, 10 * d));else{painter.drawLine(QPoint(i * d, d), QPoint(i * d, 5 * d));painter.drawLine(QPoint(i * d, 6 * d), QPoint(i * d, 10 * d));}}// 九宫格painter.drawLine(QPoint(4 * d, 1 * d), QPoint(6 * d, 3 * d));painter.drawLine(QPoint(6 * d, 1 * d), QPoint(4 * d, 3 * d));painter.drawLine(QPoint(4 * d, 8 * d), QPoint(6 * d, 10 * d));painter.drawLine(QPoint(6 * d, 8 * d), QPoint(4 * d, 10 * d));// 绘制32个棋子for (int i = 0; i < 32; ++i){drawStone(painter, i);}
}QPoint Board::center(int row, int col)
{QPoint ret;ret.rx() = (col + 1) * _r * 2;ret.ry() = (row + 1) * _r * 2;return ret;
}QPoint Board::center(int id)
{return center(_s[id]._row, _s[id]._col);
}void Board::drawStone(QPainter& painter, int id)
{if (_s[id]._dead)return;QPoint c = center(id);QRect rect = QRect(c.x() - _r, c.y() - _r, _r * 2, _r * 2);if (id == _selectid)painter.setBrush(QBrush(Qt::gray));elsepainter.setBrush(QBrush(Qt::yellow));painter.setPen(Qt::black);painter.drawEllipse(center(id), _r, _r);if (_s[id]._red)painter.setPen(Qt::red);painter.setFont(QFont("system", _r, 700));painter.drawText(rect, _s[id].getText(), QTextOption(Qt::AlignCenter));
}bool Board::getRowCol(QPoint pt, int& row, int& col)
{for (row = 0; row <= 9; row++){for (col = 0; col <= 8; col++){QPoint c = center(row, col);int dx = c.x() - pt.x();int dy = c.y() - pt.y();int dist = dx * dx + dy * dy;if (dist < _r * _r)return true;}}return false;
}bool Board::isStoneAt(int row, int col)
{for (int i = 0; i < 32; ++i){if (_s[i]._row == row && _s[i]._col == col && !_s[i]._dead){return true;}}return false;
}bool Board::canMoveXIANG(int moveid, int row, int col, int killid)
{int fromRow = _s[moveid]._row;int fromCol = _s[moveid]._col;int toRow = row;int toCol = col;if (_s[moveid]._red && toRow > 4) return false; // 红方象不能过河if (!_s[moveid]._red && toRow < 5) return false; // 黑方象不能过河int rowDir = toRow - fromRow;int colDir = toCol - fromCol;if (abs(rowDir) != 2 || abs(colDir) != 2) return false;int checkRow = fromRow + rowDir / 2;int checkCol = fromCol + colDir / 2;if (isStoneAt(checkRow, checkCol)) return false; // 路径上有棋子if (killid != -1 && _s[killid]._red == _s[moveid]._red) return false;return true;
}bool Board::canMoveCHE(int moveid, int row, int col, int killid)
{int fromRow = _s[moveid]._row;int fromCol = _s[moveid]._col;int toRow = row;int toCol = col;if (fromRow != toRow && fromCol != toCol) return false;// 计算移动的方向int rowDir = fromRow < toRow ? 1 : (fromRow > toRow ? -1 : 0);int colDir = fromCol < toCol ? 1 : (fromCol > toCol ? -1 : 0);int checkRow = fromRow + rowDir;int checkCol = fromCol + colDir;while (checkRow != toRow || checkCol != toCol){if (isStoneAt(checkRow, checkCol)) return false; // 路径上有棋子checkRow += rowDir;checkCol += colDir;}// 如果有棋子被吃,检查是否是对方的棋子if (killid != -1 && _s[killid]._red == _s[moveid]._red) return false;return true;
}
bool Board::canMoveMA(int moveid, int row, int col, int killid)
{int fromRow = _s[moveid]._row;int fromCol = _s[moveid]._col;int toRow = row;int toCol = col;int rowDiff = toRow - fromRow;int colDiff = toCol - fromCol;// 检查移动是否是“日”字形状if ((abs(rowDiff) == 2 && abs(colDiff) == 1) || (abs(rowDiff) == 1 && abs(colDiff) == 2)){// 检查是否有棋子蹩马腿int legRow = fromRow + (rowDiff > 0 ? (rowDiff / 2) : -(abs(rowDiff) / 2));int legCol = fromCol + (colDiff > 0 ? (colDiff / 2) : -(abs(colDiff) / 2));if (!isStoneAt(legRow, legCol)) // 如果没有棋子蹩马腿{// 如果有棋子被吃,检查是否是对方的棋子if (killid != -1 && _s[killid]._red != _s[moveid]._red){return true; // 可以吃掉对方的棋子}else if (killid == -1){return true;}}}return false; // 不满足移动条件
}bool Board::canMovePAO(int moveid, int row, int col, int killid)
{int fromRow = _s[moveid]._row;int fromCol = _s[moveid]._col;int toRow = row;int toCol = col;if (fromRow != toRow && fromCol != toCol) return false;int rowDir = fromRow < toRow ? 1 : (fromRow > toRow ? -1 : 0);int colDir = fromCol < toCol ? 1 : (fromCol > toCol ? -1 : 0);// 检查移动路径上是否有其他棋子int checkRow = fromRow + rowDir;int checkCol = fromCol + colDir;int jumpCount = 0;while (checkRow != toRow || checkCol != toCol){if (isStoneAt(checkRow, checkCol)) jumpCount++;checkRow += rowDir;checkCol += colDir;}if (killid != -1){if (_s[killid]._red == _s[moveid]._red) return false;if (jumpCount != 1) return false; // 必须跳过一个棋子}else{if (jumpCount != 0) return false; // 如果没有吃子,不能跳过棋子}return true;
}bool Board::canMoveBING(int moveid, int row, int col, int killid)
{int fromRow = _s[moveid]._row;int fromCol = _s[moveid]._col;int toRow = row;int toCol = col;if (fromRow != toRow && fromCol != toCol) return false;int rowDiff = toRow - fromRow;int colDiff = toCol - fromCol;// 检查是否过河if (_s[moveid]._red && toRow >= 5) // 红方兵过河{if (abs(rowDiff) != 1) return false; // 过河后只能直走一格}else if (!_s[moveid]._red && toRow <= 4) // 黑方兵过河{if (abs(rowDiff) != 1) return false; // 过河后只能直走一格}else // 未过河{if (abs(rowDiff) != 1) return false; // 未过河只能直走一格}if (killid != -1 && _s[killid]._red == _s[moveid]._red) return false;}bool Board::canMoveJIANG(int moveid, int row, int col, int killid)
{if (_s[moveid]._red){if (row > 2)return false;}else{if (row < 7)return false;}if (col < 3) return false;if (col > 5) return false;int rowDir = _s[moveid]._row - row;int colDir = _s[moveid]._col - col;int d = abs(rowDir) * 10 + abs(colDir);if (d == 1 || d == 10)return true;return false;
}bool Board::canMoveSHI(int moveid, int row, int col, int killid)
{if (_s[moveid]._red){if (row > 2)return false;}else{if (row < 7)return false;}if (col < 3) return false;if (col > 5) return false;int rowDir = _s[moveid]._row - row;int colDir = _s[moveid]._col - col;int d = abs(rowDir) * 10 + abs(colDir);if (d == 11)return true;return false;}bool Board::canMove(int moveid, int row, int col, int killid)
{// 如果移动的棋子和被吃的棋子颜色相同,则切换选择if (_s[moveid]._red == _s[killid]._red && killid != -1){_selectid = killid;update();return false;}// 判断是否是主将被吃if (_s[killid]._type == Stone::JIANG && _s[killid]._red != _s[moveid]._red){QString winner = _s[moveid]._red ? "红方" : "黑方";QMessageBox::information(this, "胜利", "恭喜," + winner + "赢了!");return false; // 停止游戏}// 根据棋子类型调用相应的移动规则函数switch (_s[moveid]._type){case Stone::JIANG:return canMoveJIANG(moveid, row, col, killid);break;case Stone::SHI:return canMoveSHI(moveid, row, col, killid);break;case Stone::XIANG:return canMoveXIANG(moveid, row, col, killid);break;case Stone::CHE:return canMoveCHE(moveid, row, col, killid);break;case Stone::MA:return canMoveMA(moveid, row, col, killid);break;case Stone::PAO:return canMovePAO(moveid, row, col, killid);break;case Stone::BING:return canMoveBING(moveid, row, col, killid);break;default:return false;}return true;
}void Board::saveGameState() {// 假设你有一个数组来存储棋盘的状态,比如棋子的类型和位置QString fileName = "game_state.txt";QFile file("game.txt");if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::critical(this, "保存棋局状态", "无法打开文件进行保存!");return;}QTextStream out(&file);for (int i = 0; i < 32; ++i) {out << _s[i].getText() << "," << _s[i].getRow() << "," << _s[i].getCol() << "\n";}file.close();QMessageBox::information(this, "保存棋局状态", "棋局状态已成功保存!");
}void Board::mouseReleaseEvent(QMouseEvent *ev)
{QPoint pt = ev->pos();// 将pt转化成象棋的行列值// 判断这个行列值上面有没有棋子int row, col;bool bRet = getRowCol(pt, row, col);if(bRet == false) // 点到棋盘外return;int i;int clickid = -1;for(i=0;i<32;++i){if(_s[i]._row == row && _s[i]._col == col && _s[i]._dead== false){clickid = i;break;}}if(_selectid == -1){if(clickid != -1){if(_bRedTurn == _s[clickid]._red){_selectid = clickid;update();}}}else{if(canMove(_selectid, row, col, clickid)){/*走棋*/_s[_selectid]._row = row;_s[_selectid]._col = col;if(clickid != -1){_s[clickid]._dead = true;}_selectid = -1;_bRedTurn = !_bRedTurn;update();}else{// 不能移动棋子,给出提示QMessageBox::information(this, "提示", "该棋子不能移动到指定的位置!");// 如果点击的是另一个相同颜色的棋子,则切换选择if(clickid != -1 && _s[clickid]._red == _s[_selectid]._red){_selectid = clickid;update();}else{_selectid = -1; // 取消选择update();}}}}

main.cpp


#include <QApplication>
#include "Board.h"int main(int argc, char* argv[])
{QApplication app(argc, argv);Board board;board.show();return app.exec();
}

Stone.cpp

#include "Stone.h"Stone::Stone()
{}Stone::~Stone()
{}

二,具体分析

棋盘的绘制,棋子的绘制,以及选中棋子进行一系列操作都使用QT的库函数,所以在创建

board类时我们需要选择基于Qwidge作为父类

board.cpp是实现绘制棋盘,棋子,以及棋子运行逻辑的文件

Stone.h包含了棋子类

三,运行展示

相关文章:

基于QT和C++实现的中国象棋

一&#xff0c;源码 board.h #ifndef BOARD_H #define BOARD_H#include <QWidget> #include "Stone.h"class Board : public QWidget {Q_OBJECT public:explicit Board(QWidget *parent 0);bool _bRedTurn; // 红方先走int _currentPlayer; // 当前玩家&…...

Mojo崛起:AI-first 的编程语言能否成为新流行?

眨眼之间&#xff0c;你可能会错过又一种编程语言的发明。 有个笑话说&#xff0c;程序员花费20%的时间编写代码&#xff0c;80%的时间决定使用什么语言。 事实上&#xff0c;编程语言如此之多&#xff0c;以至于我们不确定实际有多少种。据估计&#xff0c;至少有700种编程语…...

【数据结构与算法】哈夫曼树与哈夫曼编码

文章目录 哈夫曼树&#xff08;最优二叉树&#xff09;定义举个&#x1f330;&#xff08;WPL的计算&#xff09; 哈夫曼树的构造&#xff08;最优二叉树的构造&#xff09;举个&#x1f330; 哈夫曼树的性质 哈夫曼编码定义构造 哈夫曼树&#xff08;最优二叉树&#xff09; …...

基于多头注意力机制卷积神经网络结合双向门控单元CNN-BIGRU-Mutilhead-Attention实现柴油机故障诊断附matlab代码

在使用这些深度学习库时&#xff0c;你可以按照以下步骤构建CNN-BIGRU-Multihead-Attention模型&#xff1a; 导入所需的库和模块。例如&#xff0c;在使用TensorFlow时&#xff0c;你可以导入tensorflow库和其他需要的模块。 定义输入层。根据你的数据&#xff0c;定义适当的…...

k8s redis 单节点部署

k8s redis 单节点部署kubectl 执行脚本 kubectl --kubeconfig ~/.kube-rz-real/config apply -f redis-leader.yaml -n rz-dt vi redis-leader.yamlapiVersion: apps/v1 kind: Deployment metadata:name: redis-leader-deploylabels:app: redisrole: leadertier: backend sp…...

科普童话投稿

《科普童话》杂志是由国家新闻出版总署批准、黑龙江省教育厅主管、黑龙江省语言文字报刊社主办的正规期刊。《科普童话》以培养科学素养与创新探索精神为办刊宗旨&#xff0c;以科学与艺术统一为编辑方针&#xff0c;以科学教育、教育科学作为自己的出发点&#xff0c;致力于对…...

【Ardiuno】使用ESP32单片机创建web服务通过网页控制小灯开关的实验(图文)

经过实验测试ESP32单片机的网络连接还是很方便的&#xff0c;这里小飞鱼按照程序实例的代码亲自实验一下使用Esp32生成的网页服务来实现远程无线控制小灯开关功能&#xff0c;这样真的是离物联网开发越来越近了&#xff0c;哈哈&#xff01; 连接好开发板和电路&#xff0c;将…...

百元蓝牙耳机哪款音质最好?四款实力超群机型推荐

在蓝牙耳机市场竞争日益激烈的今天&#xff0c;百元级别的耳机已经具备了令人瞩目的音质表现&#xff0c;对于追求高性价比的消费者来说&#xff0c;如何在众多选项中挑选出一款音质卓越的蓝牙耳机&#xff0c;无疑是一项重要而又充满挑战的任务&#xff0c;今天我将为大家推荐…...

Linux系统之mtr命令的基本使用

Linux系统之mtr命令的基本使用 一、mtr命令介绍二、mtr命令使用帮助2.1 mtr命令的帮助信息2.2 mtr帮助信息解释 三、安装mtr工具四、mtr命令的基本使用4.1 直接使用4.2 设定ping次数4.3 禁用DNS解析4.4 显示IP地址4.5 调整间隔 五、总结 一、mtr命令介绍 mtr命令是一个网络诊断…...

实战tcpdump4.99.4交叉编译

主要是记录交叉编译的一个坑&#xff0c;不知道为什么网上的教程都没遇到过。 环境 libpcap 1.10.4tcpdump 4.99.4WSL 编译步骤 注意事项 注意解压的时候文件夹名需要是libpcap-1.10.4&#xff0c;由于我是在github直接下载zip的压缩包名是libpcap-libpcap-1.10.4.tar.gz解…...

重生奇迹MU召唤术师简介

出生地&#xff1a;幻术园 性 别&#xff1a;女 擅 长&#xff1a;召唤幻兽、辅助魔法&攻击魔法 转 职&#xff1a;召唤巫师&#xff08;3转&#xff09; 介 绍&#xff1a;从古代开始流传下来的高贵的血缘&#xff0c;为了种族纯正血缘的延续及特殊使用咒术的天赋&…...

神经网络模型---AlexNet

一、AlexNet 1.导入tensorflow库&#xff0c;这里给简称为tf库 import tensorflow as tf from tensorflow.keras import datasets, layers, modelsdatasets&#xff1a;是用于训练和测试机器学习模型的数据集合 layers&#xff1a;是构建神经网络模型的关键组成部分 models&a…...

corona渲染器与vray比哪个好?支持云渲染平台吗

​在视觉渲染技术领域&#xff0c;V-Ray和Corona都以其卓越的性能和广泛应用赢得了高度评价。这两款渲染器各有其独特的优势&#xff0c;使得在它们之间做出选择并非易事。不同的应用场景和用户需求可能会让它们各自展现出不同的优势。 一、corona渲染器跟vray怎么样 在比较V-…...

每日一练:攻防世界:Ditf

这是难度1的题吗&#xff1f;&#xff1f;&#xff1f; 拿到一个png图片&#xff0c;第一反应就是CRC爆破&#xff0c;结果还真的是高度被修改了 这里拿到一个字符串&#xff0c;提交flag结果发现不是&#xff0c;那么只可能是密钥之类的了 看看有没有压缩包&#xff0c;搜索…...

约瑟夫环递归算法详解与实现

一、引言 约瑟夫环问题是一个著名的理论问题&#xff0c;其背景是在古罗马时期&#xff0c;有n个犯人被围成一个圈&#xff0c;从第一个人开始报数&#xff0c;每次报到m的人将被处决&#xff0c;然后从下一个人开始重新报数&#xff0c;直到所有人都被处决。这个问题可以用递…...

互联网应用主流框架整合之构建REST风格的系统

REST&#xff08;Representational State Transfer&#xff09;&#xff0c;中文译为“表述性状态转移”&#xff0c;是由Roy Fielding博士在他的博士论文中提出的一种软件架构风格&#xff0c;特别适用于网络应用的设计。REST不是一个标准&#xff0c;而是一种设计原则和约束集…...

vue3-自定义指令来实现input框输入限制

文章目录 前言具体实现分析主要部分详细解析导入和类型定义mounted 钩子函数unmounted 钩子函数指令注册使用 总结 前言 使用vue中的自定义指令来实现input框输入限制 其中关键代码强制触发input &#xff0c;来避免&#xff0c;输入规则外的字符时&#xff0c;没触发vue的响…...

MySQL日志——redolog

redo log&#xff08;重做日志&#xff09; 为什么需要redo log&#xff1f; 在mysql提交一个事务后&#xff0c;这个事务所作的数据修改并不会直接保存到磁盘文件中&#xff0c;而是先保存在buffer pool缓冲区中&#xff0c;在需要读取数据时&#xff0c;先从缓冲区中找&…...

Python热涨落流体力学求解算法和英伟达人工智能核评估模型

&#x1f3af;要点 &#x1f3af;平流扩散简单离散微分算子 | &#x1f3af;相场模拟&#xff1a;简单旋节线分解、枝晶凝固的 | &#x1f3af;求解二维波动方程&#xff0c;离散化时间导数 &#x1f3af;英伟达 A100 人工智能核性能评估模型 | &#x1f3af;热涨落流体动力学…...

【C语言】数组参数和指针参数详解

在写代码的时候难免要把【数组】或者【指针】传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 1 一维数组传参 #include <stdio.h> void test(int arr[])//ok? {} void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...