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

嵌入式学习第十七天

C语言小项目:

制作俄罗斯方块小游戏(全部)

主函数部分

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include "boarder.h"
#include "block.h"int cury = 1;
int curx = 16;
int curboxno = 0;
int nextboxno = 0;
int score = 0;int SetScore(void)
{char tmpbuff[1024] = {0};sprintf(tmpbuff, "%06d", score);strncpy(&gBoarder[BOARDER_HEIGHT/4*3][BOARDER_WIDTH/6*5-3], tmpbuff, 6);return 0;
}void handler(int signo)
{int i = 0;ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);cury = cury+1;ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();//判断当前这4行是否都能被消除 for (i = 0; i < 4 && cury + i < BOARDER_HEIGHT-1; i++){if (CanClearLine(cury+i)){ClearLine(cury+i);score++;SetScore();ShowMenu();}}curboxno = nextboxno;CreateBox(gBox, nextboxno);ClearBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);cury = 1;curx = 16;if (CanMoveBox(gBox, cury, curx)){MoveBox(gBox, cury, curx);ShowMenu();}else {exit(0);}}alarm(1);return;
}int main(void)
{char ch = 0;signal(SIGALRM, handler);system("stty -echo");system("stty -icanon min 1");srand(time(NULL));InitBoarder();SetBoarder();SetScore();curboxno = rand() % 19;CreateBox(gBox, curboxno);MoveBox(gBox, cury, curx);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);ShowMenu();alarm(1);while (1){ch = getchar();if ('a' == ch || 'A' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx-2)){MoveBox(gBox, cury, curx-2);ShowMenu();curx -= 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('w' == ch || 'W' == ch){ClearBox(gBox, cury, curx);CreateBox(gChangeBox, GetChangeBoxNo(curboxno));if (CanMoveBox(gChangeBox, cury, curx)){MoveBox(gChangeBox, cury, curx);memcpy(gBox, gChangeBox, sizeof(gChangeBox));curboxno = GetChangeBoxNo(curboxno);ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('d' == ch || 'D' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx+2)){MoveBox(gBox, cury, curx+2);ShowMenu();curx += 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('s' == ch || 'S' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);ShowMenu();cury += 1;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('p' == ch || 'P' == ch){alarm(0);}else if ('c' == ch || 'C' == ch){alarm(1);}else if ('q' == ch){exit(0);}}return 0;
}

游戏界面部分

/* 游戏界面的宽度 */
#define BOARDER_WIDTH	60/* 游戏界面的高度 */
#define BOARDER_HEIGHT	30extern unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];
extern int InitBoarder(void);
extern int SetBoarder(void);
extern int ShowMenu(void);
extern int CanClearLine(int LineNo);
extern int ClearLine(int LineNo);
/************************************************************ * 文件名:boarder.c * 功能: 游戏界面相关功能* ************************************************************/#include <stdio.h>
#include "boarder.h"/* 游戏界面的数据内容 */
unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];/* 初始化游戏界面数组内容 */
int InitBoarder(void)
{int i = 0;int j = 0;//1.对所有的元素都赋值为' 'for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[j][i] = ' ';}}return 0;
}/* 游戏界面加入边框 */
int SetBoarder(void)
{int i = 0;int j = 0;//1.第一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[0][i] = '#';}//2.最后一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT-1][i] = '#';}//3.第一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][0] = '#';gBoarder[j][1] = '#';}//4.最后一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH-1] = '#';gBoarder[j][BOARDER_WIDTH-2] = '#';}//5.界面中间选择一列赋值为'#',作为游戏区域和其他功能区域的划分for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH/3*2-2] = '#';gBoarder[j][BOARDER_WIDTH/3*2-1] = '#';}//6.游戏界面有方一行的一部分赋值为'#'for (i = BOARDER_WIDTH/3*2; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT/2][i] = '#';}return 0;
}/* 游戏界面的显示 */
int ShowMenu(void)
{int i = 0;int j = 0;printf("\033[2J");for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){if ('#' == gBoarder[j][i]){printf("\033[41;31m%c\033[0m", gBoarder[j][i]);}else if ('[' == gBoarder[j][i] || ']' == gBoarder[j][i]){printf("\033[40;30m%c\033[0m", gBoarder[j][i]);}else{printf("%c", gBoarder[j][i]);}}printf("\n");}return 0;
}int CanClearLine(int LineNo)
{int i = 0;for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){if (' ' == gBoarder[LineNo][i]){return 0;}}return 1;
}int ClearLine(int LineNo)
{int i = 0;int j = 0;for (j = LineNo; j > 1; j--){for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){gBoarder[j][i] = gBoarder[j-1][i];}}return 0;
}

功能部分

extern unsigned char gBox[4][8];
extern unsigned char gChangeBox[4][8];
extern unsigned char gNextBox[4][8];extern int InitBox(unsigned char (*pBox)[8]);
extern int CreateBox(unsigned char (*pBox)[8], int BoxNo);
extern int CanMoveBox(unsigned char (*pBox)[8], int y, int x);
extern int MoveBox(unsigned char (*pBox)[8], int y, int x);
extern int ClearBox(unsigned char (*pBox)[8], int y, int x);
extern int GetChangeBoxNo(int No);
/************************************************************ * 文件名:block.c * 功能: 俄罗斯方块功能* ************************************************************/#include <stdio.h>
#include "block.h"
#include "boarder.h"/* 俄罗斯方块数据 */
unsigned char gBox[4][8];/* 俄罗斯方块变形后数据 */
unsigned char gChangeBox[4][8];/* 俄罗斯方块下一个方块数据 */
unsigned char gNextBox[4][8];/* 初始化俄罗斯方块内容 */
int InitBox(unsigned char (*pBox)[8])
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){pBox[j][i] = ' ';}}return 0;
}/* 俄罗斯方块变形规则 */
int GetChangeBoxNo(int No)
{int DstNo = -1;switch (No){case 0:DstNo = 1;break;case 1:DstNo = 0;break;case 2:DstNo = 2;break;case 3:DstNo = 4;break;case 4:DstNo = 5;break;case 5:DstNo = 6;break;case 6:DstNo = 3;break;case 7:DstNo = 8;break;case 8:DstNo = 9;break;case 9:DstNo = 10;break;case 10:DstNo = 7;break;case 11:DstNo = 12;break;case 12:DstNo = 13;break;case 13:DstNo = 14;break;case 14:DstNo = 11;break;case 15:DstNo = 16;break;case 16:DstNo = 15;break;case 17:DstNo = 18;break;case 18:DstNo = 17;break;}return DstNo;
}/* 创建俄罗斯方块图形 */
int CreateBox(unsigned char (*pBox)[8], int BoxNo)
{int i = 0;int j = 0;InitBox(pBox);if (0 == BoxNo){//[][][][]//////for (i = 0; i < 8; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}}else if (1 == BoxNo){//[]//[]//[]//[]for (j = 0; j < 4; j++){pBox[j][0] = '[';pBox[j][1] = ']';}}else if (2 == BoxNo){//[][]//[][]////for (j = 0; j < 2; j++){for (i = 0; i < 4; i++){pBox[j][i] = (i % 2 == 0 ? '[' : ']');}}}else if (3 == BoxNo){//[][]//[]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[0][2] = '[';pBox[0][3] = ']';}else if (4 == BoxNo){//[][][]  //    []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][4] = '[';pBox[1][5] = ']';}else if (5 == BoxNo){//  []//  []//[][]//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[2][0] = '[';pBox[2][1] = ']';}else if (6 == BoxNo){//[]//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][0] = '[';pBox[0][1] = ']';}else if (7 == BoxNo){//[][]//  []//  []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[0][0] = '[';pBox[0][1] = ']';}else if (8 == BoxNo){//    []//[][][] ////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][4] = '[';pBox[0][5] = ']';}else if (9 == BoxNo){//[]//[]//[][]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[2][2] = '[';pBox[2][3] = ']';}else if (10 == BoxNo){//[][][]//[]////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][0] = '[';pBox[1][1] = ']';}else if (11 == BoxNo){//  []//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][2] = '[';pBox[0][3] = ']';}else if (12 == BoxNo){//[]//[][]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[1][2] = '[';pBox[1][3] = ']';}else if (13 == BoxNo){//[][][]//  []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][2] = '[';pBox[1][3] = ']';}else if (14 == BoxNo){//  []//[][]//  []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[1][0] = '[';pBox[1][1] = ']';}else if (15 == BoxNo){//[]//[][]//  []//for (j = 0; j < 2; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 1; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (16 == BoxNo){//  [][]//[][]////for (i = 2; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 0; i < 4; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}else if (17 == BoxNo){//  []//[][]//[]//for (j = 1; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 0; j < 2; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (18 == BoxNo){//[][]//  [][]////for (i = 0; i < 4; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 2; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}return 0;
}/* 判断俄罗斯方块是否能够移动到指定游戏界面位置 */
int CanMoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if ((pBox[j][i] == '[' || pBox[j][i] == ']') && (gBoarder[j+y][i+x] != ' ')){return 0;}}}return 1;
}/* 将俄罗斯方块移动到游戏界面中 */
int MoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = pBox[j][i];}}}return 0;
}/* 将俄罗斯方块从游戏界面中清除 */
int ClearBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = ' ';}}}return 0;
}

完成后成果图:

相关文章:

嵌入式学习第十七天

C语言小项目&#xff1a; 制作俄罗斯方块小游戏&#xff08;全部&#xff09; 主函数部分 #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include "b…...

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…...

数学建模-退火算法和遗传算法

退火算法和遗传算法 一&#xff0e;退火算法 退火算法Matlab程序如下&#xff1a; [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…...

Qt开源版 vs 商业版 详细比较!!!!

简单整理Qt开源版与商业版有哪些差别&#xff0c;仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…...

华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书

2024年1月25日&#xff0c;中国人工智能产业发展联盟智能化软件工程工作组&#xff08;AI for Software Engineering&#xff0c;下文简称AI4SE&#xff09;在京召开首届“AI4SE创新巡航”活动。在活动上&#xff0c;华为云大模型辅助系统测试代码生成荣获“2023AI4SE银弹优秀案…...

小程序的应用、页面、组件生命周期(超全版)

小程序生命周期 应用的生命周期 onLaunch: 初始化小程序完成时触发&#xff0c;且全局只触发一次&#xff1b; onShow: 小程序初始化完成&#xff08;启动&#xff09;或从后台切换到前台显示时触发&#xff1b; onHide: 小程序从前台切换到后台隐藏时触发&#xff08;如切换…...

TCP四次握手

TCP 协议在关闭连接时&#xff0c;需要进行四次挥手的过程&#xff0c;主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下&#xff1a; 客户端发送 FIN 包&#xff1a;客户端发送一个 FIN 包&#xff0c;其中 FIN 标识位为 1&#xff0c…...

EBC金融英国CEO:高波动性周期下,如何寻找市场的稳定性?

利率主导的市场&#xff0c;将在2024年延续。目前&#xff0c;固收市场对于降息的定价&#xff0c;正通过利率传导至不同资产中。尽管市场迫切利用通胀去佐证降息&#xff0c;但各国央行仍囿于通胀目标的政策桎梏。政策和市场预期的博弈将继续牵动市场脉搏&#xff0c;引发价格…...

C++ Web 编程

什么是 CGI&#xff1f; 公共网关接口&#xff08;CGI&#xff09;&#xff0c;是一套标准&#xff0c;定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前是由 NCSA 维护的&#xff0c;NCSA 定义 CGI 如下&#xff1a;公共网关接口&#xff08;CGI&…...

docker笔记整理

Docker 安装 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin 启动docker systemctl start docker 查看docker状态 s…...

什么是git,怎样下载安装?

简介&#xff1a; 应用场景&#xff1a; 应用场景&#xff1a;团队企业开发 作用&#xff1a; 安装&#xff1a; 1.网址&#xff1a;Git - Downloads 很卡很慢 2.可以选择镜像网站下载&#xff08;推荐&#xff09; CNPM Binaries Mirror...

Camille-学习笔记-测试流程和测试设计

## 测试用例学习路线 startmindmap * 测试用例 ** 黑盒测试方法论 *** 等价类 *** 边界值 *** 因果图 *** 判定表 *** 场景法 *** 基于模型的测试 ** 白盒测试方法论 ** 测试用例基础概念 ** 测试用例设计 ** 面试测试用例设计 ** 常用测试策略与测试手段 endmindmap **测试用…...

【Python笔记-设计模式】建造者模式

一、说明 又称生成器&#xff0c;是一种创建型设计模式&#xff0c;使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。 (一) 解决问题 对象的创建问题&#xff1a;当一个对象的构建过程复杂&#xff0c;且部分构建过程相互独立时&#xff0c;可…...

【LVGL源码移植】

LVGL源码移植 ■ LVGL源码移植一&#xff1a;下载LVGL源码二&#xff1a;修改LVGL文件夹1: 将这5个文件&#xff0c;复制到一个新的文件夹2: 简化文件&#xff0c;减少内存消耗&#xff08;去除不必要的文件&#xff09;3: 为了规范化&#xff0c;我们将下列文件进行重命名 三&…...

双非本科准备秋招(14.2)—— 进程与线程

进程 进程是运行着的程序&#xff0c;是程序在操作系统的一次执行过程&#xff0c;进程是操作系统分配资源的基本单位。 启动一个java程序&#xff0c;操作系统就会创建一个java进程 进程也可以看作一个程序的实例&#xff0c;大部分程序可以运行多个实例进程&#xff0c;比如记…...

数据结构和算法笔记5:堆和优先队列

今天来讲一下堆&#xff0c;在网上看到一个很好的文章&#xff0c;不过它实现堆是用Golang写的&#xff0c;我这里打算用C实现一下&#xff1a; Golang: Heap data structure 1. 基本概念 满二叉树&#xff08;二叉树每层节点都是满的&#xff09;&#xff1a; 完全二叉树&a…...

第8章 SpringBoot任务管理

学习目标 熟悉SpringBoot整合异步任务的实现 熟悉SpringBoot整合定时任务的实现 熟悉SpringBoot整合邮件任务的实现 开发web应用时,多数应用都具备任务调度功能。常见的任务包括异步任务,定时任务和发邮件任务。我们以数据库报表为例看看任务调度如何帮助改善系统设计。报表可…...

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件&#xff0c;然后将多个结构的STL文件类型的模型进行组装&#xff0c;形成6轴机械臂三维模型的显示&#xff0c;并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader&#xff0c;用于加载STL文件&#xff0c;并进…...

路由进阶

文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…...

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...