敲代码都两年半了,还不会用SDL、C语言rap一个推箱子?

news2024/10/7 9:21:10

前言

欢迎来到小K的SDL专栏第三小节,本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解,这里也为大家上传了源码和图片资源,需要的自取看完以后,希望对你有所帮助

✨效果如下


文章目录

    • 前言
    • 一、推箱子思路讲解
    • 二、加SDL绘图代码
    • 三、完整代码
    • 四、总结


一、推箱子思路讲解

第一步,我们先用枚举把下图中的元素表示出来,分别为空地、墙、目的地、箱子、玩家

enum MyEnum { SPACE, WALL, DEST, BOX, PLAYER };

在这里插入图片描述


第二步我们就需要自己定义一个地图来使用,我这里写的推箱子就三关,所以定义了一个三页的二维数组

//定义一个地图
	int map[3][ROW][COL] =
	{
		{
			{0,0,0,0,0,0,0,0,0,0},
			{0,0,0,1,1,1,0,0,0,0},
			{0,0,0,1,2,1,0,0,0,0},
			{0,0,0,1,3,1,1,1,1,0},
			{0,1,1,1,0,3,0,2,1,0},
			{0,1,2,3,4,0,1,1,1,0},
			{0,1,1,1,1,3,1,0,0,0},
			{0,0,0,0,1,2,1,0,0,0},
			{0,0,0,0,1,1,1,0,0,0},
			{0,0,0,0,0,0,0,0,0,0}
		},
		{
			{0,0,0,0,0,0,0,0,0,0},
			{0,0,1,1,0,0,1,1,0,0},
			{0,1,2,0,1,1,0,2,1,0},
			{1,0,0,0,0,0,0,0,0,1},
			{1,0,0,3,4,0,3,0,0,1},
			{0,1,0,0,0,3,0,0,1,0},
			{0,0,1,0,3,0,0,1,0,0},
			{0,0,0,1,2,2,1,0,0,0},
			{0,0,0,0,1,1,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0}
		},
		{
			{1,1,1,1,0,0,1,1,1,1},
			{1,2,0,1,0,0,1,0,2,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,3,1,1,1,1,3,0,1},
			{1,0,0,3,4,0,3,0,0,1},
			{1,0,0,0,0,0,0,0,0,1},
			{1,2,0,0,0,0,0,0,2,1},
			{1,1,1,1,1,1,1,1,1,1}
		}
	};

第三步我们就需要一个推箱子的逻辑思维,比方说,前面是空地要怎么操作,前面是箱子又要怎么办?不要着急,和我先打两个半球~

⭐既然是推箱子,那我们肯定要知道谁推箱子,所以第一小步就是找人,这就好办了,我们直接遍历地图,无非只有两种情况,要么是人站在空地上,由于空地为0,所以只需要判断人,要么是人站在目的地上

//玩家的当前的下标
	int r = -1;
	int c = -1;
	//找到玩家的下标
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k] == PLAYER || map[i][k] == DEST + PLAYER)
			{
				r = i;
				c = k;
				goto endLoop;
			}
		}
	}
endLoop:;

⭐第二小步就是推箱子的具体逻辑了,这里我们以上为例

玩家前面是箱子玩家前面是空地
箱子的前面是空地或者目的地前面空地+PLAYER,本来人站的地方减去PLAYER
⭐1,把箱子移动到前面 ⭐2,把箱子从原来的位置删掉 ⭐3.把玩家移动到箱子原来的位置⭐4,把玩家从原来的位置删掉
case SDLK_w:
			//如果玩家的前面是空地
			if (map[r - 1][c] == SPACE || map[r - 1][c] == DEST)
			{
				map[r - 1][c] += PLAYER;
				map[r][c] -= PLAYER;
			}
			//如果玩家的前面是箱子
			else if (map[r - 1][c] == BOX || map[r - 1][c] == BOX + DEST)
			{
				//如果箱子的前面是空地或者目的地
				if (map[r - 2][c] == SPACE || map[r - 2][c] == DEST)
				{
					//1,把箱子移动到前面
					map[r - 2][c] += BOX;
					//2,把箱子从原来的位置删掉
					map[r - 1][c] -= BOX;
					//3,把玩家移动到箱子原来的位置
					map[r - 1][c] += PLAYER;
					//4,把玩家从原来的位置删掉
					map[r][c] -= PLAYER;
				}
			}
			break;

完整的推箱子逻辑代码

//推箱子
void pushBox(int map[][COL], int key)
{
	//玩家的当前的下标
	int r = -1;
	int c = -1;
	//找到玩家的下标
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k] == PLAYER || map[i][k] == DEST + PLAYER)
			{
				r = i;
				c = k;
				goto endLoop;
			}
		}
	}
endLoop:;

	switch (key)
	{
		case SDLK_w:
			//如果玩家的前面是空地
			if (map[r - 1][c] == SPACE || map[r - 1][c] == DEST)
			{
				map[r - 1][c] += PLAYER;
				map[r][c] -= PLAYER;
			}
			//如果玩家的前面是箱子
			else if (map[r - 1][c] == BOX || map[r - 1][c] == BOX + DEST)
			{
				//如果箱子的前面是空地或者目的地
				if (map[r - 2][c] == SPACE || map[r - 2][c] == DEST)
				{
					//1,把箱子移动到前面
					map[r - 2][c] += BOX;
					//2,把箱子从原来的位置删掉
					map[r - 1][c] -= BOX;
					//3,把玩家移动到箱子原来的位置
					map[r - 1][c] += PLAYER;
					//4,把玩家从原来的位置删掉
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_s:
			if (map[r + 1][c] == SPACE || map[r + 1][c] == DEST)
			{
				map[r + 1][c] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r + 1][c] == BOX || map[r + 1][c] == BOX + DEST)
			{
				if (map[r + 2][c] == SPACE || map[r + 2][c] == DEST)
				{
					map[r + 2][c] += BOX;
					map[r + 1][c] -= BOX;
					map[r + 1][c] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_a:
			if (map[r][c - 1] == SPACE || map[r][c - 1] == DEST)
			{
				map[r][c - 1] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r][c - 1] == BOX || map[r][c - 1] == BOX + DEST)
			{
				if (map[r][c - 2] == SPACE || map[r][c - 2] == DEST)
				{
					map[r][c - 2] += BOX;
					map[r][c - 1] -= BOX;
					map[r][c - 1] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_d:
			if (map[r][c + 1] == SPACE || map[r][c + 1] == DEST)
			{
				map[r][c + 1] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r][c + 1] == BOX || map[r][c + 1] == BOX + DEST)
			{
				if (map[r][c + 2] == SPACE || map[r][c + 2] == DEST)
				{
					map[r][c + 2] += BOX;
					map[r][c + 1] -= BOX;
					map[r][c + 1] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
	}

}


第四步也是最后一步,我们还需要判断一下过关没有,这个好判断,我们直接遍历整个地图,看看还有没有箱子

//判断是否过关
bool passLevel(int map[][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k] == BOX)
			{
				return false;
			}
		}
	}
	return true;
}

二、加SDL绘图代码

第一步我们先搭建一下我们的绘图框架,具体的可以看我的SDL专栏第二小节

int main(int argc,char* argv[])
{
	//初始化
	if (SDL_Init(SDL_INIT_VIDEO) != 0)
	{
		SDL_Log("Init failed%s\n", SDL_GetError());
		return -1;
	}
	//创建窗口
	SDL_Window* window = SDL_CreateWindow("pushBox", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 640, SDL_WINDOW_SHOWN);
	if (!window)
	{
		SDL_Log("create window failed!%s\n", SDL_GetError());
		return -1;
	}
	//创建渲染器
	SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
	if (!render)
	{
		SDL_Log("create Renderer failed!%s\n", SDL_GetError());
		return -1;
	}
	/*****************************/
	//接下来的操作//
	/*****************************/
	//销毁窗口
	SDL_DestroyWindow(window);
	//销毁渲染器
	SDL_DestroyRenderer(render);
	//清理并退出SDL库
	SDL_Quit();
	return 0;
}

第二步加载图片,可以看到这里准备的图片编号刚刚好就是0~6,一会在绘图上有大用,这里也有大用,这里我们直接创建一个数组,然后用SDL_snprintf在一个for循环中直接把七张图片显示加载出来
在这里插入图片描述

//加载图片
	SDL_Texture* tex[7];
	char fillname[50] = { 0 };
	for (int i = 0; i < 7; i++)
	{
		SDL_snprintf(fillname, 50, "./assets/images/%d.bmp", i);
		tex[i] = loadTexture(render, fillname);
	}
	
SDL_Texture* loadTexture(SDL_Renderer* ren, const char* fillname)
{
	SDL_Surface* sfc = SDL_LoadBMP(fillname);
	if (!sfc)
	{
		SDL_Log("loadBMP failed!%s\n", SDL_GetError());
		return NULL;
	}
	SDL_Texture* tex = SDL_CreateTextureFromSurface(ren, sfc);
	if (!tex)
	{
		SDL_Log("Texture failed!%s\n", SDL_GetError());
		SDL_FreeSurface(sfc);
		return NULL;
	}
	SDL_FreeSurface(sfc);
	return tex;
}

最后一步绘制图案,注意这里有一个小坑,二维数组横向是Y,纵向是X,而绘图窗口横向是X,纵向是Y,所以绘图的时候要刚好反一下,如下图
在这里插入图片描述

//绘制界面
void drawMap(SDL_Renderer* render, int map[][COL], SDL_Texture** texs)
{
	for (int r = 0; r < ROW; r++)
	{
		for (int c = 0; c < COL; c++)
		{
			SDL_Rect dstRect = { c * 64 ,r * 64,64,64 };
			SDL_RenderCopy(render, texs[map[r][c]], NULL, &dstRect);
		}
	}
}

三、完整代码

#include<conio.h>
#include<SDL.h>
#include<iostream>
#include<cstdio>
using namespace std;

#define ROW 10
#define COL 10

enum MyEnum { SPACE, WALL, DEST, BOX, PLAYER };

//提前声明
void pushBox(int map[][COL], int key);
bool passLevel(int map[][COL]);
SDL_Texture* loadTexture(SDL_Renderer* ren, const char* fillname);
void drawMap(SDL_Renderer* render, int map[][COL], SDL_Texture** texs);

int main(int argc,char* argv[])
{
	//初始化
	if (SDL_Init(SDL_INIT_VIDEO) != 0)
	{
		SDL_Log("Init failed%s\n", SDL_GetError());
		return -1;
	}
	//创建窗口
	SDL_Window* window = SDL_CreateWindow("pushBox", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 640, SDL_WINDOW_SHOWN);
	if (!window)
	{
		SDL_Log("create window failed!%s\n", SDL_GetError());
		return -1;
	}
	//创建渲染器
	SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
	if (!render)
	{
		SDL_Log("create Renderer failed!%s\n", SDL_GetError());
		return -1;
	}
	//加载图片
	SDL_Texture* tex[7];
	char fillname[50] = { 0 };
	for (int i = 0; i < 7; i++)
	{
		SDL_snprintf(fillname, 50, "./assets/images/%d.bmp", i);
		tex[i] = loadTexture(render, fillname);
	}

	//定义一个地图
	int map[3][ROW][COL] =
	{
		{
			{0,0,0,0,0,0,0,0,0,0},
			{0,0,0,1,1,1,0,0,0,0},
			{0,0,0,1,2,1,0,0,0,0},
			{0,0,0,1,3,1,1,1,1,0},
			{0,1,1,1,0,3,0,2,1,0},
			{0,1,2,3,4,0,1,1,1,0},
			{0,1,1,1,1,3,1,0,0,0},
			{0,0,0,0,1,2,1,0,0,0},
			{0,0,0,0,1,1,1,0,0,0},
			{0,0,0,0,0,0,0,0,0,0}
		},
		{
			{0,0,0,0,0,0,0,0,0,0},
			{0,0,1,1,0,0,1,1,0,0},
			{0,1,2,0,1,1,0,2,1,0},
			{1,0,0,0,0,0,0,0,0,1},
			{1,0,0,3,4,0,3,0,0,1},
			{0,1,0,0,0,3,0,0,1,0},
			{0,0,1,0,3,0,0,1,0,0},
			{0,0,0,1,2,2,1,0,0,0},
			{0,0,0,0,1,1,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0}
		},
		{
			{1,1,1,1,0,0,1,1,1,1},
			{1,2,0,1,0,0,1,0,2,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,0,1,0,0,1,0,0,1},
			{1,0,3,1,1,1,1,3,0,1},
			{1,0,0,3,4,0,3,0,0,1},
			{1,0,0,0,0,0,0,0,0,1},
			{1,2,0,0,0,0,0,0,2,1},
			{1,1,1,1,1,1,1,1,1,1}
		}
	};
	//当前所在关卡
	int level = 0;
	SDL_bool isDown = SDL_FALSE;
	while (!isDown)
	{
		drawMap(render, map[level], tex);
		SDL_RenderPresent(render);
		if (passLevel(map[level]))
		{
			level++;
			if (level >= 3)
			{
				std::cout << "game over,你通过了所有关卡~" << endl;
				level = 0;
				break;
			}
			std::cout << "恭喜你,通过了第" << level - 1 << "关!" << endl;
		}
		SDL_Event ev = { 0 };
		if (SDL_PollEvent(&ev))
		{
			if (SDL_QUIT == ev.type)
			{
				isDown = SDL_TRUE;
			}
			else if (ev.type == SDL_KEYDOWN)
			{
				pushBox(map[level], ev.key.keysym.sym);
			}
		}
	}

	//销毁窗口
	SDL_DestroyWindow(window);
	//销毁渲染器
	SDL_DestroyRenderer(render);
	//清理并退出SDL库
	SDL_Quit();
	return 0;
}


//绘制界面
void drawMap(SDL_Renderer* render, int map[][COL], SDL_Texture** texs)
{
	for (int r = 0; r < ROW; r++)
	{
		for (int c = 0; c < COL; c++)
		{
			SDL_Rect dstRect = { c * 64 ,r * 64,64,64 };
			SDL_RenderCopy(render, texs[map[r][c]], NULL, &dstRect);
		}
	}
}

//推箱子
void pushBox(int map[][COL], int key)
{
	//玩家的当前的下标
	int r = -1;
	int c = -1;
	//找到玩家的下标
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k] == PLAYER || map[i][k] == DEST + PLAYER)
			{
				r = i;
				c = k;
				goto endLoop;
			}
		}
	}
endLoop:;

	switch (key)
	{
		case SDLK_w:
			//如果玩家的前面是空地
			if (map[r - 1][c] == SPACE || map[r - 1][c] == DEST)
			{
				map[r - 1][c] += PLAYER;
				map[r][c] -= PLAYER;
			}
			//如果玩家的前面是箱子
			else if (map[r - 1][c] == BOX || map[r - 1][c] == BOX + DEST)
			{
				//如果箱子的前面是空地或者目的地
				if (map[r - 2][c] == SPACE || map[r - 2][c] == DEST)
				{
					//1,把箱子移动到前面
					map[r - 2][c] += BOX;
					//2,把箱子从原来的位置删掉
					map[r - 1][c] -= BOX;
					//3,把玩家移动到箱子原来的位置
					map[r - 1][c] += PLAYER;
					//4,把玩家从原来的位置删掉
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_s:
			if (map[r + 1][c] == SPACE || map[r + 1][c] == DEST)
			{
				map[r + 1][c] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r + 1][c] == BOX || map[r + 1][c] == BOX + DEST)
			{
				if (map[r + 2][c] == SPACE || map[r + 2][c] == DEST)
				{
					map[r + 2][c] += BOX;
					map[r + 1][c] -= BOX;
					map[r + 1][c] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_a:
			if (map[r][c - 1] == SPACE || map[r][c - 1] == DEST)
			{
				map[r][c - 1] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r][c - 1] == BOX || map[r][c - 1] == BOX + DEST)
			{
				if (map[r][c - 2] == SPACE || map[r][c - 2] == DEST)
				{
					map[r][c - 2] += BOX;
					map[r][c - 1] -= BOX;
					map[r][c - 1] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
		case SDLK_d:
			if (map[r][c + 1] == SPACE || map[r][c + 1] == DEST)
			{
				map[r][c + 1] += PLAYER;
				map[r][c] -= PLAYER;
			}
			else if (map[r][c + 1] == BOX || map[r][c + 1] == BOX + DEST)
			{
				if (map[r][c + 2] == SPACE || map[r][c + 2] == DEST)
				{
					map[r][c + 2] += BOX;
					map[r][c + 1] -= BOX;
					map[r][c + 1] += PLAYER;
					map[r][c] -= PLAYER;
				}
			}
			break;
	}

}

//判断是否过关
bool passLevel(int map[][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k] == BOX)
			{
				return false;
			}
		}
	}
	return true;
}

//加载图片
SDL_Texture* loadTexture(SDL_Renderer* ren, const char* fillname)
{
	SDL_Surface* sfc = SDL_LoadBMP(fillname);
	if (!sfc)
	{
		SDL_Log("loadBMP failed!%s\n", SDL_GetError());
		return NULL;
	}
	SDL_Texture* tex = SDL_CreateTextureFromSurface(ren, sfc);
	if (!tex)
	{
		SDL_Log("Texture failed!%s\n", SDL_GetError());
		SDL_FreeSurface(sfc);
		return NULL;
	}
	SDL_FreeSurface(sfc);
	return tex;
}

四、总结

本节带来的推箱子小游戏不仅可以让你对数组等语法更加熟练,也会让你的图形库知识更上一层楼,本节就到这里啦~期待下一节和大家的相遇🌞

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

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

相关文章

离散系统函数零积点分析

离散系统函数零积点分析 在 Matlab中&#xff0c;系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得&#xff0c;其调用格式为&#xff1a;[Z, P, K] tf2zp(B, A)&#xff0c;函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…

WEB端唤起 百度|腾讯|高德 地图一键导航功能

WEB端唤起 百度|腾讯|高德 地图一键导航功能 目录 腾讯地图&#xff1a; 百度地图&#xff1a; 高德地图&#xff1a; 坐标拾取器&#xff1a; 腾讯地图&#xff1a; 极简写法&#xff1a; https://3gimg.qq.com/lightmap/v1/marker/index.html?markercoord:纬度,经度;t…

工业设备状态监测:振动常见原因分析

在工业生产中&#xff0c;设备的正常运行和可靠性对于保障生产效率和安全至关重要。然而&#xff0c;工业设备在运行过程中常常会出现振动现象&#xff0c;这可能是由于多种原因导致的。 根据设备劣化趋势P-F曲线我们可以知道&#xff0c;振动信号监测是状态监测过程中可以被快…

Markdown编辑器 测试

测试一下TOC 你好Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支…

MongoDB的应用

目录 一、MongoDb是什么 1.特点 2.功能 3.基本的指令 二、MongoDB的使用场景 1.适用场合 2.常见应用场景 三、可能遇到的问题 1.MongoDB是否支持事务&#xff1f; 2.MongoDB大数据迁移怎么做&#xff1f; 3.MongoDB的水平扩展是什么原理&#xff1f; 4.MongoDB出现负…

Jenkins UI与接口自动化测试持续集成实战

篇幅较长&#xff0c;要耐心阅读哦~ 基础知识简要回顾 持续集成、持续交付的好处与产生的必然性Jenkins服务的搭建方法Jenkins节点管理与用户权限Jenkins插件Jenkins父子多任务关联运行Jenkins报警机制 目录 SeleniumUI自动化测试持续集成演练接口自动化测试持续集成演练 …

采埃孚-4D毫米波雷达拆解分析

采埃孚4D毫米波雷达拆解分析 4D毫米波雷达具有4个维度的信息&#xff0c;分别是距离、速度、方向角和高度。下面分析采埃孚再飞凡汽车上的4D毫米波雷达。 4D毫米波雷达共由四部分组成&#xff0c;分别为&#xff1a;数字接口板及结构件、屏蔽罩、发射单元及PCB以及雷达天线罩…

如何在 Linux、Windows 和 Mac 上查找 WiFi 密码?

无线网络已成为我们日常生活中不可或缺的一部分&#xff0c;我们经常需要连接各种WiFi网络。但是&#xff0c;有时我们可能会忘记自己的WiFi密码&#xff0c;或者需要连接到一个以前连接过的网络。在这种情况下&#xff0c;我们可以使用一些方法来查找已连接网络的密码。 本文将…

研报精选230526

目录 【行业230526山西证券】有色金属行业周报&#xff1a;锂价强势反弹回30万元or吨 【行业230526开源证券】食品饮料行业投资策略&#xff1a;消费复苏贯穿全年&#xff0c;结构分化择机布局 【行业230526德邦证券】核电行业深度系列报告&#xff1a;积极安全有序发展核电&am…

8-JDBC 编程

目录 1.数据库编程的必备条件 PS&#xff1a;程序是怎么操作数据库的&#xff1f; 2.什么是JDBC&#xff1f; 2.1.JDBC定义 2.2.JDBC工作原理 3.JDBC使用 3.1.创建项目并添加MySQL驱动包 3.2.使用代码操作数据库 3.2.1.获得数据源 3.2.2.获得连接 3.2.3.获得执行器 …

软考A计划-2022年11月软件设计师下午真题及答案解析

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【云原生|Kubernetes】06-Pod的生命周期和重启策略

【云原生|Kubernetes】06-Pod的生命周期和重启策略 文章目录 【云原生|Kubernetes】06-Pod的生命周期和重启策略Pod生命周期生命周期Pod的状态Pod子状态 Pod重启策略调试PodPod 停滞在 Pending 状态Pod 停滞在 Waiting 状态Pod 处于 Crashing 或别的不健康状态Pod 处于 Running…

【LeetCode热题100】打卡第4天:寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数⛅前言&#x1f512;题目&#x1f511;题解 寻找两个正序数组的中位数 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的…

89.qt qml-WorkerScript多线程使用(无需C++代码)

由于我们自定义Table中需要实现排序,如下图所示: 考虑到如果数据量太大的情况,为了避免主线程阻塞,所以我们添加多线程排序功能,为了方便大家更好学习qml组件,所以学习WorkerScript实现多线程,无需C++ 1.描述 使用 WorkerScript 在新线程中运行操作。这对于在后台运行操…

微信小程序为什么不用HTML5、CSS,自己搞了个WXML、WXSS,很多框架用不了,好处一点不知道?

你在小程序中需要使用HTML5、 CSS来创建页面&#xff0c;那么你一定会碰到一些问题&#xff0c;比如&#xff1a; 1.小程序中的布局没有 JS支持&#xff0c;没有 JS渲染逻辑。 2.没有内置 css&#xff0c;都是靠 JS自己实现的。 3.很多框架不能使用&#xff0c;比如&#xf…

5年华为外包,外包究竟怎么样....

最近身边很多人进了外包或者被问到进到外包公司怎么样&#xff0c;感觉大家对外包公司不是很了解&#xff0c;也有一些误解&#xff0c;我们看看过来人怎么说。 5年外包时光 我曾是华为外包软件测试员工&#xff0c;就职于东莞松山湖&#xff0c;2017年9月12号入职&#xff0c…

ARM--计算机基础知识

目录 一.Linux层次结构 谈谈对嵌入式的理解 三层&#xff1a; 应用层 内核层 硬件层 二、计算机的进制 三、计算机的组成 1.输入设备 2.输出设备 3.存储器 4.运算器 5.控制器 总线 四、ARM存储模型 1. Cache:高速缓冲存储器 2. 主存储器&#xff1a;相当于内存 …

Day1:手写第一个Win32程序

学习重点&#xff1a; 1. 理解这个Win32窗口程序的实现逻辑 2. 学习Windows消息循环机制 3. 了解Windows的数据类型 4. 明白Winmain函数的作用 首先这个Winodws窗口程序在之后的学习并不需要进行手写&#xff0c;这里的重点是学习代码的逻辑&#xff0c;虽然有一些参数的含义尚…

vue3 集成kindeditor研究

kindeditor虽然老&#xff0c;但是稳定&#xff0c;最大的好外是word贴进去不变形&#xff0c;后端部分有安全隐患&#xff0c;我给去掉了&#xff0c;只保留了前端&#xff0c;集成jquery添加了跨域ajax上传功能。 用iframe引用实属无奈&#xff0c;因为尝试了好多次用ts封装都…

如何在华为OD机试中获得满分?Java实现【快速开租建站】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 当前IT部门支撑了子公司…