【C语言篇】数组和函数的实践:扫雷游戏(附源码)

news2024/12/23 15:04:33

文章目录

  • 前言
  • 扫雷游戏的分析和设计
    • 扫雷游戏的功能说明
    • 游戏的分析和设计
    • 文件结构设计
  • 扫雷游戏的代码实现
    • 初始化棋盘
    • 打印棋盘
    • 布置雷
    • 排查雷
  • 扫雷游戏的拓展

前言

源码在最后

扫雷游戏的分析和设计

经典扫雷游戏

扫雷游戏的功能说明

使⽤控制台实现经典的扫雷游戏

  • 游戏可以通过菜单实现继续玩或者退出游戏

  • 扫雷的棋盘是9*9的格⼦

  • 默认随机布置10个雷

  • 可以排查雷

    • 如果位置不是雷,就显⽰周围有⼏个雷
    • 如果位置是雷,就炸死游戏结束
    • 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

游戏的界⾯
在这里插入图片描述

被炸死,游戏结束

在这里插入图片描述


游戏的分析和设计

扫雷的过程中,布置的雷排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。

因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放信息。

在这里插入图片描述

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

在这里插入图片描述

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1

假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11⽐较合适。

在这里插入图片描述

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。

这⾥我们肯定有办法解决,⽐如:雷和⾮雷的信息不要使⽤数字,使⽤某些字符就⾏,这样就避免冲突了,但是这样做棋盘上有雷和⾮雷的信息,还有排查出的雷的个数信息,就⽐较混杂,不够⽅便。

这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。

同时为了保持神秘,show数组开始时初始化为字符 '*'为了保持两个数组的类型⼀致,可以使⽤同⼀套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'

如下:

在这里插入图片描述

对应的数组应该是:

char mine[11][11] = {0};//⽤来存放布置好的雷的信息
char show[11][11] = {0};//⽤来存放排查出的雷的个数信息

文件结构设计

之前在【C语言篇】从零带你全面了解函数(包括隐式声明等)介绍了多⽂件的形式对函数的声明和定义,这⾥我们实践⼀下,我们设计三个⽂件:

⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。

函数的声明、类型的声明以及使用的库函数所需要包含的头文件都放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。 如下:

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

扫雷游戏的代码实现

game.h

其中方法会一一讲到

  • 这里我们先用#define定义了行和列,是为了方便更改游戏难度,要更改棋盘大小只需要更改这几行数据即可
#pragma  once

#include <stdio.h>
#include <stdlib.h>
#include <time.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 mine[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

  • 测试游戏的主要逻辑,是main函数所在的.c文件

    • 一来先打印菜单

    • 然后使用do-while循环让玩家可以多次玩游戏


#include "game.h"

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



void test()
{
	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);
}

int main()
{
	test();
	return 0;
}

以上部分在【C语言篇】猜数字游戏(赋源码)都是类似的,这里就不再赘述

  • 接下来就是重点,我们使用game()来分装我们实现的扫雷游戏的逻辑
void game()
{
	char mine[ROWS][COLS] = {0};//存放雷的信息
	char show[ROWS][COLS] = {0};//存放排查出的雷的信息

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//打印棋盘
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

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

这些方法的具体实现都是在game.c文件中实现

最好是写一个方法测试一次,不然找错误的时候会很痛苦😜

初始化棋盘

  • show棋盘是一来打印给玩家看的,保持神秘感使用'*'初始化
  • mine棋盘是用来布置雷的,使用'0'初始化

所以我们在参数中多加了一个char类型的set变量,这样只需使用一个函数就能初始化两个棋盘

棋盘的初始化就是二维数组初始化,遍历即可

//game.h
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);


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

打印棋盘

  • 方便我们测试观察,并且需要将show数组每次打印给玩家看,所以写一个打印棋盘的函数
  • 为了方便观察和读坐标,我们希望把坐标也打印出来

注意showmine数组扩大了一圈,有效的下标范围都是1-9
在这里插入图片描述

//game.h
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//game.c
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("--------扫雷------\n");
	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

布置雷

  • 要布置雷,需要是随机的,所以需要用到随机数生成

以下内容在【C语言篇】猜数字游戏(赋源码)有很详细的介绍,这里简略说一下,想更具体的了解的读者可以去看看

C语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的,函数原型如下所⽰:

int rand (void);

rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。

rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h


C语⾔中⼜提供了⼀个函数叫srand,⽤来初始化随机数的⽣成器的,srand的原型如下:

void srand (unsigned int seed);

程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。


在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。

在C语⾔中有⼀个函数叫time,就可以获得这个时间,time函数原型如下:

time_t time (time_t* timer);

time函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。

time函数的参数timer如果是⾮NULL的指针的话,函数会将这个返回的差值放在timer指向的内存中。

如果timerNULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。

time函数的时候需要包含头⽂件:time.h


所以在test.c我们使用了如下代码初始化rand函数的种子

srand((unsigned int)time(NULL));

好的,回到正题

  • 为了方便更改游戏难度,使用#define定义我们需要布置的雷的个数,这里以10个为例
  • 还是注意x和y的坐标范围
  • 在布置雷前别忘了先判断这里是否已经布置过雷,保证最后一定是布置了是个雷
//game.h



//game.c
//布置雷是在棋盘上随机的找10个坐标布置的
//x: 1~9
//y: 1~9

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand()%row+1;
		y = rand()%col+1;

		if (mine[x][y] != '1')
		{
			mine[x][y] = '1';//布置一个雷
			count--;
		}
	}
}

排查雷

  • 玩家输入坐标

    • 判断玩家输入坐标范围是否正确

    • 如果是雷,就游戏结束,打印mine棋盘

在这里插入图片描述

  • 如果不是,统计mine棋盘此位置周围8个地方的雷的数量,并将show棋盘对应位置更改为雷的个数,打印show棋盘

在这里插入图片描述

  • 如何判断玩家是否获得胜利?

    • 以10个雷为例,总共棋盘大小为9*9,所以玩家需要将剩下的71个不是雷的地方找出来,定义win变量循环实现,每次猜中就++,最后如果和需要猜的次数相等,则说明排雷成功
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<col*row-EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//输入的位置是雷
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你踩雷了,游戏结束\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else  //不是雷
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入的坐标有误x(1~9),y(1~9),重新输入");
		}
	}
	
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}
  • 为了得到雷的数量,我们实现另一个函数
    • 利用数学关系,依次相加,注意mine数组里面是数字字符,所以我们要减去'0'才能得到真正的数字
    • 使用循环简化一下也可以

在这里插入图片描述

//方法一:
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    return mine[x - 1][y] + 
        mine[x - 1][y - 1] + 
        mine[x][y - 1] + 
        mine[x + 1][y - 1] +
        mine[x + 1][y] + 
        mine[x + 1][y + 1] + 
        mine[x][y + 1] + 
        mine[x - 1][y + 1] - 8*'0';
}
//方法二:
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    int i = 0;
    int count = 0;
    for (i = -1; i <= 1; i++)
    {
        int j = 0;
        for (j = -1; j <= 1; j++)
        {
            count += (mine[x + i][y + j] - '0');
        }
    }
    return count;
}

  • 得到了雷的个数,由于show数组也是char类型的,所以也需要给count+'0'才能赋值到show棋盘对应的位置,然后打印即可

以上就是最基本的扫雷游戏的逻辑实现

源码如下:

game.h

#pragma  once

#include <stdio.h>
#include <stdlib.h>
#include <time.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 mine[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

include "game.h"

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

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("--------扫雷------\n");
	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

//布置雷是在棋盘上随机的找10个坐标布置的
//x: 1~9
//y: 1~9

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand()%row+1;
		y = rand()%col+1;

		if (mine[x][y] != '1')
		{
			mine[x][y] = '1';//布置一个雷
			count--;
		}
	}
}

//int GetMineCount(char mine[ROWS][COLS], int x, int y)
//{
//	return mine[x - 1][y] + 
//		mine[x - 1][y - 1] + 
//		mine[x][y - 1] + 
//		mine[x + 1][y - 1] +
//		mine[x + 1][y] + 
//		mine[x + 1][y + 1] + 
//		mine[x][y + 1] + 
//		mine[x - 1][y + 1] - 8*'0';
//}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int count = 0;
	for (i = -1; i <= 1; i++)
	{
		int j = 0;
		for (j = -1; j <= 1; j++)
		{
			count += (mine[x + i][y + j] - '0');
		}
	}
	return count;
}


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<col*row-EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//输入的位置是雷
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你踩雷了,游戏结束\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else  //不是雷
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入的坐标有误x(1~9),y(1~9),重新输入");
		}
	}
	
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

test.c


#include "game.h"
void game()
{
	char mine[ROWS][COLS] = {0};//存放雷的信息
	char show[ROWS][COLS] = {0};//存放排查出的雷的信息

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');

	//打印棋盘
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

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



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



void test()
{
	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);
}

int main()
{
	test();
	return 0;
}

扫雷游戏的拓展

  • 是否可以选择游戏难度

    • 简单 9*9 棋盘,10个雷

    • *中等 16*16棋盘,40个雷

    • 困难 30*16棋盘,99个雷

  • 如果排查位置不是雷,周围也没有雷,可以展开周围的⼀⽚

    • 这里需要用递归
  • 是否可以标记雷

  • 是否可以加上排雷的时间显⽰

等等·····,篇幅有限,就不再继续介绍了,各位读者有兴趣可以去实现一下呀👍


以上就是关于【C语言篇】数组和函数的实践:扫雷游戏(附源码)的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️

在这里插入图片描述

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

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

相关文章

8月14日微语报,星期三,农历七月十一

8月14日微语报&#xff0c;星期三&#xff0c;农历七月十一&#xff0c;工作愉快&#xff0c;生活喜乐&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、巴黎奥运会&#xff1a;32项次世界纪录被刷新&#xff0c;125项次奥运纪录被改写。 2、国家邮政局&#…

鸿蒙应用程序框架基础

鸿蒙应用程序框架基础 应用程序包基础知识应用的多Module设计机制Module类型 Stage模型应用程序包结构开发态包结构编译包形态发布台包结构选择合适的包类型 应用程序包基础知识 应用的多Module设计机制 **支持模块化开发&#xff1a;**一个应用通常会包含多种功能&#xff0…

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…

[NSSCTF 2022 Spring Recruit]babyphp

if嵌套&#xff0c;先过第一个if&#xff0c;需要a不含数字而且intval取整数 intval:通过使用指定的进制 base 转换&#xff08;默认是十进制&#xff09;&#xff0c;返回变量 value 的 int 数值。 intval() 不能用于 object&#xff0c;否则会产生 E_WARNING 错误并返回 1。…

微服务实战系列之玩转Docker(十)

前言 我们知道Docker的“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力&#xff0c;Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇&#xff08;重点compose&#xff09;和第九篇&#xff08;重点networ…

歌曲爬虫下载

本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来&#xff01;&#xff01;&#xff01;废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…

Kaggle竞赛——心脏病患者预测与可视化

目录 准备工作1. 特征解释2. 生成探索性数据分析报告2.1 数据集导入2.2 生成数据分析报告 3. 可视化分析3.1 特征相关性分析3.2 患病人数统计3.3 特征与是否患病之间的关系 4. 数据处理4.1 定类数据处理4.2 独热编码 5. 模型搭建5.1 随机森林模型5.2 可视化决策树5.3 特征重要性…

SourceTree基础使用教程

SourceTree基础使用 在B站上搜了不少关于SourceTree的教学视频&#xff0c;多家比较后下面的视频干活比较多 sourcetree使用教程 大概就二十几分钟&#xff0c;跟着学了一个小时&#xff0c;边看边操作&#xff0c;印象更深刻一些 主要涉及以下操作&#xff1a; 1、新建分支…

vue-echarts---折线图 (直接cv就行,全注释)

1、效果展示 2、完整代码&#xff0c;直接cv即可跑起来 <template><div id"mainend"></div> </template><script> import * as echarts from echarts; export default {name: LineChart,mounted() {this.initChart();this.registerUs…

NXP i.MX8系列平台开发讲解 - 4.1.1 GNSS篇(一) - 定位基础知识

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 专用名词&#xff1a; 1. GNSS 概述 1.2 四大GNSS 概述 1.2.1 GPS 1.2.2 BeiDou 1.2.3 GLONASS…

vue3 antdv3 将vxe-grid的头二行改为一行,解决最后一列不能自动根据屏幕的宽度自动缩放的问题。

1、先上个图&#xff1a; 官方地址&#xff1a; Vxe Table v4.6 header搞了二层&#xff0c;然后反馈过来&#xff0c;让调整&#xff1a; {title: 通讯地址,width: 200,showOverflow: tooltip,align: center,sortable: true,filters: companyOptions,filterRender: { name:…

国内首个支持国产化信创的开源云原生平台

国产化信创是指中国本土信息技术和创新产业的发展和推广。随着各种形势的复杂变化&#xff0c;推动国产化和信创已成为信息产业发展的重要方向。在这一背景下&#xff0c;国内的技术企业和开发者们纷纷投入到开源国产化和自主创新的浪潮中&#xff0c;力图摆脱对国外技术和服务…

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用

Gemma 模型 Gemma模型是谷歌发布的一个开源模型&#xff0c;任何人都可以免费下载预训练模型&#xff0c;进行使用。而谷歌最近也发布了Gemma 2 模型&#xff0c;模型参数超过了 200 亿大官&#xff0c;果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…

【Linux系统编程】进程间的通信——管道通信

目录 前言&#xff1a; 一&#xff0c;管道的认识 二&#xff0c;管道的深入了解 2-1&#xff0c;管道的特点 2-2&#xff0c;深入学习管道 2-3&#xff0c;管道的特殊情况 三&#xff0c;匿名管道 四&#xff0c;Ubuntu系统和VSCode的使用 4-1&#xff0c;Ubuntu和VSC…

【ARM+Codesys 客户案例 】 基于RK3568/A40i/STM32+CODESYS在智能制造中的应用案例:全自动切片机器人

蔬菜是人们日常生活必不可缺的食品&#xff0c;并且食用方法多种多样。自步入小康社会以来&#xff0c;人们的生活节奏越来越快&#xff0c;很多传统服务已不能满足人们的物质需求和生活节奏。日常生活中通过手工快速切菜严重地威胁着人身安全&#xff0c;切菜时间过长或切菜不…

异常信息转储笔记-获取源码行号

前情 上一篇笔记《异常信息转储预研笔记-堆栈地址转换》留下了两个待解决问题&#xff08;如下图&#xff09;&#xff0c;问题1已在《异常信息转储笔记-demangle函数名字符》中解决&#xff0c;剩下问题2输出源码行号的问题还未能解决。 之前使用dladdr并未能将堆栈地址转换…

CourseGPT彻底改变本科学习

文章介绍了CourseGPT这一生成式AI工具&#xff0c;它基于Mistral AI的大型语言模型&#xff0c;旨在通过提供持续的教师支持和定期更新的课程材料来提升本科生的学习体验。CourseGPT能够利用课程特定的内容为学生提供精确和动态生成的回答&#xff0c;并且教师可以控制这些回答…

收藏:U盘加密软件哪个好用,防止U盘防复制软件

“物以稀为贵&#xff0c;藏之深则安。” 在信息时代的洪流中&#xff0c;数据之珍贵&#xff0c;无异于古时之金玉珠宝&#xff0c;而保护这些数据的安全&#xff0c;则成为了现代人心中的一道重要防线。 U盘&#xff0c;这小巧便携的数据存储工具&#xff0c;虽不及古时铜匣…

Jenkins-更新

文章目录 前言一、下载最新的war包二、安装最新的war包&#xff08;一&#xff09;查询Jenkins.war目录命令&#xff08;二&#xff09;切换到Jenkins.war的安装目录&#xff08;三&#xff09;上传最新Jenkins.war包 总结 前言 当我们在CentOS8 系统成功安装上Jenkins服务后&…

数据结构(6.2_1)——领接矩阵法

图的存储——邻接矩阵法 邻接矩阵&#xff08;Adjacency Matrix&#xff09;是一种使用二维数组来表示图的方法。在这种表示法中&#xff0c;矩阵的行和列都对应图的顶点。 特点 对于无向图&#xff0c;如果顶点i与顶点j之间有边&#xff0c;则矩阵的第i行第j列&#xff08;…