【C语言习题】12.扫雷游戏

news2024/11/16 11:25:46

文章目录

    • 1.扫雷游戏分析和设计
      • 1.1 扫雷游戏的功能说明
      • 1.2游戏界面:
      • 1.3游戏的分析和设计
        • 1.2.1 数据结构的分析
        • 1.2.2 ⽂件结构设计
    • 2.扫雷游戏的代码实现
    • 3.代码讲解


1.扫雷游戏分析和设计

1.1 扫雷游戏的功能说明

  • 使用控制台实现经典的扫雷游戏
  • 游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格子
  • 默认随机布置10个雷
  • 可以排查雷
    • 如果位置不是雷,就显示周围有几个雷
    • 如果位置是雷,就炸死游戏结束
    • 把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束

1.2游戏界面:

在这里插入图片描述在这里插入图片描述
初始界面排雷界面
在这里插入图片描述在这里插入图片描述
排雷失败界面排雷成功界面

为了方便演示,我把排雷成功的设置成了2x2的,方便成功。


1.3游戏的分析和设计

1.2.1 数据结构的分析

我们先看一下扫雷的图片:

在这里插入图片描述在这里插入图片描述

这一个个框框看着很像数组,事实上我们可以用数组来存放扫雷游戏需要的数据。

  • 点击前:全是*

  • 点击后:有雷,我们就存放1,没有雷就存放0。

如果我们没有被雷炸到,那么我们点击的地方会显示周围有几个雷。

在这里插入图片描述在这里插入图片描述

上面的表格里面,一开始我们不知道里面有啥,然后点了最中间的那个。

然后就出现了1(因为点击的周围有一个雷)。图2里面的雷和无雷是为了方便理解写出来的。

在这里插入图片描述

如果我们在[1][1]处点击,那么就要统计[0][0],[0][1],[0][2],[1][0],[1][2],[2][0],[2][1],[2][2]这8个地方一共有几个雷。

可如果在[2][2]这个地方点击呢?只要统计3个地方了。

难道我们要分多钟情况去考虑吗?

当然不是,我们可以建造一个比实际需要的扫雷数组大一圈的数组。

在这里插入图片描述

例如我们只需要中间的3X3的数组用作扫雷游戏,那么我们可以准备一个5X5的数组,这样每个扫雷游戏的区域都可以采用一样的方法来统计周围有几个雷了。

同样的,我们要准备两个结构一样的数组,一个用来存放雷和非雷的数据,另一个用来显示。

可以理解为一个是前端,一个是后端。

  • 然后我们让雷是1,非雷是0(后端)

  • 未知的地方放*,已知的地方显示周围雷的数字(前端)

1.2.2 ⽂件结构设计

因为工程有点大,我们可以用3个文件来完成这个游戏。

test.c //文件中写游戏的测试逻辑 
game.c //文件中写游戏中函数的实现等
game.h //文件中写游戏需要的数据类型和函数声明等

2.扫雷游戏的代码实现

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
       int i = 0;
       int j = 0;
       for (i = 0; i < rows; i++) {
              for (j = 0; j < cols; j++) {
                      board[i][j] = set;
              }
       }
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
       int i = 0;
       int j = 0;
       printf("-----------------扫雷游戏-----------------\n");
       for (j = 0; j <= col; j++) {
              printf("%d ", j);
       }
       printf("\n");

       for (i = 1; i <= row; i++) {
              printf("%d ", i);
              for (j = 1; j <= col; j++) {
                      printf("%c ", board[i][j]);
              }
              printf("\n");
       }
       printf("-----------------扫雷游戏-----------------\n");
}

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col) {
    	//布置10个雷
 		//生成随机的坐标,布置雷

       int count = EASY_COUNT;

       //横坐标:1-9;纵坐标:1-9
       while (count) {
              int  x = rand() % row + 1;
              int  y = rand() % col + 1;

              if (board[x][y] == '0') {
                      board[x][y] = '1';
                      count--;
              }
       }
}
//计算指定位置附近雷的个数
int get_mine_count(char board[ROWS][COLS], int x, int y) {
       return (board[x - 1][y] +
              board[x - 1][y - 1] +
              board[x][y - 1] +
              board[x + 1][y - 1] +
              board[x + 1][y] +
              board[x + 1][y + 1] +
              board[x][y + 1] +
              board[x - 1][y + 1] - 8 * '0');
    //8个坐标的值要么是'0'要么是'1',加起来后减去8个'0'就可以得到他们的和了,也就是有几个雷
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
       int x = 0;
       int y = 0;
       int win = 0;//找到非雷的个数
       while (win < row * col - EASY_COUNT) {
              printf("请输入要排查的坐标:>");
              scanf("%d%d", &x, &y);
              if (x >= 1 && x <= row && y >= 1 && y <= col) {
                      if (show[x][y] != '*') {
                             printf("该坐标被排查过了,不能重复排查\n");
                      }
                      else {
                             //如果是雷
                             if (mine[x][y] == '1') {
                                    printf("很遗憾,你被炸死了\n");
                                    DisplayBoard(mine, ROW, COL);
                                    break;
                             }
                             //如果不是雷
                             else {
                                    win++;
                                    //统计mine数组中x,y坐标周围有几个雷
                                    int count = get_mine_count(mine, x, y);
                                    show[x][y] = count + '0';//转换成  数字字符
                                    DisplayBoard(show, ROW, COL);
                             }
                      }
                      
              }
              else {
                      printf("输入坐标非法,请重新输入\n");
              }
       }
       if (win == row * col - EASY_COUNT) {
              printf("恭喜你,排雷成功\n");
              DisplayBoard(mine, ROW, COL);
       }
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void menu() {
    printf("************************************\n");
    printf("********  1. play  0. exit  ********\n");
    printf("************************************\n");
}

void game() {
    char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
    char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
    //初始化内容为指定的内容
    //mine 数组在没有布置雷的时候,都是‘0’
    InitBoard(mine, ROWS, COLS, '0');
    //show 数组在没有排查雷的时候,都是‘*’
    InitBoard(show, ROWS, COLS, '*');
    
    //设置雷
    SetMine(mine, ROW, COL);

    //DisplayBoard(mine, ROW, COL);
    DisplayBoard(show, ROW, COL);

    //排查雷
    FindMine(mine, show, ROW, COL);
}

int main() {
    int input = 0;
    //设置随机数的生成起点
    srand((unsigned int)time(NULL));
    do {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input) {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);

    return 0;
}

3.代码讲解

  1. 我们先找main()函数,在test.c文件里。

  2. int input = 0;这个定义了变量input用来让我们确认自己是玩游戏还是退出游戏。

  3. srand((unsigned int)time(NULL));这个是为了给rand 函数设定随机数种子。关于rand函数的详细解释在我之前发布的2.猜数字游戏这个文档里有详细解释,这里就不多赘述了。

    time()函数需要用到#include <time.h>这个头文件。
    rand函数的使用需要包含#include <stdlib.h>这个头文件。

  4. 接下来进入do while循环,先进入menu()函数【这个函数在test.c里面】,打印

    ************************************
    ********  1. play  0. exit  ********
    ************************************
    
  5. 然后进入【test.c】35行,printf("请选择:>");打印:请选择:>

  6. 进入【test.c】36,输入选择,根据不同选择进入switch语句里的case 1,case 0,default

  7. 进入case 0就打印退出游戏,然后退出游戏

  8. 进入default就打印选择错误,然后跳出switch语句,进入while的判断。因为input为0的时候才跳出循环,所以这里会继续进入循环。

  9. 进入case 1就进入game()函数【这个函数在test.c里面】

  10. 进入【test.c】11行char mine[ROWS][COLS] = { 0 };存放布置好的雷的信息(我们表面上看不到的后台的数据)

  11. 进入【test.c】12行char show[ROWS][COLS] = { 0 };存放排查出的雷的信息(我们看到的部分,前台的图案)

  12. 然后初始化内容为指定的内容,进入【test.c】15行 InitBoard(mine, ROWS, COLS, '0');设置mine 数组(后台)在没有布置雷的时候,都是‘0’

  13. 这个InitBoard()函数在【game.c】里面第5行,用来初始化棋盘。

    void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
           int i = 0;
           int j = 0;
           for (i = 0; i < rows; i++) {
                  for (j = 0; j < cols; j++) {
                          board[i][j] = set;
                  }
           }
    }
    

    这里第4个参数设置成了char set,设置的很完美,这样不管是想在里面放'*'还是'0'都可以完成,而不需要设置两个结构一样的函数。

  14. 进入【test.c】17行InitBoard(show, ROWS, COLS, '*');设置show 数组(前台)在没有排查雷的时候,都是‘*’

  15. 进入【test.c】20行 SetMine(mine, ROW, COL);用来设置雷

  16. 这个SetMine()函数在【game.c】里面第35行,用来布置雷

    //布置雷
    void SetMine(char board[ROWS][COLS], int row, int col) {
        	//布置10个雷
     		//生成随机的坐标,布置雷
    
           int count = EASY_COUNT;
    
           //横坐标:1-9;纵坐标:1-9
           while (count) {
                  int  x = rand() % row + 1;
                  int  y = rand() % col + 1;
    
                  if (board[x][y] == '0') {
                          board[x][y] = '1';
                          count--;
                  }
           }
    }
    

    因为实参是mine(mine 数组(后台)),所以这里设置的雷是给后台设置的。

  17. 进入int count = EASY_COUNT;,定义了一个变量count,这个count赋值为EASY_COUNT,EASY_COUNT在【game.h】里面第12行

    #define EASY_COUNT 10
    

    相当于一个宏定义,定义EASY_COUNT就是10。这么做有个好处,就是如果想要更改雷的数量直接更改宏定义里面的10就可以了,否则的话,我们要去定义变量的地方更改,变量多了就容易分不清。

  18. 这里是定义了有10个雷,因为count=10,【之前的宏定义里面EASY_COUNT就是10】

  19. 然后进入while循环,进入第10行,int x = rand() % row + 1;这个是给x一个1-9的随机数【x是数组横坐标】。

    为什么rand() % row + 1是1-9的随机数?

    之前在我之前发布的2.猜数字游戏这个文档里有详细解释,我取关键的一段结论出来:

    如果我们想要生成a~b的随机数,

    a + rand()%(b-a+1)
    

    这就得到了,a~b的值。

    这里面1-9就相当于:

    1 + rand()%(9-1+1)
    

    化简一下就是:

    1 + rand()%(9)
    

    前面【game.h】文件里还有四个宏定义

    #define ROW 9//代表扫雷行号9行
    #define COL 9//代表扫雷列号9列
    
    #define ROWS ROW+2//代表11行
    #define COLS COL+2//代表11列
    

    这里的ROWSCOLS是前面说过的建造一个比实际需要的扫雷数组大一圈的数组,来避免分类讨论带来的复杂情况,所以加2,大了一圈。

    让我们回到int x = rand() % row + 1;这个row是形参,形参是由实参传递过来的。它对应的实参是ROW,也就是9。

    所以符合上面化简得结果。

  20. 和上一条类似,int y = rand() % col + 1;这个是给y一个1-9的随机数【y是数组纵坐标】。

  21. 然后:

    if (board[x][y] == '0') {
        board[x][y] = '1';
        count--;
    }
    

    是一个简单的判断条件:如果我们生成随机数的地方是0(也就是没雷),那么就把0改成1。同时雷的个数就减1。然后重新进入while循环。

    如果我们生成随机数的地方是1(也就是有雷),那么就不执行这个if语句,然后重新进入while循环。

  22. 然后让我们回到【test.c】文件的第23行,DisplayBoard(show, ROW, COL);这个会让我们进入【game.c】文件的15行,为了方便看,我把代码拿下来

    //打印棋盘
    void DisplayBoard(char board[ROWS][COLS], int row, int col) {
           int i = 0;
           int j = 0;
           printf("-----------------扫雷游戏-----------------\n");
           for (j = 0; j <= col; j++) {
                  printf("%d ", j);
           }
           printf("\n");
    
           for (i = 1; i <= row; i++) {
                  printf("%d ", i);
                  for (j = 1; j <= col; j++) {
                          printf("%c ", board[i][j]);
                  }
                  printf("\n");
           }
           printf("-----------------扫雷游戏-----------------\n");
    }
    

    show 数组(前台),show作为实参,将show数组传递给了board数组。

  23. 先定义前台数组的行号i和列号j。然后打印-----------------扫雷游戏-----------------

    在这里插入图片描述

    这个行号就是我花红色方框的那行,列号是蓝色方框那列。

  24. 进入第一个for循环打印行号0-9,然后回车。

  25. 进入第二个for循环先打印列号1然后进入内嵌的for循环,将列号为1 的那行全打印*,然后进入外面那个for循环打印列号2然后进入内嵌的for循环,依此类推。

  26. 最后打印:-----------------扫雷游戏-----------------

  27. DisplayBoard(show, ROW, COL);函数结束,进入FindMine(mine, show, ROW, COL);来排查雷。

  28. 这个会让我们进入【game.c】文件的65行,为了方便看,我把代码拿下来:

    //排查雷
    void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
           int x = 0;
           int y = 0;
           int win = 0;//找到非雷的个数
           while (win < row * col - EASY_COUNT) {
                  printf("请输入要排查的坐标:>");
                  scanf("%d%d", &x, &y);
                  if (x >= 1 && x <= row && y >= 1 && y <= col) {
                          if (show[x][y] != '*') {
                                 printf("该坐标被排查过了,不能重复排查\n");
                          }
                          else {
                                 //如果是雷
                                 if (mine[x][y] == '1') {
                                        printf("很遗憾,你被炸死了\n");
                                        DisplayBoard(mine, ROW, COL);
                                        break;
                                 }
                                 //如果不是雷
                                 else {
                                        win++;
                                        //统计mine数组中x,y坐标周围有几个雷
                                        int count = get_mine_count(mine, x, y);
                                        show[x][y] = count + '0';//转换成  数字字符
                                        DisplayBoard(show, ROW, COL);
                                 }
                          }
                          
                  }
                  else {
                          printf("输入坐标非法,请重新输入\n");
                  }
           }
           if (win == row * col - EASY_COUNT) {
                  printf("恭喜你,排雷成功\n");
                  DisplayBoard(mine, ROW, COL);
           }
    }
    

    show 数组(前台),mine 数组(后台)

  29. .先定义了数组横坐标x和纵坐标y,初始化为0。然后定义win为找到非雷的个数。

  30. 进入while循环,如果win < row * col - EASY_COUNT那么循环继续,也就是说只要玩家排查的非雷格子数量小于需要排查的总数,游戏的主循环就会继续运行。在这个循环中,玩家输入坐标来排查雷,如果排查到雷,游戏结束;如果排查到非雷格子, win 的值会增加,并且游戏会继续。

    如果运气非常好,把所有雷都排除了,并且把其他非雷的地方也全选了,那么就会让win = row * col - EASY_COUNT从而跳出while循环,执行下面的:

    if (win == row * col - EASY_COUNT) {
        printf("恭喜你,排雷成功\n");
        DisplayBoard(mine, ROW, COL);
    }
    

    打印:恭喜你,排雷成功,然后调用DisplayBoard(mine, ROW, COL);,将输入结果打印。

  31. 在没有把雷排完前会先在循环里,先打印:请输入要排查的坐标:>,然后输入自己选择的坐标,

    if (x >= 1 && x <= row && y >= 1 && y <= col)这个是为了确认自己输入的坐标没有越界。

    然后进入内层判断,如果输入的坐标处已经不是*了,也就是之前这个坐标输入过了,就打印:该坐标被排查过了,不能重复排查

    否则就进入else,然后进入内部的if,

    //如果是雷
    if (mine[x][y] == '1') {
        printf("很遗憾,你被炸死了\n");
        DisplayBoard(mine, ROW, COL);
        break;
    }
    

    如果输入的地方在mine数组(也就是后台)里面放的是1(地雷),就会输入:很遗憾,你被炸死了

    如果没被炸死就进入else,

    //如果不是雷
    else {
        win++;
        //统计mine数组中x,y坐标周围有几个雷
        int count = get_mine_count(mine, x, y);
        show[x][y] = count + '0';//转换成  数字字符
        DisplayBoard(show, ROW, COL);
    }
    

    先给win加1,然后定义count来接受来自get_mine_count(mine, x, y);这个函数的返回值。

    这个函数在【game.c】文件的第53行,为了方便看,我把代码拿下来:

    //计算指定位置附近雷的个数
    int get_mine_count(char board[ROWS][COLS], int x, int y) {
        return (board[x - 1][y] +
                board[x - 1][y - 1] +
                board[x][y - 1] +
                board[x + 1][y - 1] +
                board[x + 1][y] +
                board[x + 1][y + 1] +
                board[x][y + 1] +
                board[x - 1][y + 1] - 8 * '0');
        //8个坐标的值要么是'0'要么是'1',加起来后减去8个'0'就可以得到他们的和了,也就是有几个雷
    }
    

    返回的值是我们输入数组坐标的身旁8个位置的字符减去8个'0'

    因为'0'-'0'=0'1'-'0'=1,8个位置依次完成这个操作就相当于8个位置加起来减去8个'0',得到的返回值就是输入坐标周围的雷的个数的值。

  32. 我们把这个值给count,然后把count的值加上'0',就可以得到输入坐标周围的雷的个数的字符。(注意上面是值,这边是字符)

  33. 然后用这个字符来替换数组输入位置原来的符号。

  34. 最后打印:DisplayBoard(show, ROW, COL);,将输入结果打印。

  35. 直到被炸死或者排雷成功游戏才会结束。

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

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

相关文章

机器学习案例:加州房产价格(四)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/#_12 数据探索和可视化、发现规律 通过之前的工作&#xff0c;你只是快速查看了数据&#xff0c;对要处理的数据有了整体了解&#xff0c;现在的目标是更深的探索数据。 首先&#xff0c;保证你将测试集放在了一旁&…

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…

HyperLogLog的使用做UV统计

使用Jedis连接Redis并操作HyperLogLog import redis.clients.jedis.Jedis;public class RedisHyperLogLogExample {public static void main(String[] args) {// 连接到本地的Redis服务Jedis jedis new Jedis("localhost", 6379);String hyperLogLogKey "hll…

智慧安防系统:构建更安全的社区环境

随着科技的不断进步&#xff0c;人们的生活质量得到了显著提高。然而&#xff0c;与此同时&#xff0c;社会治安问题也日益凸显。为了维护社会的和谐稳定&#xff0c;提高人们的生活安全感&#xff0c;智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分…

默认成员函数:析构、深浅拷贝

析构函数 析构函数&#xff1a;与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数&#xff0c;完成对象中资源的清理工作。 特性 析构函数名时在类名前面加上字符~ class D…

Python 全栈体系【四阶】(四十三)

第五章 深度学习 九、图像分割 3. 常用模型 3.4 DeepLab 系列 3.4.1 DeepLab v1(2015) 3.4.1.1 概述 图像分割和图像分类不一样&#xff0c;要对图像每个像素进行精确分类。在使用CNN对图像进行卷积、池化过程中&#xff0c;会导致特征图尺寸大幅度下降、分辨率降低&…

旧手机-基于Termux配置服务器(不用拿去换钢盆了)

Hi&#xff0c;大家好&#xff0c;我是抢老婆酸奶的小肥仔。 大家用手机这么多年了&#xff0c;手上或多或少都有一两个被替换下来的旧手机&#xff0c;也不用拿去换啥钢盆了&#xff0c;使用Termux可以将旧手机改造成一个服务器。 不多说&#xff0c;直接开干。 1、安装app…

Java应用程序的本地内存跟踪分析

本文将讨论本机内存跟踪 (NMT)&#xff0c;我们可以使用它来隔离在 VM 级别增长的任何异常内存。 1.什么是本机内存&#xff1f; 本机内存是指计算机系统上运行的应用程序或程序可直接访问的内存空间。它是程序在执行期间存储和操作数据的内存区域。本机内存不同于托管内存&a…

单调栈练习

最大矩形面积 如果栈为空&#xff0c;或者新的元素是大于栈顶元素的&#xff0c;那么新来的元素不会破坏栈的单调性&#xff0c;那么就把这个柱子入栈。 特别注意&#xff1a;这里的s.empty()和s.top().height < a不能调换顺序&#xff0c;包括后面的判断也要先判断栈是否为…

分析 vs2019 cpp20 规范的 STL 库模板 function ,源码注释并探讨几个问题

&#xff08;1 探讨一&#xff09;第一个尝试弄清的问题是父类模板与子类模板的模板参数的对应关系&#xff0c;如下图&#xff1a; 我们要弄清的问题是创建 function 对象时&#xff0c;传递的模板参数 _Fty , 传递到其父类 _Func_class 中时 &#xff0c;父类的模板参数 _Ret…

QT状态机4-使用并行状态来避免组合爆炸

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent):

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;的一阶环形倒立摆控制系统&…

分布式搜索-elaticsearch基础 安装es

这里是在虚拟机的Linux系统里安装es的教程: 1.创建网络 在Finashell终端输入指令 docker network create es-net 2.将es.tar安装包放入tmp的目录下 输入指令加载镜像&#xff1a;docker load -i es.tar 3.再运行docker 命令 docker run -d \--name es \-e "ES_JAVA_O…

NVM安装及VUE创建项目的N种方式

VUE 参考官网&#xff1a;https://cli.vuejs.org/zh/guide/ NVM安装 我们开发过程中常常遇到nodejs版本不适配的问题&#xff0c;需要切换到不同版本的nodejs&#xff0c;nodejs卸载安装麻烦&#xff0c;这就需要用到nvm了。 nvm 全名 node.js version management 顾名思义是…

基于SVPWM的飞轮控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM的飞轮控制系统的simulink建模与仿真。SVPWM的核心思想是将逆变器输出的三相电压矢量在两相静止坐标系&#xff08;αβ坐标系&#xff09;中表示&#xff0c;通过控…

苹果智能戒指新专利,用于与VR头显或Vision Pro配合使用

近日&#xff0c;美国专利商标局向苹果公司授予了一项新专利&#xff0c;该专利涉及一种可扩展的智能戒指配件。最新的专利指出&#xff0c;该配件专门用于与VR头显或Vision Pro配合使用&#xff0c;这比戴VR手套更准确&#xff0c;用户可以根据应用场景佩戴一个或多个戒指。 …

一本书打通SLAM在智能汽车/自动驾驶领域应用

自动驾驶技术已成为当今数字化时代汽车行业的热点话题之一。随着技术的不断成熟&#xff0c;越来越多的车辆采用激光SLAM&#xff08;即时定位与地图构建&#xff09;和视觉SLAM技术&#xff0c;实现更高层次的智能网联汽车。SLAM技术在智能网联汽车中的应用是非常重要的&#…

数据结构——01-抽奖数人-链表-实验题目与解答

数据结构抽奖数人链表实验题目与解答 一、**实验题目** 抽奖游戏&#xff1a; n个人围成一圈&#xff0c;由第一个人开始&#xff0c;依次报数&#xff0c;数到第m人&#xff0c;便抽出来作为中奖人&#xff0c;然后从他的下一个人数起&#xff0c;数到第m人&#xff0c;再抽…

免费思维13招之十一:利润型思维

免费思维13招之十一:利润型思维 免费思维的另一大战略思维——利润型思维。 什么是利润型思维呢?就是用后期的利润来支付现在的成本。也就是“花未来的钱,办现在的事”。 我们在销售自己的产品时候,最容易犯的一个件事,就是降价,我们先来看一个案例: 前几年,有一个卖…

2025CISP深圳国际体育展引领运动潮流,展中国体育辉煌

2025CISP深圳国际体育展将于2月27日至3月1日在深圳福田会展中心举行&#xff0c;参展企业超300家&#xff0c;展览规模达20000平方米&#xff0c;参展企业数量、品牌和产品品类均创历史新高。现场汇集了全球最前沿的体育用品&#xff0c;成为体育产业的风向标。无论你是体育爱好…