基于C语言的贪吃蛇小游戏(简易版)

news2024/11/24 13:34:18

这篇博客会是对学习C语言成果的检测,为了实现贪吃蛇小游戏,我们用到的“工具”有:C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。

目录

1.简易版游戏效果

1.1欢迎界面

1.2游戏规则提示页面

1.3游戏进行页面

1.4游戏结束页面

2.游戏需要实现的内容

3.Win32 API介绍 

3.1Win32 API 

3.2控制台程序 

3.3控制台屏幕上的坐标COORD 

3.4游戏实现是可能用到的Win32 API 函数

3.4.1GetStdHandle

3.4.1.1函数格式

 3.4.1.2使用样例

3.4.2GetConsoleCursorInfo

3.4.2.1函数格式

3.4.2.1.1 CONSOLE_CURSOR_INFO 

3.4.2.2使用样例 

3.4.3SetConsoleCursorInfo

3.4.3.1函数格式

3.4.3.2使用样例

3.4.4SetConsoleCursorPosition

3.4.4.1函数格式

3.4.4.2使用样例 

3.4.5GetAsyncKeyState

3.4.5.1函数格式

3.4.5.2使用样例

 3.5其余相关知识点

3.5.1本地化

3.5.1.1类项

3.5.1.2setlocale函数 

3.5.1.2.1函数格式

3.5.1.2.2使用样例 

3.5.2宽字符的打印

4.游戏流程设置

5.游戏实现代码 

5.1 Snake.h

5.2 Snake.c

5.3 tool.h

5.4 tool.c

5.5 main.c


1.简易版游戏效果

关于本人实现的贪吃蛇 ,有四个展示页面:

1.1欢迎界面

1.2游戏规则提示页面

 

1.3游戏进行页面

 

1.4游戏结束页面

 

2.游戏需要实现的内容

  • 贪吃蛇地图绘制
  • 蛇吃食物的功能(上、下、左、右⽅向键控制蛇的动作)
  • 蛇撞墙死亡
  • 蛇撞自身死亡
  • 计算得分
  • 蛇身加速、减速
  • 暂停游戏 

实现环境:Windows环境的控制台

3.Win32 API介绍 

3.1Win32 API 

简单来说就是包含在一个附加名为DLL的动态连接库文件中的一类函数

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

3.2控制台程序 

平常我们运行起来的黑框程序其实就是控制台程序

我们可以使用cmd命令中的mode命令来设置控制台窗口的长宽:

设置控制台窗口的大小,30行,100列

mode con cols=100 lines=30

使用title命令设置控制台窗口名字: 贪吃蛇

title 贪吃蛇

如果在修改过程中发现无法修改窗口大小,此时需要将控制台程序的默认终端应用程序改为“让Windows决定”,如果还是无法修改(有些电脑无法做到,比如我的),则再将其改为Windows控制台主机

3.3控制台屏幕上的坐标COORD 

COORD 是Windows API中定义的一个结构体,表示一个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。 横着向右是x轴,竖着向下是y轴。

以下是COORD类型结构体的声明: 

typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD;

3.4游戏实现是可能用到的Win32 API 函数

3.4.1GetStdHandle

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

可以理解为我们通过这个函数获取对标准输入、标准输出或标准错误的控制权,这个权杖就是存放函数返回值的指针

3.4.1.1函数格式
HANDLE GetStdHandle(DWORD nStdHandle);

 

 3.4.1.2使用样例

 例如想要获取对标准输出的控制权。

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

3.4.2GetConsoleCursorInfo

检索有关指定控制台屏幕缓冲区的光标大小可见性的信息 

3.4.2.1函数格式
BOOL WINAPI GetConsoleCursorInfo(
    HANDLE hConsoleOutput,
    PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

  

3.4.2.1.1 CONSOLE_CURSOR_INFO 

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

typedef struct _CONSOLE_CURSOR_INFO {
    DWORD dwSize;
    BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
3.4.2.2使用样例 
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值) 
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 

3.4.3SetConsoleCursorInfo

 设置指定控制台屏幕缓冲区的光标的大小可见性

3.4.3.1函数格式
BOOL WINAPI SetConsoleCursorInfo(
    HANDLE hConsoleOutput,
    const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

 

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

3.4.4SetConsoleCursorPosition

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

3.4.4.1函数格式
BOOL WINAPI SetConsoleCursorPosition(
    HANDLE hConsoleOutput,
    COORD pos
);

 

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

3.4.5GetAsyncKeyState

获取按键情况

GetAsyncKeyState的返回值是short类型,在上一次调用 GetAsyncKeyState 函数后,如果返回的16位的short数据中:

  • 如果最高位是1,说明按键的状态是按下
  • 如果最高是0,说明按键的状态是抬起
  • 如果最低位被置为1,则说明该按键被按过,反之为0
3.4.5.1函数格式
SHORT GetAsyncKeyState(int vKey);

vKey是虚拟密钥代码(下面为链接)

https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes 

展示本游戏要用到的虚拟密钥代码 :

VK_SPACE0x20空格键
VK_F30x72F3 键
VK_F40x73F4 键
VK_ESCAPE0x1BESC 键
VK_LEFT0x25LEFT ARROW 键
VK_UP0x26UP ARROW 键
VK_RIGHT0x27RIGHT ARROW 键
VK_DOWN0x28DOWN ARROW 键
3.4.5.2使用样例
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
#include <stdio.h>
#include <windows.h>
int main()
{
	while (1)
	{
		if (KEY_PRESS(0x30))
		{
			printf("0\n");
		}
		else if (KEY_PRESS(0x31))
		{
			printf("1\n");
		}
		else if (KEY_PRESS(0x32))
		{
			printf("2\n");
		}
		else if (KEY_PRESS(0x33))
		{
			printf("3\n");
		}
		else if (KEY_PRESS(0x34))
		{
			printf("4\n");
		}
		else if (KEY_PRESS(0x35))
		{
			printf("5\n");
		}
	}
	return 0;
}

 3.5其余相关知识点

3.5.1<locale.h>本地化

 <locale.h>提供的函数用于控制C标准库中对于不同的地区会产生不一样行为的部分。

在标准中,依赖地区的部分有以下几项:

• 数字量的格式

• 货币量的格式

• 字符集

• 日期和时间的表示形式

3.5.1.1类项

通过修改地区,程序可以改变它的行为来适应世界的不同区域。

但地区的改变可能会影响库的许多部分,其中一部分可能是我们不希望修改的。所以C语言支持针对不同的类项进行修改,下面的一个宏, 指定一个类项:

  • LC_COLLATE:影响字符串比较函数 strcoll() 和 strxfrm() 。
  • LC_CTYPE:影响字符处理函数的行为。
  • LC_MONETARY:影响货币格式。
  • LC_NUMERIC:影响 printf() 的数字格式。
  • LC_TIME:影响时间格式 strftime() 和 wcsftime() 。
  • LC_ALL:针对所有类项修改,将以上所有类别设置为给定的语言环境。
3.5.1.2setlocale函数 
3.5.1.2.1函数格式
char* setlocale (int category, const char* locale);

setlocale函数用于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。 setlocale的第一个参数可以是前面说明的类项中的一个,那么每次只会影响一个类项,如果第一个参数是LC_ALL,就会影响所有的类项。 C标准给第二个参数仅定义了2种可能取值:"C"(正常模式)"  "(本地模式)。 

3.5.1.2.2使用样例 

切换到我们的本地模式后就支持宽字符(汉字)的输出

setlocale(LC_ALL, " ");//切换到本地环境 

3.5.2宽字符的打印

过去C语言并不适合非英语国家(地区)使用。 C语言最初假定字符都是单字节的。但是这些假定并不是在世界的任何地方都适用。为了使C语言适应国际化,C语言的标准中不断加入了国际化的支持。比如:加入了宽字符的类型 wchar_t 和宽字符的输入和输出函数,加入了头文件,其中提供了允许程序员针对特定地区(通常是国家或者说某种特定语言的地理区域)调整程序行为的函数。 

宽字符的字面量必须加上前缀“L”,否则 C 语言会把字面量当作窄字符类型处理。前缀“L”在单引 号前面,表示宽字符,对应 wprintf() 的占位符为 %lc ;在双引号前面,表示宽字符串,对应 wprintf() 的占位符为 %ls  

以下为举例:

#include <stdio.h>
#include<locale.h>
int main() {
	setlocale(LC_ALL, "");
	wchar_t ch1 = L'●';
	wchar_t ch2 = L'★';


	wprintf(L"%lc\n", ch1);
	wprintf(L"%lc\n", ch2);

	return 0;
}

4.游戏流程设置

 

程序开始就设置程序支持本地模式,

然后进入游戏的主逻辑。 主逻辑分为3个过程:

  1. 游戏开始:完成游戏的初始化
  2. 游戏运行:完成游戏运行逻辑的实现
  3. 游戏结束:完成游戏结束的说明,实现资源释放 

5.游戏实现代码 

5.1 Snake.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include"tool.h"
#include"locale.h"
#include<Windows.h>
#include<stdbool.h>
#include"vld.h"
#define ROW 60
#define CON 30
#define SROW 20//蛇的初始列
#define SCON 5//蛇的初始行
#define WALL L'囧'
#define SNAKE L'●'
#define FOOD L'★'
#define KEY_PRESS(vk) (GetAsyncKeyState(vk) & 1)

enum State
{
	OK = 1,//正常运行
	PAUSE,//暂停
	ESC,//正常退出
	KILL_BY_SELF,//撞到自己
	KILL_BY_WALL//撞墙
};
enum Dir {
	UP=1,//上
	DOWN,//下
	LEFT,//左
	RIGHT//右
};
typedef struct SnakeNode {
	int x;
	int y;//坐标
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

typedef struct Snake {
	pSnakeNode phead;
	enum State _state;//蛇状态
	int _score;//得分
	int food_score;//食物分数
	SnakeNode _food;//食物节点
	enum Dir dir;//方向
	int _sleep;//睡眠时间

}Snake;

//函数声明
void InitGame(Snake* psnake);//初始化游戏
void Welcome();//欢迎界面
void MapInit();//打印地图
void SnakeInit(Snake*snake);//初始化贪吃蛇
void Game(Snake* snake);//游戏运行
void PutFood(Snake* snake);//放置食物

void Pause();//暂停
//释放链表节点
void Relese(pSnakeNode phead);

5.2 Snake.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Snake.h"
#include"tool.h"
//初始化游戏
void InitGame(Snake*psnake)
{
	//初始化界面
	system("mode con cols=80 lines=40");

	system("title 贪吃蛇");
	//隐藏光标
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursorinfo;
	GetConsoleCursorInfo(houtput, &cursorinfo);//获取控制台光标信息 

	cursorinfo.bVisible = false;
	SetConsoleCursorInfo(houtput, &cursorinfo);

	//初始化贪吃蛇信息
	psnake->dir = RIGHT;
	psnake->food_score = 10;
	psnake->phead = NULL;
	psnake->_score = 0;
	psnake->_state = OK;
	psnake->_sleep = 200;
	
}
//欢迎界面
void Welcome()
{
	//打印欢迎信息
	setpos(30, 19);
	printf("欢迎来到贪吃蛇小游戏!\n");
	setpos(32, 20);
	system("pause");


	system("cls");
	//打印规则
	setpos(16, 19);
	printf("用↑ . ↓ . ← . →控制蛇的移动,F3加速,F4减速");
	setpos(16, 20);

	printf("不同速度得分不同");

	setpos(28, 21);
	system("pause");

	system("cls");

}
//打印地图
void MapInit()
{
	int i;
	//上
	setpos(0, 0);
	for (i = 0; i < ROW; i += 2)
	{
		wprintf(L"%lc", WALL);
	}
	//下
	setpos(0, 29);
	for (i = 0; i < ROW; i += 2)
	{
		wprintf(L"%lc", WALL);
	}
	//左
	for(i=1;i<CON-1;i++)
	{
		setpos(0, i);
		wprintf(L"%lc", WALL);

	}

	//右
	for (i = 1; i < CON - 1; i++)
	{
		setpos(58, i);
		wprintf(L"%lc", WALL);

	}

}

//初始化贪吃蛇
void SnakeInit(Snake*snake)
{
	int i = 0;
	pSnakeNode cur = snake->phead;
	
	for (i = 0; i < 5; i++)
	{
		cur = (pSnakeNode)malloc(sizeof(SnakeNode));
		if (cur == NULL)
		{
			perror("malloc cur");
			return;
		}
		cur->x = SROW+i*2;
		cur->y = SCON;
		//头插
		cur->next = snake->phead;
		snake->phead = cur;

	}

	PrintNode(snake);

	
}
//放置食物
void PutFood(Snake* snake)
{
	pSnakeNode food = (pSnakeNode)malloc(sizeof(SnakeNode));

	if (food == NULL)
	{
		perror("malloc food");
		return;
	}
again:
	do
	{
		food->x = rand() % 56 + 1;
		food->y = rand() % 28 + 1;
		food->next = NULL;
	} while (food->x % 2 != 0);//

	pSnakeNode cur = snake->phead;
	//食物不能在蛇身上
	while (cur)
	{
		if (cur->x == food->x && cur->y == food->y)
			goto again;
		cur = cur->next;
	}
	//赋值
	snake->_food = *food;

	//打印
	setpos(snake->_food.x, snake->_food.y);
	wprintf(L"%lc", FOOD);
	free(food);

}
//暂停
void Pause()
{
	while (1)
	{
		Sleep(200);
		if (KEY_PRESS(VK_SPACE) == 1)
			break;
	}
}

//游戏运行
void Game(Snake* snake)
 {
	//显示规则
	setpos(62, 8);
	printf("规则:");
	setpos(62, 9);
	printf("1.不要撞墙");
	setpos(62, 10);
	printf("2.不要撞到自己");
	setpos(62, 11);
	printf("3.F3加速");
	setpos(62, 12);
	printf("4.F4减速");
	setpos(62, 13);
	printf("5.空格暂停");
	setpos(62, 14);
	printf("6.Esc退出");
	//放置食物
	PutFood(snake);
	//蛇移动(更新数据)
	while (snake->_state == OK)
	{
		setpos(62, 5);
		printf("当前食物分值:%2d", snake->food_score);
		setpos(62, 6);
		printf("当前得分:%d", snake->_score);
		pSnakeNode pnext = (pSnakeNode)malloc(sizeof(SnakeNode));
		if (pnext == NULL)
		{
			perror("malloc pnext fail");
			return;
		}
		//按键判断
		//方向判断
		if (KEY_PRESS(VK_UP) == 1 && snake->dir != DOWN)
		{
			snake->dir = UP;

		}
		else if (KEY_PRESS(VK_DOWN) == 1 && snake->dir != UP)
		{
			snake->dir = DOWN;

		}
		else if (KEY_PRESS(VK_LEFT) == 1 && snake->dir != RIGHT)
		{
			snake->dir = LEFT;

		}
		else if (KEY_PRESS(VK_RIGHT) == 1 && snake->dir != LEFT)
		{
			snake->dir = RIGHT;

		}
		else if (KEY_PRESS(VK_SPACE) == 1)//判断暂停
		{
			Pause();
		}
		else if (KEY_PRESS(VK_ESCAPE) == 1)//判断退出
		{
			snake->_state = ESC;
			setpos(26, 14);
			printf("已退出");
			break;
		}
		else if (KEY_PRESS(VK_F3) == 1)//加速
		{
			if(snake->_sleep>80)
			{
				snake->_sleep -= 50;
				snake->food_score += 2;
			}
		}
		else if (KEY_PRESS(VK_F4) == 1)//减速
		{
			if (snake->food_score > 2)
			{
				snake->_sleep += 50;
				snake->food_score -= 2;
			}
		}
		//刷新蛇身信息
		if (snake->dir == UP)
		{
			pnext->x = snake->phead->x;
			pnext->y = snake->phead->y - 1;
		}
		else if (snake->dir == DOWN)
		{
			pnext->x = snake->phead->x;
			pnext->y = snake->phead->y + 1;
		}
		else if (snake->dir == LEFT)
		{
			pnext->x = snake->phead->x - 2;
			pnext->y = snake->phead->y;
		}
		else if (snake->dir == RIGHT)
		{
			pnext->x = snake->phead->x + 2;
			pnext->y = snake->phead->y;
		}

		//状态判断
		
		//吃到食物
		if (pnext->x == snake->_food.x && pnext->y == snake->_food.y)
		{
			pnext->next = snake->phead;
			snake->phead = pnext;
			
			PrintNode(snake);
			PutFood(snake);
			snake->_score += snake->food_score;
		}
		else {
			//没有食物
			pnext->next = snake->phead;
			snake->phead = pnext;
			pSnakeNode cur = snake->phead;
			while (cur->next->next)
			{
				cur = cur->next;
			}
			setpos(cur->next->x, cur->next->y);
				printf("  ");
			free(cur->next);
			cur->next = NULL;
			PrintNode(snake);

		}
		//撞墙
		if (pnext->x == 0 || pnext->x == 58 || pnext->y == 0 || pnext->y == 29)
		{
			snake->_state = KILL_BY_WALL;
			setpos(26, 14);
			printf("您撞墙了");
		}
		//撞自己
		pSnakeNode cur = snake->phead->next;
		while (cur)
		{
			if (snake->phead->x == cur->x && snake->phead->y == cur->y)
			{
				snake->_state = KILL_BY_SELF;
				setpos(26, 14);
				printf("您撞上了自己");
				break;
			}
			cur = cur->next;
		}

		Sleep(snake->_sleep);
	}
	
}
//释放链表节点
void Relese(pSnakeNode phead)
{
	pSnakeNode cur=phead;
	while (phead)
	{
		cur = phead;
		phead = phead->next;
		free(cur);

	}
	//出函数后要置空phead
}

5.3 tool.h

#pragma once
#include<Windows.h>
#include<stdbool.h>
//前置声明
typedef struct SnakeNode* pSnakeNode;
typedef struct Snake Snake;
//函数声明

//定位光标
void setpos(int x,int y);
//打印节点
void PrintNode(Snake* snake);

5.4 tool.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"tool.h"
#include"Snake.h"
//定位光标
void setpos(int x,int y){
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(houtput, pos);
}
//打印节点
void PrintNode(Snake* snake)
{
	pSnakeNode cur = snake->phead;
	while(cur)
	{
		setpos(cur->x, cur->y);
		wprintf(L"%lc", SNAKE);
		cur = cur->next;
	}

}

5.5 main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Snake.h"
void test(Snake* snake) {
	//显示欢迎,提示页面
	Welcome();
	//初始化地图
	MapInit();
	//初始化贪吃蛇
	SnakeInit(snake);
	//游戏运行
	Game(snake);
	//结束善后
	//释放链表节点
	Relese(snake->phead);
	snake->phead = NULL;
	setpos(22, 15);
}
int main()
{
	int a;
	
	//初始化本地环境
	setlocale(LC_ALL, "");
	do
	{
		a = 0;
		system("cls");
		//初始化游戏
		srand((unsigned int)time(NULL));
		Snake snake = { 0 };

		InitGame(&snake);
		//游戏逻辑
		test(&snake);

		printf("是否再来一局(1.Yes/0.No):");
		scanf("%d", &a);
		
	} while (a == 1);
	setpos(0, 30);
	return 0;
}

 --------------------------------------------------------------------------------------------------------------------------------

好啦,关于贪吃蛇小游戏的实现讲解就先到这里啦,看完的小伙伴记得关注支持一下博主哦~

有问题欢迎在下方提问~

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

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

相关文章

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 &#xff0c;首先从基本原理图、引脚方面开始做个初步理解并整理&#xff1a; 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星&#xff0c;芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

恭喜发财!东方第一 MEME 拥抱符文

第 431 号符文 HOPE•YOU•GET•RICH &#x1f9e7;&#xff0c;是 Omnity 首个支持的跨链 Runes 资产&#xff0c;也是TG群里红包小程序支持的第一个 Runes 资产。 大家可以在 Omnity 的 TG 群和 RunesCC 的 TG 群里&#xff0c;不定时的抢到符文红包。 Omnity TG&#xff1a;…

智慧监测IN!计讯物联筑牢高速滑坡预警“安全锁”

在现代社会&#xff0c;高速公路以其高速、便捷的特性&#xff0c;早已成为连接城市与地区之间的重要纽带&#xff0c;承载着日益增长的车流和人流。然而&#xff0c;随着车流量的激增&#xff0c;高速公路面临的运营压力和安全挑战也随之加大&#xff0c;其中滑坡风险尤为突出…

ArrayList线程安全问题解决方案

jdk8 Stream API的出现大大简化了我们对于集合元素的处理代码&#xff0c;对于串行流来说&#xff0c;无需考虑线程安全问题&#xff1b;但是&#xff0c;对于并行流来说&#xff0c;由于它是以多线程的方式并行处理同一个集合中的数据元素的&#xff0c;因此&#xff0c;存在着…

智慧交通系统:未来出行,从这里开始

随着城市化进程的加快&#xff0c;交通拥堵、事故频发、停车难等问题日益凸显&#xff0c;传统交通管理模式已难以满足现代社会的需求。智慧交通系统作为解决这些问题的关键&#xff0c;通过集成创新技术&#xff0c;实现交通管理的智能化、信息化&#xff0c;提高交通系统的运…

Unity射击游戏开发教程:(10)创建主界面

主界面开发 玩游戏时,主菜单是事后才想到要做的。实际上几乎每个游戏都有一个主界面。如果你点击打开游戏并立即开始游戏,你会感到非常惊讶。本文将讨论如何创建带有启动新游戏的交互式按钮的主界面/主菜单。 主菜单将是一个全新的场景。我们将添加一个 UI 图像元素,并在图像…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展&#xff0c;智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者&#xff0c;已经成为许多家庭清洁的好帮手。然而&#xff0c;面对满目琳琅的洗地机品牌型号&#xff0c;究竟哪一款机型适合家用呢&#xff0c;正好618也临近了&#xff0c;又有哪些…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

5.7代码

1.环境治理 分析&#xff1a;最开始进入了一个误区&#xff0c;觉得都有通路了直接算通路就可以&#xff0c;后来才发现居然是最小路径的总和&#xff0c;所以大概是每减一次都要算一次各点之间的最小路径了&#xff0c;然后是循环&#xff0c;到需要的条件为止 总的来说思路不…

通过颜色学习css

文章目录 1.生成html2.添加css链接3.将h1标签text-align元素4.添加div标签4.1、为类marker添加元素4.2、添加两个新的div标签4.3、修改div标签的类型并修改css元素4.4、为类container添加元素4.5、以数字形式添加颜色4.5、container添加padding属性4.6、组合css中的颜色属性4.7…

SG-8018CE晶体振荡器可编程规格书

SG-8018CE系列晶体振荡器是一个高性能、多功能且具有高度集成性的解决方案&#xff0c;它满足了现代电子系统的严格要求。其广泛的频率范围0.67 MHz到170 MHz&#xff0c;且频率调节精度达到1ppm&#xff0c;1.62 V至3.63V的宽广电源电压&#xff0c;使能&#xff08;OE&#x…

【notepad++】使用

1 notepad 下载路径 https://notepad-plus.en.softonic.com/download 2 设置护眼模式 . 设置——语言格式设置——前景色——黑色 . 背景色——RGB &#xff1a;199 237 204 . 勾选“使用全局背景色”、“使用全局前景色” . 保存并关闭

一致性评价政策加速行业仿制药洗牌,惯爱为代表的新锐品牌崭露头角

从印度神油到以形补形&#xff0c;男人的问题&#xff0c;从古至今一直困扰着很多人&#xff0c;大多人都羞于启齿。然而&#xff0c;沉默的背后&#xff0c;隐藏着令人震惊的数据&#xff1a;据统计显示&#xff0c;ED&#xff08;勃起功能障碍&#xff09;是男性生殖系统发病…

3d模型实体显示有隐藏黑线?---模大狮模型网

在3D建模和设计领域&#xff0c;细节决定成败。然而&#xff0c;在处理3D模型时&#xff0c;可能会遇到模型实体上出现隐藏黑线的问题。这些黑线可能影响模型的视觉质量和呈现效果。因此&#xff0c;了解并解决这些隐藏黑线的问题至关重要。本文将探讨隐藏黑线出现的原因&#…

免收隔夜费的外汇平台特点与选择

外汇交易是一种全球范围内的投资活动&#xff0c;参与者包括银行、机构投资者、交易商和个人交易者。在外汇交易中&#xff0c;隔夜费&#xff08;也称为掉期费或展期费&#xff09;是当持仓过夜时&#xff0c;因货币对利率差异而产生的费用。这种费用对一些交易者&#xff0c;…

操作系统实战(二)(linux+C语言)

实验内容 通过Linux 系统中管道通信机制&#xff0c;加深对于进程通信概念的理解&#xff0c;观察和体验并发进程间的通信和协作的效果 &#xff0c;练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…

知行之桥EDI系统跨平台版本安装报错及解决方案

本文将为大家介绍如何在Windows系统中安装知行之桥EDI系统跨平台版本的常见报错以及解决方案。如下图所示&#xff1a; 在知行软件官网的导航栏中点击 下载 按钮&#xff0c;即可看到知行之桥EDI系统不同版本的下载选项&#xff0c;点击右侧跨平台版本&#xff0c;选择 Windows…

uniapp-ios支付

uniapp安卓包中的微信,支付宝逻辑放在iOS测试包中也能使用. 但询问iOS开发者后得知,有支付相关功能的app要上架苹果,必须先有苹果支付,不然苹果审核不给过.甚至没有支付逻辑,但打包时有支付相关的SDK也不行,苹果会认为你偷偷做了支付逻辑,想要绕开他. 一. 去苹果开发者后台把…

蓝桥杯备赛(填空题)【Python B组】

一、弹珠堆放 问题描述 小蓝有 20230610 颗磁力弹珠&#xff0c;他对金字塔形状尤其感兴趣&#xff0c;如下图所示&#xff1a; &#xff08;图是盗来的啊&#xff0c;侵权请联系删除&#xff09; 问题分析 找规律&#xff0c;第一层1个&#xff0c;第二层3个&#xff0c;第…