【C语言】N子棋小游戏♔

目录

前言

一、何为N子棋游戏?

二、游戏思路

三、游戏实现

3.1 模块化

3.2 游戏棋盘

3.3 下棋操作

3.3.1 玩家下棋

3.3.2 电脑下棋

3.4 判断输赢

总结


前言

三子棋小游戏相信大家都玩过吧,类似的5子琪等等,这篇文章将带着大家从0到1实现一个简易版的N子棋小游戏,当然,是不带图形界面的。通过本文,可以让初学者对C语言的基础知识点的了解更进一步。


一、何为N子棋游戏?

鉴于文章的严谨性,可能有的老铁没有玩过N子棋类的游戏,这里有个网页版的游戏,可以去体验体验:三子棋(井字棋)

N代表的连线的棋子,如五子棋等等。


二、游戏思路

实现该游戏大致分为以下几步:

  1. 分模块进行,三个文件,分别为游戏测试逻辑、游戏逻辑、游戏声明。
  2. 棋盘准备。
  3. 玩家下棋。
  4. 判断输赢
  5. 电脑下棋
  6. 判断输赢

三、游戏实现

我们规定:

  • * 为玩家下棋的字符标志
  • # 为电脑下棋的字符标志

3.1 模块化

C语言中,对于一个完整的项目来说,不可能只在一个源文件下实现,往往需要分模块进行,在C语言标准中:

  • .h头文件放置函数声明和头文件包含
  • 专门一个.c源文件用于进行测试逻辑,也就是用于调用函数。
  • 专门一个.c源文件用于函数的实现(定义)
  • .....

在该游戏中,我们要用到三个文件,分别是:

  • 游戏测试逻辑(.c文件)
  • 游戏实现逻辑(.c文件)
  • 游戏声明(.h文件)

下面我带着大家进行创建:

游戏测试逻辑
游戏测试逻辑

游戏实现逻辑
游戏实现逻辑

游戏说明
游戏声明

3.2 游戏棋盘

该类游戏都会有一个棋盘,类似于三子棋:

既然是下棋,那就需要构建一个棋盘,可以看出,棋盘由行和列组成,那么我们可以用二维数组来表示,因为二维数组就是以行和列组成的,当然,为了游戏的完整性,我们可以先打印一个菜单供用户选择。

test.c 文件
#include "game.h" //引入头文件
void mnue()
{
	printf("*******************\n");
	printf("*****1、play*******\n");
	printf("*****0、exit*******\n");
	printf("*******************\n");
}

int main()
{

	int input = 0;
	//一进来就打印菜单,让用户选择,用do...while最合适
	do
	{
		mnue();
		printf("请选择:>"); 
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			break;
		}
		
	} while (input);
	return 0;
}

game.h文件
#include <stdio.h>

因为用户一进游戏,无论用户是否选择开始游戏,都会进行一次打印菜单,因此这里用do...while结构非常合适。


菜单准备完毕,下面开始准备棋盘:

定义一个二维数组来存放下棋数据,也相当于棋盘:

char board[ROW][COL] = { 0 };

这里的数组大小不能写死,因为我们做的游戏是N子棋,对于数组大小,我们用#define标识符定义:

game.h文件
//棋盘大小
#define ROW 3
#define COL 3

数组是否要进行初始化?要进行的,并且要全部初始化为空格,为什么呢?我们可以观察一下棋盘:

我们发现,在没有下棋时,格子的位置明显是一个空格进行占位,因此我们将数组初始化为空格,进行占位。

test.c 文件
void game()
{
	//1、定义一个二维数组来存放下棋数据,也相当于棋盘
	//让棋盘大小可变,定义#define标识符
	char board[ROW][COL] = { 0 };
	//2、初始化棋盘,让数组内容均为空格,这样做是为了占位
	Initialize_Board(board, ROW, COL);
}

game.h 文件
#pragma once
#include<stdio.h>
#include<string.h>
//棋盘大小
#define ROW 3
#define COL 3
//初始化棋盘
void Initialize_Board(char board[ROW][COL],int row, int col);

game.c 文件
#include "game.h"
//初始化棋盘
void Initialize_Board(char board[ROW][COL], int row,int col)
{
	//方法1:嵌套for循环
	/*for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}*/

	//方法二:memset库函数,修改执行字节大小的值
	// 三个参数:起始地址,修改内容,字节个数
	memset(&board[0][0], ' ', row*col *sizeof(board[0][0]));

}

进行初始化操作有两个方法:

  • 嵌套for循环(常规)
  • memset库函数,制定修改n字节的内容,具体可看文档:memset

初始化完毕后,接下来就该构造出棋盘了,其实就是打印棋盘操作,基本思路如下:

  • 棋盘组成:一行内容|,一行---|
  • 边界条件:一行内容|中的|为COL-1列;一行---|中---为ROW-1行,|为COL-1列。
test.c 文件
void game()
{
	//1、定义一个二维数组来存放下棋数据,也相当于棋盘
	//让棋盘大小可变,定义#define标识符
	char board[ROW][COL] = { 0 };
	//2、初始化棋盘,让数组内容均为空格,这样做是为了占位
	Initialize_Board(board, ROW, COL);
    //3、打印棋盘
	Print_Board(board, ROW, COL);
}

game.h 文件
#pragma once
#include<stdio.h>
#include<string.h>
//棋盘大小
#define ROW 3
#define COL 3
//初始化棋盘
void Initialize_Board(char board[ROW][COL],int row, int col);
//打印棋盘
void Print_Board(char board[ROW][COL], int row, int col);

game.c 文件
#include "game.h"
//打印棋盘
void Print_Board(char board[ROW][COL], int row, int col)
{
	//两部分:
	//1、内容+|
	//2、--- + |
	for (int i=0; i<row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			//如3×3棋盘,那就打印两列|就可以了
			if (j<col-1)
			{
				printf("|");
			}
		}
		//给内容+| 和 ---|之间换行
		printf("\n");
		//这里打印---|
		//也一样,只打印两行---即可
		if (i<row-1)
		{
			//为每一列打印---|
			for (int i = 0; i < col; i++)
			{
				printf("---");
				//同样的,只打印2列|
				if (i<col-1)
				{
					printf("|");
				}
			}
		}
		//换行,表示这一行打印完成
		printf("\n");
	}
}


棋盘准备完毕,我们运行看看效果:


3.3 下棋操作

棋盘完成后,进入下棋逻辑,下棋我们要考虑几个方面:

  • 下棋后应打印出最新的棋盘。
  • 判断输赢

3.3.1 玩家下棋

玩家根据棋盘的坐标进行下棋,这里的逻辑有几个注意点:

  • 玩家眼中的坐标与数组表示的下标不同。
  • 输入的坐标有边界条件:x>=1 && x<=row && y>=1 && y<=col
  • 判断输入的坐标中是否已下过棋
test.c 文件
void game()
{
	//1、定义一个二维数组来存放下棋数据,也相当于棋盘
	//让棋盘大小可变,定义#define标识符
	char board[ROW][COL] = { 0 };
	//2、初始化棋盘,让数组内容均为空格,这样做是为了占位
	Initialize_Board(board, ROW, COL);
    //3、打印棋盘
	Print_Board(board, ROW, COL);
    //4、玩家下棋
	Root_Play(board, ROW, COL);
    //5、打印棋盘
	Print_Board(board, ROW, COL);
}

game.h 文件
#pragma once
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
//棋盘大小
#define ROW 3
#define COL 3
//初始化棋盘
void Initialize_Board(char board[ROW][COL],int row, int col);
//打印棋盘
void Print_Board(char board[ROW][COL], int row, int col);
//玩家下棋
void Root_Play(char board[ROW][COL], int row, int col);

game.c 文件
#include "game.h"
//玩家下棋
// * 为玩家下棋的字符标志
// # 为电脑下棋的字符标志
void Root_Play(char board[ROW][COL], int row, int col)
{
	//根据坐标下棋
	int x = 0;
	int y = 0;
	
	//边界条件
	//最小不能为x!=0,y!=0
	//最大x>row+1,y>col+1
	//边界条件为:x ==0 || y == 0 || x > row || y > col
	//还要判断输入的坐标中是否已下过棋
	while (1)
	{
		printf("请玩家输入下棋坐标:>");
		scanf("%d %d", &x, &y);
		//如果超出边界条件,那就提示一下,然后重新输入
		if (x ==0 || y == 0 || 
			x>row || y>col)
		{
			printf("坐标超出范围...\n");
		}
		//如果输入的坐标中已下过棋,则重新下棋
		else if (board[x - 1][y - 1] == '*' || 
			board[x - 1][y - 1] == '#')
		{
			printf("该坐标已下过棋...\n");
		}
		else
		{
			//为坐标棋盘赋值
			//x-1,y-1是因为计算机中下标是从0开始
			//但用户不懂这些,按照正常坐标,因此要-1
			board[x - 1][y - 1] = '*';
			system("cls");
			break;
		}
	}

}

在下棋时,需要将坐标-1,因为用户理解的坐标是常规的,但在编写代码时,数组以下标进行访问,因此坐标-1。我们看看效果:

在玩家下完棋后,使用system("cls");清空屏幕,这样更加好看。

因为下完棋打印最新的棋盘就是打印棋盘的逻辑,这里就不讲了,只需要调用打印棋盘函数即可。


3.3.2 电脑下棋

关于电脑下棋这一功能,我们用随机数生成坐标即可。与玩家下棋不同,电脑下棋通过生成随机坐标,范围是由我们定义的,因此坐标也符合我们的想法,这里就不用添加边界条件了,但要判断输入的坐标中是否已下过棋。

test.c 文件
void game()
{
	//1、定义一个二维数组来存放下棋数据,也相当于棋盘
	//让棋盘大小可变,定义#define标识符
	char board[ROW][COL] = { 0 };
	//2、初始化棋盘,让数组内容均为空格,这样做是为了占位
	Initialize_Board(board, ROW, COL);
    //3、打印棋盘
	Print_Board(board, ROW, COL);
    //4、玩家下棋
	Root_Play(board, ROW, COL);
    //5、打印棋盘
	Print_Board(board, ROW, COL);
    //4、电脑下棋
	Ai_Play(board, ROW, COL);
	//5、打印棋盘
	Print_Board(board, ROW, COL);
}
int main()
{

	int input = 0;
	//定义随机数生成棋,一次就够
	srand((unsigned int)time(NULL));
	//一进来就打印菜单,让用户选择,用do...while最合适
	do
	{
		mnue();
		printf("请选择:>"); 
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			break;
		}
		
	} while (input);
	return 0;
}

game.h 文件
#pragma once
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
//棋盘大小
#define ROW 3
#define COL 3
//初始化棋盘
void Initialize_Board(char board[ROW][COL],int row, int col);
//打印棋盘
void Print_Board(char board[ROW][COL], int row, int col);
//玩家下棋
void Root_Play(char board[ROW][COL], int row, int col);
//电脑下棋
void Ai_Play(char board[ROW][COL], int row, int col);


game.c 文件
#include "game.h"
//电脑下棋
// * 为玩家下棋的字符标志
// # 为电脑下棋的字符标志
void Ai_Play(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋....\n");
	//因为是随机数生成,不存在边界条件
	//还要判断输入的坐标中是否已下过棋
	//如果输入的坐标中已下过棋,则重新下棋
	while (1)
	{
		// 随机数生成坐标
		int x = rand() % row;
		int y = rand() % col;

		if (board[x][y] == ' ')
		{
			//为坐标棋盘赋值
			board[x][y] = '#';
			Sleep(500);
			system("cls");
			break;
		}
	}
}

电脑下棋中,关键点在于生成随机坐标,生成随机数使用srand和rand就可以了,自定义随机数的范围: int x = rand() % row; int y = rand() % col; 最后我们看看效果:

电脑下棋时,有短暂的暂停效果,这是因为加入了:Sleep(500); 睡眠。同样的,在电脑下完棋后,调用打印棋盘函数。


3.4 判断输赢

不管是玩家下完棋还是电脑下完棋,都应该进行输赢的判断,因此写一个函数即可。

判断输赢的条件如下:

  • 任意一行连成线
  • 任意一列连成线
  • 任意一条对角线连成线

不同的几种结果:

  • 玩家胜利(1)
  • 电脑胜利(-1)
  • 平局(2)
  • 继续(0)

不可能一次下棋就能判断出结果,大多情况是继续,因此下棋操作一个循环。

判断输赢函数:

//判断输赢
/*
	获胜条件:
	1、任意一行连成线
	2、任意一列连成线
	3、两条对角线任一连成线
    返回结果:
	1、玩家胜利返回1
	2、电脑胜利返回-1
	3、平局返回2
	4、继续返回0
*/
//判断是否平局
int Isdraw(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//当数组还要空格,说明还没结束棋局
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	//此时棋局结束,平局
	return 2;
}
int Judge_Wins_And_Losers(char board[ROW][COL], int row, int col)
{
	
	//任意一行连成线
	for (int i = 0; i < row; i++)
	{
		int flag1 = 0;//玩家赢
		int flag2 = 0;//电脑赢
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == '*')
			{
				flag1++;
			}
			else if(board[i][j] == '#')
			{
				flag2++;
			}
		}
		if (flag1 == ROW)
		{
			return 1;
		}
		else if (flag2 == ROW)
		{
			return -1;
		}
	}
	//任意一列连成线
	for (int i = 0; i < col; i++)
	{
		int flag1 = 0;//玩家赢
		int flag2 = 0;//电脑赢
		for (int j = 0; j < row; j++)
		{
			if (board[j][i] == '*')
			{
				flag1++;
			}
			else if (board[j][i] == '#')
			{
				flag2++;
			}
		}
		if (flag1 == ROW)
		{
			return 1;
		}
		else if (flag2 == ROW)
		{
			return -1;
		}
	}

	//任意一对角线连成线
	//左边到右边对角线
	int flag1 = 0;//玩家赢
	int flag2 = 0;//电脑赢
	int j = 0;
	int k = 0;
	for (int i = 0; i < col; i++)
	{
		if (board[j][i] == '*')
		{
			j++;
			flag1++;
		}
		else if (board[k][i] == '#')
		{
			k++;
			flag2++;
		}
		if (flag1 == ROW)
		{
			return 1;
		}
		else if (flag2 == ROW)
		{
			return -1;
		}
	}

	//右边到左边对角线
	flag1 = 0;//玩家赢
	flag2 = 0;//电脑赢
	j = 0;
	k = 0;
	for (int i = col-1; i >= 0; i--)
	{
		if (board[j][i] == '*')
		{
			j++;
			flag1++;
		}
		else if (board[k][i] == '#')
		{
			k++;
			flag2++;
		}
		if (flag1 == ROW)
		{
			return 1;
		}
		else if (flag2 == ROW)
		{
			return -1;
		}
	}
	//谁都没有胜利,直接返回
	//是否平局
	if (Isdraw(board, row, col))
	{
		return 2;
	}
	//继续
	return 0;
}

对于判断输赢函数逻辑,关键在于判断棋盘中是否有构成一条线的情况,我们用两个计数变量进行统计。


主函数中接收返回值,并进行判断输赢:

void game()
{
	//1、定义一个二维数组来存放下棋数据,也相当于棋盘
	//让棋盘大小可变,定义#define标识符
	char board[ROW][COL] = { 0 };
	//2、初始化棋盘,让数组内容均为空格,这样做是为了占位
	Initialize_Board(board, ROW, COL);
	//3、打印棋盘
	Print_Board(board, ROW, COL);
	int num = 0;
	while (1)
	{
		//4、玩家下棋
		Root_Play(board, ROW, COL);
		//5、打印棋盘
		Print_Board(board, ROW, COL);
		//6、判断输赢
		//1---玩家胜利
		//-1---电脑胜利
		//2---平局
		//0---继续
		num = Judge_Wins_And_Losers(board, ROW, COL);
		if (num == 1 || num == -1 || num == 2)
		{
			break;
		}
		//4、电脑下棋
		Ai_Play(board, ROW, COL);
		//5、打印棋盘
		Print_Board(board, ROW, COL);
		//6、判断输赢
		num = Judge_Wins_And_Losers(board, ROW, COL);
		if (num == 1 || num == -1 || num == 2)
		{
			break;
		}
	}

	//打印获胜方
	if (num == 1)
	{
		printf("玩家胜利\n");

	}
	else if (num == -1)
	{
		printf("电脑胜利\n");

	}
	else
	{
		printf("平局\n");

	}
}

当出现不是继续的情况,则break跳出循环,然后再进行输赢判断。


对应的游戏声明代码:

#pragma once
/*
	游戏逻辑
	用于存放头文件和函数的声明
*/
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 3
#define COL 3
//初始化棋盘
void Initialize_Board(char board[ROW][COL],int row, int col);
//打印棋盘
void Print_Board(char board[ROW][COL], int row, int col);
//玩家下棋
void Root_Play(char board[ROW][COL], int row, int col);
//判断输赢
int Judge_Wins_And_Losers(char board[ROW][COL], int row, int col);
//电脑下棋
// * 为玩家下棋的字符标志
// # 为电脑下棋的字符标志
void Ai_Play(char board[ROW][COL], int row, int col);

运行演示一下吧:

N子棋游戏运行测试


总结

这就是关于C语言实现N子棋小游戏,希望对您有所帮助,关注我,干货满满!!源代码自取。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

分享一些有趣的 Linux 命令

1、sl 会显示一辆火车穿过你的终端屏幕 2、cmatrix 在终端中显示类似于《黑客帝国》电影中的绿色数字雨效果 3、fortune 显示一个随机的名人名言或者笑话 4、cowsay 让一头牛说出你输入的话 5、toilet 在终端中将输入的文本以艺术字体的形式呈现 6、figlet 类似于 toile…

回溯算法初识

文章目录 回溯算法初识什么是回溯算法回溯算法的步骤回溯算模版例题 回溯算法初识 什么是回溯算法 ​ 回溯算法是一种通过不断尝试可能的解决方案来解决问题的算法。它通常用于解决组合优化问题&#xff0c;如排列组合问题、子集和问题等。该算法通过尝试所有可能的候选解&am…

【热门话题】常见分类算法解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 常见分类算法解析1. 逻辑回归&#xff08;Logistic Regression&#xff09;2. 朴…

【设计模式】聊聊观察者设计模式原理及应用

原理 观察者模式属于行为模式&#xff0c;行为模式主要解决类和对象之间交互问题。 含义&#xff1a;在对象之间定义一个一对多的依赖&#xff0c;当一个对象状态改变时&#xff0c;所有依赖的对象会自动通知。 被依赖的对象被观察者(Observable) &#xff0c;依赖的对象观察…

移动Web学习06-移动端适配Less预处理器项目案例

项目目标&#xff1a;实现在不同宽度设备中等比缩放的网页效果 Less代码 import ./base; import ./normalize;// 变量: 存储37.5 rootSize: 37.5rem; *{margin: 0;padding: 0; } body {background-color: #F0F0F0; }// 主体内容 .main {// padding-bottom: (50 / 37.5rem);pa…

缺失msvcr110.dll要怎么处理?快捷的修复msvcr110.dll方法

当你在使用电脑进行工作或娱乐时&#xff0c;可能会突然遇到一个错误提示&#xff1a;“程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll”。这样的情况不仅会打断你的活动&#xff0c;还可能带来一定程度的不便。面对这个在Windows操作系统中相对常见的问题&#xff0c;其…

IDEA2023 开发环境配置

目录 1. 关闭IDEA自动更新1.2 IDEA 新版样式切换 2. Maven配置2.1本地仓库优先加载2.2 maven.config配置文件中 3. 全局配置JDK4. 配置文件编码:UTF-85. 开启自动编译&#xff08;全局配置&#xff09;6. 开启自动导包7. 开启鼠标悬浮&#xff08;提示文档信息&#xff09;8. 设…

7 个适用于 Windows 的最佳电脑分区数据恢复软件

磁盘分区对于正确存储数据以便从硬盘驱动器快速轻松地访问非常有帮助。但是&#xff0c;如果分区损坏&#xff0c;存储在其中的所有数据都会突然变得无法访问。磁盘分区损坏的原因可能有很多&#xff0c;其中最突出的是病毒攻击、突然断电、物理损坏或由于创建坏扇区。 但是&a…

gzip,bzip2,xz,tar-读书笔记(九)

gzip 将文件进行压缩 在Linux系统中&#xff0c;gzip 是一个压缩和解压文件的命令工具。它使用LZ77压缩算法及霍夫曼编码&#xff08;Huffman Coding&#xff09;来压缩文件&#xff0c;通常用来减少文件的大小&#xff0c;以节约磁盘空间或减少网络传输的时间。 gzip 命令的…

Linux gcc 6

本章开始学习工具 什么是工具&#xff1f; 本质也是指令 yum 命令 小火车 sudo yum install sl&#xff08;安装sl&#xff09; sudo yum install -y sl //直接yes就不提示了 yum list //将yum源上的软件都穷举出来 yum search sl //结果不友好&#xff0c;不推荐 yum lis…

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

AI大模型探索之路-提升篇2:一文掌握AI大模型的核心-注意力机制

目录 前言 一、注意力机制简介 二、注意力机制的工作原理 三、注意力机制的变体 1、自注意力&#xff08;Self-Attention&#xff09; 2、双向注意力&#xff08;Bidirectional Attention&#xff09; 3、多头注意力&#xff08;Multi-Head Attention&#xff09; ​4、…

卫星影像联合无人机实现农业保险全生命周期监管监测

随着科技的进步&#xff0c;农业保险监管系统的发展日新月异。特别是近年来&#xff0c;随着卫星技术与无人机技术的结合&#xff0c;为农业保险监管系统带来了前所未有的革新。本文将深入探讨如何利用卫星与无人机方案构建高效的农业保险监管系统&#xff0c;并结合实例进行说…

网络篇06 | 应用层 自定义协议

网络篇06 | 应用层 自定义协议 01 固定协议设计&#xff08;简化版&#xff09;1&#xff09;总体设计2&#xff09;值设计 02 可变协议设计&#xff08;进阶版&#xff09;1&#xff09;固定头&#xff08;Fixed Header&#xff09;2&#xff09;可变头&#xff08;Variable H…

51单片机-ADC模数转换实验-电压值

一 主要知识点及分析: 1.这里是用到的XPT2046芯片,芯片详细说明自行查阅; 2.这里有两种模式,一般外设的转换用的是单端模式,在使用触摸屏的时候我们选择差分模式; 3.这张图有就是时序图,读写都需要在这上面进行编写代码, 3.1 写8位代码:主要是将传入的控制命令进行写入; 3.2 读…

C# Solidworks二次开发:相机访问相关API详解

大家好&#xff0c;今天要介绍的API为相机相关的API&#xff0c;这篇文章比较适合女孩子&#xff0c;学会了相机就会拍照了&#xff0c;哈哈。 下面是要介绍的API: &#xff08;1&#xff09;第一个为GetFocalDistance&#xff0c;这个API的含义为获取相机的焦距&#xff0c;…

光速论文靠谱不 #学习方法#笔记

光速论文是一款优秀的论文写作工具&#xff0c;许多学生和学者都对它赞不绝口。那么&#xff0c;光速论文靠谱吗&#xff1f;答案当然是肯定的&#xff01; 首先&#xff0c;光速论文具有强大的查重和降重功能。它能够帮助用户快速检测论文中的抄袭内容&#xff0c;并提供专业的…