【C语言】贪吃蛇小游戏

news2025/5/20 21:58:05

文章目录

  • 前言
  • 一、贪吃蛇游戏代码
    • test.c文件
    • Snake.h文件
    • Snake.c文件
  • 二、相关函数的介绍
    • 1.COORD
    • 2.Win32 API的介绍
    • 3.GetStdHandle
    • 4.GetConsoleCursorInfo
    • 5.CONSOLE_CURSOR_INFO
    • 5.SetConsoleCursorInf
    • 6.SetConsoleCursorPosition
    • 7.GetAsyncKeyState
  • 总结


前言

哈喽各位好呀。今天小编来给大家分享一个我们小时候都玩过的小游戏,叫做贪吃蛇。如果大家想玩的话,代码我就放下面啦。


一、贪吃蛇游戏代码

test.c文件

#include"Snake.h"      
void test()//完成游戏的测试逻辑
{
	int  ch;
	do
	{
		system("cls");//清理界面
		//创建贪吃蛇
		Snake snake = { 0 };
		//初始化游戏
		GameStart(&snake);
		//运行游戏
		GameRun(&snake); 
		//结束游戏---善后工作
		GameEnd(&snake); 

		SetPut(22, 14); 
		printf("您是否需要再来一局? Y/N");
		ch = getchar(); 
		getchar(); 
	} while (ch == 'y' || ch == 'Y'); 
	SetPut(0, 27);
}
int main()
{
	//设置适应本地环境
	setlocale(LC_ALL, ""); 
	srand((unsigned int)time(NULL));
	test();
}

Snake.h文件

#include<locale.h>
#include<windows.h> 
#include<stdbool.h> 
#include<stdlib.h> 
#include<stdio.h>  
#include<time.h>
#define POS_X 24
#define POS_Y 5
#define WALL L'墙'
#define SNAKE L'蛇'
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)  
enum DIRECTION//蛇的方向
{
	UP=1,
	DOWN,
	LEFT,
	RIGHT
};
enum GAME_STATUS//蛇的状态
{
	OK,
	KILL_BY_WALL,
	KILL_BY_SELF,
	END_NOMAL 

};
//蛇身的节点
typedef struct SnakeNode
{
	//坐标
	int x;
	int y;
	//指向下一个节点的指针
	struct SnakeNode* next;
}SnakeNode ,*pSnakeNode; 

typedef struct Snake
{
	pSnakeNode _pSanke;//指向蛇头的指针
	pSnakeNode _pFood;//指向食物的指针
	enum DIRECTION _dir;//蛇的方向
	enum GAME_STATUS _stutus;//蛇的状态
	int _food_weight;//一个食物的分数
	int _score;//总成绩
	int _sleep_time;//蛇的速度
}Snake,*pSnake;	

void SetPut(short x, short y); //获取光标出现的位置

void GameStart(pSnake ps);//开始游戏 
void WelcomeGame();//打印欢迎界面
void GreatMap();//打印地图
void InitGame(pSnake ps);//初始化蛇的相关信息    
void CreateFood(pSnake ps);//食物节点

void GameRun(pSnake ps);//游戏运行
void PrintHelpInfo();//打印界面右侧信息
bool NextIsFood(pSnakeNode pn, pSnake ps);//判断转向的下一个位置是否有食物
void EatFood(pSnakeNode pn, pSnake ps);//有食物的情况
void NoFood(pSnakeNode pn, pSnake ps);//没有食物的情况
void KillWall(pSnake ps);//撞墙的情况
void KillSelf(pSnake ps);//撞自己的情况
void SnakeMove(pSnake ps);//移动蛇身一步

void GameEnd(pSnake ps);//游戏结束

Snake.c文件

#include"Snake.h"
void SetPut(short x, short y)//光标出现的位置
{
	COORD pos = { x,y };
	HANDLE hOutput = NULL;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//句柄
	//CONSOLE_CURSOR_INFO CursorInfo;
	//GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台的光标信息
	//CursorInfo.bVisible = false;//隐藏光标
	//SetConsoleCursorInfo(hOutput, &CursorInfo);//设置光标的状态 
	SetConsoleCursorPosition(hOutput, pos);//光标的位置位pos   
}
void WelcomeGame()//欢迎界面的打印
{
	SetPut(40,14); 
	printf("欢迎来到贪吃蛇小游戏\n"); 
	SetPut(42, 20); 
	system("pause"); 
	system("cls");
	SetPut(25, 15); 
	wprintf(L"用↑..↓..←..→控制蛇的方向,F3加速,F4减速\n");
	SetPut(25, 20);
	wprintf(L"加速可以得到更高的分数\n");
	SetPut(40, 20);
	system("pause"); 
	system("cls");
}
void GreatMap()//打印地图
{
	for (int i = 0; i < 29; i++)
	{
		wprintf(L"%lc", WALL); 
	}
	SetPut(0, 26);
	for (int i = 0; i < 29; i++)
	{
		wprintf(L"%lc", WALL);
	}
	for (int i = 1; i <= 25; i++)
	{
		SetPut(0,i);
		wprintf(L"%lc", WALL);
	}
	for (int i = 1; i <= 25; i++)
	{
		SetPut(56, i);
		wprintf(L"%lc", WALL);
	}
	
}
void InitGame(pSnake ps)//初始化蛇  
{
	pSnakeNode cur = NULL; 
	for (int i = 0; i < 5; i++)//申请5个节点
	{
		
		cur =(pSnakeNode)malloc(sizeof(SnakeNode));
		if (cur == NULL)
		{
			perror("Snake::malloc fail\n");
			exit(1);
		}
		cur->next = NULL;
		cur->x = POS_X + 2 * i;
		cur->y = POS_Y;
		//头插连接
		if (ps->_pSanke == NULL)
		{
			ps->_pSanke=cur; 
		}
		else
		{
			cur->next = ps->_pSanke;
			ps->_pSanke = cur; 
		}
	}
	cur = ps->_pSanke;
	while (cur)//打印蛇身
	{
		SetPut(cur->x, cur->y);
		wprintf(L"%lc", SNAKE);
		cur = cur->next;
	}
	ps->_dir = RIGHT;
	ps->_food_weight = 10;
	ps->_score = 0;
	ps->_stutus =OK; 
	ps->_sleep_time = 200;
	
}
void CreateFood(pSnake ps)//食物节点的创建
{
	int x = 0;
	int y = 0;
gain:
	do
	{
		x = rand() % 53 + 2;  
		y = rand() % 25 + 1; 
	} while (x % 2 != 0);//食物的位置必须是2的倍数

	pSnakeNode cur = ps->_pSanke ; //食物节点不能和蛇身重合
	while (cur)
	{
		if (x == cur->x && y == cur->y)
			goto gain; 
		cur = cur->next;
	}
	//创建食物节点
	pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));
	if (pFood == NULL)
	{
		perror("malloc fail\n");
		return;
	}
	pFood->x = x; 
	pFood->y = y;
	pFood->next = NULL;

	SetPut(pFood->x, pFood->y); 
	wprintf(L"%lc", L'食');
	ps->_pFood = pFood;
}
void GameStart(pSnake ps)//开始游戏
{
	//设置窗口大小,隐藏光标
	system("mode con cols=100 lines=30");
	system("title 贪吃蛇");
	HANDLE hOutput = NULL; 
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//句柄
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台的光标信息 
	CursorInfo.bVisible = false;//隐藏光标
	SetConsoleCursorInfo(hOutput, &CursorInfo);//设置光标的状态 

	//打印欢迎界面,功能打印
	WelcomeGame();

	//地图的绘制
	GreatMap();

	//初始化蛇神
	InitGame(ps);

	//创建食物
	CreateFood(ps);
}
void PrintHelpInfo()
{
	//打印提⽰信息
	SetPut(64, 15);
	printf("不能穿墙,不能咬到⾃⼰\n");
	SetPut(64, 16); 
	printf("⽤↑.↓.←.→分别控制蛇的移动.");
	SetPut(64, 17); 
	printf("F3 为加速,F4 为减速\n");
	SetPut(64, 18);
	printf("ESC :退出游戏.space:暂停游戏.");
	SetPut(64, 20); 
	printf("小贾制作\n"); 
}
void pause()//暂停
{
	while (1)
	{
		Sleep(200);
		if (KEY_PRESS(VK_SPACE)) 
			break;
	}
}
bool NextIsFood(pSnakeNode pn, pSnake ps)//判断转向的下一个位置是否有食物
{
	return pn->x == ps->_pFood->x && pn->y == ps->_pFood->y; 
}
void EatFood(pSnakeNode pn, pSnake ps)//有食物的情况 
{
	pn->next = ps->_pSanke;
	ps->_pSanke = pn;
	pSnakeNode cur = ps->_pSanke;
	while (cur)
	{
		SetPut(cur->x, cur->y);
		wprintf(L"%lc", SNAKE);
		cur = cur->next;
	}
	ps->_score += ps->_food_weight;
	free(ps->_pFood ); 
	CreateFood(ps);
}
void NoFood(pSnakeNode pn, pSnake ps)//没有食物的情况
{
	//头插法
	pn->next = ps->_pSanke; 
	ps->_pSanke = pn; 

	//打印蛇
	pSnakeNode cur = ps->_pSanke; 
	while (cur->next->next) 
	{
		SetPut(cur->x, cur->y); 
		wprintf(L"%lc", SNAKE);  
		cur = cur->next; 
	}
	//最后⼀个位置打印空格,然后释放节点
	SetPut(cur->next->x, cur->next->y); 
	printf(" ");   
	free(cur->next);   
	cur->next = NULL; 
}
void KillWall(pSnake ps)//撞墙的情况
{
	if (ps->_pSanke->x == 0 || ps->_pSanke->y == 26 ||ps->_pSanke->x == 56 || ps->_pFood->y == 0)	
		ps->_stutus = KILL_BY_WALL;
}
void KillSelf(pSnake ps)//撞自己的情况
{
	pSnakeNode cur = ps->_pSanke->next ; 
	while (cur)
	{
		if (ps->_pSanke->x == cur->x && ps->_pSanke->y == cur->y)
		{
			ps->_stutus = KILL_BY_SELF;
			break;
		}
		cur = cur->next;
	}
}
void SnakeMove(pSnake ps)//移动蛇身一步
{
	//创建一个蛇身节点 
	pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode)); 
	if (pNextNode == NULL)
	{
		perror("malloc fail\n");
		return;
	}
	switch (ps->_dir)
	{
	case UP:
	{
		pNextNode->x = ps->_pSanke->x;
		pNextNode->y = ps->_pSanke->y - 1;
	}
	break;
	case DOWN:
	{
		pNextNode->x = ps->_pSanke->x; 
		pNextNode->y = ps->_pSanke->y + 1; 
	}
	break;
	case LEFT:
	{
		pNextNode->x = ps->_pSanke->x - 2; 
		pNextNode->y = ps->_pSanke->y; 
	}
	break;
	case RIGHT:
	{
		pNextNode->x = ps->_pSanke->x + 2; 
		pNextNode->y = ps->_pSanke->y;   
	} 
	break;
	}
	if (NextIsFood(pNextNode, ps)) 
	{
		EatFood(pNextNode, ps); 
	}
	else//如果没有⻝物
	{
		NoFood(pNextNode, ps); 
	}
	KillWall(ps);
	KillSelf(ps);
}
void GameRun(pSnake ps)//游戏运行
{
		//打印右侧帮助信息
		PrintHelpInfo();
		do
		{
			SetPut(64, 10); 
			printf("得分:%d ", ps->_score );  
			printf("每个⻝物得分:%d分", ps->_food_weight ); 
			if (KEY_PRESS(VK_UP) && ps->_dir  != DOWN) 
			{
				ps->_dir = UP;  
			}
			else if (KEY_PRESS(VK_DOWN) && ps->_dir != UP)
			{
				ps->_dir = DOWN;
			}
			else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT)
			{
				ps->_dir = LEFT;
			}
			else if (KEY_PRESS(VK_RIGHT) && ps->_dir != LEFT)
			{
				ps->_dir = RIGHT;
			}
			else if (KEY_PRESS(VK_SPACE))
			{
				pause();
			}
			else if (KEY_PRESS(VK_ESCAPE))
			{
				ps->_stutus = END_NOMAL; 
				break;
			}
			else if (KEY_PRESS(VK_F3))
			{
				if (ps->_sleep_time >= 80)
				{
					ps->_sleep_time -= 30;
					ps->_food_weight += 2;//⼀个⻝物分数最⾼是20分
				}
			}
			else if (KEY_PRESS(VK_F4))
			{
				if (ps->_sleep_time < 320)
				{
					ps->_sleep_time += 30;
					ps->_food_weight  -= 2;//⼀个⻝物分数最低是2分
				}
			}
			//蛇每次⼀定之间要休眠的时间,时间短,蛇移动速度就快
			Sleep(ps->_sleep_time );  
			SnakeMove(ps);
		} while (ps->_stutus  == OK);  	
}

void GameEnd(pSnake ps)//游戏结束
{
	SetPut(22, 12);
	switch (ps->_stutus)
	{
	case END_NOMAL:
	{
		printf("正常退出\n");
	}
	break;
	case KILL_BY_WALL:
	{
		printf("您撞墙了,游戏结束!\n");
	}
	break;
	case KILL_BY_SELF:
	{
		printf("您撞上您自己了\n");
	}
	break;
	}
	pSnakeNode cur = ps->_pSanke; 
	while (cur)//清除蛇身
	{
		pSnakeNode dir = cur; 
		cur = cur->next; 
		free(dir);
	}
}

二、相关函数的介绍

1.COORD

控制台屏幕上的坐标COORD

2.Win32 API的介绍

Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就就是Microsoft Windows32位平台的应⽤程序编程接⼝

3.GetStdHandle

GetStdHandle

GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。

HANDLE GetStdHandle(DWORD nStdHandle);

实例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

4.GetConsoleCursorInfo

GetConsoleCursorInfo

检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息

BOOL WINAPI GetConsoleCursorInfo(
 HANDLE hConsoleOutput,
 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标

实例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

5.CONSOLE_CURSOR_INFO

这个结构体,包含有关控制台光标的信息

typedef struct _CONSOLE_CURSOR_INFO {
 DWORD dwSize;
 BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
  • dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。
  • bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
//示例:
CursorInfo.bVisible = false; //隐藏控制台光标

5.SetConsoleCursorInf

SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性

BOOL WINAPI SetConsoleCursorInfo(
 HANDLE hConsoleOutput,
 const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

实例:

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态

6.SetConsoleCursorPosition

SetConsoleCursorPosition

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。

BOOL WINAPI SetConsoleCursorPosition(
 HANDLE hConsoleOutput,
 COORD pos
);

实例:

COORD pos = { 10, 5};
 HANDLE hOutput = NULL;
 //获取标准输出的句柄(⽤来标识不同设备的数值)
 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 //设置标准输出上光标的位置为pos
 SetConsoleCursorPosition(hOutput, pos);

SetPut:封装一个设置光标位置的函数

//设置光标的坐标
void SetPos(short x, short y)
{
 COORD pos = { x, y };
 HANDLE hOutput = NULL;
 //获取标准输出的句柄(⽤来标识不同设备的数值)
 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 //设置标准输出上光标的位置为pos
 SetConsoleCursorPosition(hOutput, pos);
}

7.GetAsyncKeyState

GetAsyncKeyState

获取按键情况,GetAsyncKeyState的函数原型如下:

SHORT GetAsyncKeyState(
 int vKey
);

将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

参考:虚拟键码 (Winuser.h) - Win32 apps


总结

以上就是贪吃蛇的全部代码以及一些关于.Win32 API的接口的介绍。当然代码还可以优化许多玩法。小编呢就写这么多了。咋们下一期再见吧!感谢您的参观!
在这里插入图片描述

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

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

相关文章

大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…

[免费]苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端Vue管理端) Java毕业设计…

【RAG】RAG-MCP:基于检索增强生成来缓解大语言模型工具选择中的提示膨胀问题

摘要 由于提示膨胀和选择复杂性&#xff0c;大型语言模型 (LLM) 难以有效利用越来越多的外部工具&#xff0c;例如模型上下文协议 (MCP)[1]中定义的那些工具。 我们引入了 RAG-MCP&#xff0c;这是一个检索增强生成框架&#xff0c;通过卸载工具发现来克服这一挑战。 RAG-MCP …

甘特图工具怎么选?免费/付费项目管理工具对比测评(2025最新版)

2025年甘特图工具的全面指南 在项目管理领域&#xff0c;甘特图作为最直观的任务规划和进度追踪工具&#xff0c;已成为团队协作和项目执行的核心手段。随着数字化技术的快速发展&#xff0c;2025年的甘特图工具市场呈现出前所未有的多元化和智能化趋势。从开源软件到云端协作…

AIGC与数字金融:人工智能金融创新的新纪元

AIGC与数字金融&#xff1a;人工智能金融创新的新纪元 引言 人工智能生成内容&#xff08;AIGC&#xff09;在数字金融领域发挥着关键作用&#xff0c;从金融内容生成到智能风控&#xff0c;从个性化服务到投资决策&#xff0c;AIGC正在重塑金融的方式和效果。本文将深入探讨A…

手机怎么查看网络ip地址?安卓/iOS设备查询指南

在移动互联网时代&#xff0c;IP地址作为设备的网络身份证&#xff0c;无论是网络调试、远程连接还是排查故障都至关重要。本文将系统介绍安卓和iOS设备查看IP地址的多种方法&#xff0c;帮助您快速掌握这一实用技能。 一、安卓手机查看IP地址方法 1、通过WiFi设置查看 打开设…

无损耗协议:PROFINET和EtherNet IP网关的高效安装指南

作为风力发电机组监控系统的重要组成部分&#xff0c;PROFINET和EtherNet/IP协议转换网关倍讯BX-606-EIP的安装至关重要。作为安装工,我们要确保网关安装的高效顺利,保证风力发电机组的稳定运行。 首先,我们需要仔细检查网关的硬件接口,确保所有连接线缆与设备端口相匹配。网关…

【知识产权出版社-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务

1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”&#xff0c;就是“身份鉴定”“权限判断”。涉及的技术有&#xff1a;OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权&#xff0c;使用Jwt签发Access Token和Refresh Token&#xff0c;并管理token…

liunx定时任务,centos定时任务

yum install cronie crontabs -y直接运行 crond -n 在前台运行 crond -i 守护进程在没有inotify支持的情况下运行systemctl service crond start # 启动服务 systemctl enable crond.service # 设置开机自启 sudo systemctl restart crond # 重启 cron 服务systemctl serv…

三种嵌入式开发常用的组网方式

一、三种嵌入式开发常用的组网方式 这里记录了三种嵌入式开发常用的网络环境&#xff0c;最终目标也就是让开发板、虚拟机、物理机在同一个局域网下。一般的网络环境下都非常容易实现&#xff0c;但是对于学生校园网可得想些法子了&#xff0c;因为校园网一般会有设备连接数限…

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案

ping baidu.coom可以通&#xff0c;ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址&#xff0c;记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6&#xff0c;eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…

城市排水管网流量监测系统解决方案

一、方案背景 随着工业的不断发展和城市人口的急剧增加&#xff0c;工业废水和城市污水的排放量也大量增加。目前&#xff0c;我国已成为世界上污水排放量大、增加速度快的国家之一。然而&#xff0c;总体而言污水处理能力较低&#xff0c;有相当部分未经处理的污水直接或间接排…

Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群

Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群 1.本机部署个代理 这里我是自己用dockersing-box 部署的 http://192.168.2.105:10808 如果 用v2rayN等软件部署的&#xff0c;记得开启局域网共享 2.安装虚拟机 我本机使用的是Ubuntu Desktop ,这里在QEMU/K…

YOLOv8 在单片机上的几种部署方案

YOLOv8 在单片机上的部署方案 单片机资源&#xff08;如内存、计算能力&#xff09;有限&#xff0c;直接部署完整的 YOLOv8 模型并不现实。不过&#xff0c;我们可以通过模型量化、优化和使用轻量级框架来实现简化版的目标检测。下面为你介绍几种可行的方案&#xff1a; 方案…

后端框架(1):Mybatis

什么是框架&#xff1f; 盖高楼&#xff0c;框架结构。 框架结构就是高楼的主体&#xff0c;基础功能。 把很多基础功能已经实现了(封装了)。 在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效率。 mybatis&#xff1a;对jd…

linux下tcp/ip网络通信笔记1,

本文章主要为博主在学习网络通信的笔记一个Udp_echo_server,和client的代码实现 1&#xff0c;网络发展&#xff0c;网络协议&#xff0c;意识到网络通信——不同主机的进程间通信&#xff0c; 2&#xff0c;学习如何在应用层调用系统提供的接口进行通信&#xff0c;echo_Udp…

语音识别——声纹识别

通过将说话人的声音与数据库中的记录声音进行比对&#xff0c;判断说话人是否为数据库白名单中的同一人&#xff0c;从而完成语音验证。目前&#xff0c;3D-Speaker 声纹验证的效果较为出色。 3D-Speaker 是一个开源工具包&#xff0c;可用于单模态和多模态的说话人验证、说话…

window 显示驱动开发-报告图形内存(三)

图形内存报告示例 示例 1&#xff1a;笔记本电脑上的 128 MB 专用板载图形内存 以下屏幕截图显示了使用 Intel Iris 离散图形适配器运行 Windows 11 的 Surface 笔记本电脑的计算图形内存数。 适配器的可用内存总数为 16424 MB&#xff0c;用于图形用途&#xff0c;细分如下&…

UE5 GAS框架解析内部数据处理机制——服务器与客户端

当&#xff0c; gas通过点击鼠标光标触发事件时&#xff0c;内部的处理机制。 当通过点击事件&#xff0c;命中中目标时&#xff0c; 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时&#xff0c; 服…