牛刀小试 - C++ 实现2048(可存档)

news2025/1/12 23:38:48

参考文档

借助了这位大佬的开发思路, 开发过程中学到了很多
C语言实现《2048游戏》

技术点:

system调整控制台大小的问题

unsigned and 符号位

C++对齐输出(左对齐和右对齐)

C++ goto语句详解

完整代码

/*********************************************************************
程序名: 贪吃蛇
*********************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
#include <iostream> // 对应c中的#include <stdio.h>
#include <cstdlib>  // 对应C中的#include <stdlib.h>
#include <ctime>	// 对应c中的#include <time.h>
#include <conio.h> // 使用getch()函数
#include <windows.h> //使用Sleep()函数
#include <iomanip> // C++ 输出对齐函数
#include <fstream> // 文件操作头函数

using namespace std;

void Menu();//菜单
void Rule_of_game();//游戏规则 
void Begin(); //开始 
void Table();//打印4×4方格 
int Random_number1();//产生2或4的随机数 
int Random_number2();//产生0、1、2、3的随机数 
int Get(int *p_cnt, int score);//输入指令 
void Move();//保留上一次的棋盘布局 
int If_move();//判断是否移动 
int Over();//判断是否结束  
void Write_max(int score);//向2048游戏-最高记录写入最高分 
int Read_max();//读出最高分记录的文件
void Write_file(int *p_cnt, int scort);//存档 
int Read_file(int *p_cnt);//读档 
void again();//是否继续游戏
int color(int c);//更改颜色
void box_color(int x);//不同数值对应不同颜色 

int a[4][4] = { 0 };// 定义全局的二维数组 
int A[4][4]; //保留上一步的棋局 

char *name_max = "2048游戏-最高记录.txt";
char *name_file = "[山海]-2048游戏.txt";

int main()
{
	system("mode con cols=90 lines=30");  //调整控制台大小
	system("title 2048超级大大型游戏"); //程序标题 
	system("color F0");//F 表示背景颜色,0表示前景颜色

	Menu();
	system("PAUSE");
	return 0;
}



void Menu() //菜单
{
	cout << "\t\t║   欢迎使用由[山海]制作的2048超级大大型游戏   ║\n";
	cout << "\t\t╟──────────────────────────────────────────────╢\n";
	cout << "\t\t║请输入选项:                                  ║\n";
	cout << "\t\t║              ┌───┐                           ║\n";
	cout << "\t\t║              │ 1 │ 游戏规则                  ║\n";
	cout << "\t\t║              └───┘                           ║\n";
	cout << "\t\t║              ┌───┐                           ║\n";
	cout << "\t\t║              │ 2 │ 开始游戏                  ║\n";
	cout << "\t\t║              └───┘                           ║\n";
	cout << "\t\t║              ┌───┐                           ║\n";
	cout << "\t\t║              │ 3 │ 继续游戏                  ║\n";
	cout << "\t\t║              └───┘                           ║\n";
	cout << "\t\t║              ┌───┐                           ║\n";
	cout << "\t\t║              │ 4 │ 退出游戏                  ║\n";
	cout << "\t\t║              └───┘                           ║\n";
	cout << "\t\t╚══════════════════════════════════════════════╝\n";

	int x = 1, max = 0;
	while (x)
	{
		switch (getch())		// getch()函数检测按键。
		{
		case '1':
			x = 0;
			Rule_of_game();//游戏规则
			Menu();
			break;
		case '2':
			x = 0;
			system("cls");//清屏 

			int h, l;
			for (h = 0; h < 4; h++)
			{
				for (l = 0; l < 4; l++)
				{
					a[h][l] = 0;
					A[h][l] = 0;
				}
			}
			Begin(); //开始游戏 
			break;
		case '3':
			x = 0;
			system("cls");//清屏
			max = Read_max();//读取之前的最高记录 
			Begin(); //开始游戏 
			break;
		case '4':
			exit(0);
		default:
			cout << "输入了非法选项,请重新选择!" << endl;
		}
	}
}

void Rule_of_game()
{
	system("cls");//清屏 
	cout << "╔══════════════════════════════════════════════════════════════════════════════════╗" << endl;
	cout << "║本游戏通过按键W、S、A、D(不区分大小写)四个键分别控制滑块上移、下移、左移和右移。 ║" << endl;
	cout << "║滑块移动的过程中,如有相邻且相等数字的滑块将会相加,并获得相应的分数。            ║" << endl;
	cout << "║当棋盘上的所有位置均有数字,且不能合成,则游戏结束。本游戏未设置游戏成功。         ║"<< endl;
	cout << "║游戏过程中输入I即为存档并退出游戏,输入O即为读档,输入P则退出游戏。               ║"<< endl;
	cout << "║“开始游戏”则清除最高记录及存档、“继续游戏”则保存之前的最高记录,且可以读档。       ║" << endl;
	cout << "╚══════════════════════════════════════════════════════════════════════════════════╝" << endl;
	system("pause");//暂停 
	system("cls");//清屏 
}

void Begin()
{
	int score = 0;
	int sign = 1;
	int h, l, cnt = 0;
	int *p_cnt = &cnt;
	while (1)
	{
		cout << "\t\t╔══════════════════════════════════════════════╗" << endl;
		cout << "\t\t║   欢迎使用由[山海]制作的2048超级大大型游戏  ║" << endl;
		cout << "\t\t╟──────────────────────────────────────────────╢" << endl;
		cout << "\t\t║移动:   ┌───┐        存档: 读档: 退出:  ║" << endl;
		cout << "\t\t║         │ W │                                ║" << endl;
		cout << "\t\t║     ┌───┼───┼───┐    ┌───┐ ┌───┐ ┌───┐       ║" << endl;
		cout << "\t\t║     │ A │ S │ D │    │ I │ │ O │ │ P │       ║" << endl;
		cout << "\t\t║     └───┴───┴───┘    └───┘ └───┘ └───┘       ║" << endl;
		cout << "\t\t╚══════════════════════════════════════════════╝" << endl;
		while (1)
		{
			if (sign == 1){
				h = Random_number2();
				l = Random_number2();
				if (a[h][l] == 0) {
					a[h][l] = Random_number1();
					cnt++;
					break;
				}
			}
			else{
				break;
			}
		}
		Table(); // 打印棋盘
		int max = Read_max();
		printf("\t\t移动的步数:%d\t当前得分:%d\n\t\t最高记录:%d\n", cnt - 1, score, max);
		Move(); //保留棋盘
		score += Get(p_cnt, score);//得分
		if (score > max)
		{
			Write_max(score);//保存此次记录
		}
		sign = If_move();//判断棋盘是否有变动 
		if (Over() == 0){
			if (max < score){//打破记录 
				Write_max(score);//保存此次记录
				cout << "\t\t恭喜您已打破记录!" << endl;
			}
			break;
		}
		system("cls"); //清屏
	}
}

int Get(int *p_cnt,int score)
{
	int h, l, t, sum = 0;
	char ch;
	ch = getch();//输入字符 
	switch (ch){
	/*滑块向上移动*/
	case 'w':
	case 'W':
		/*向上聚集数字*/
		for (l = 0; l < 4; l++){
			for (t = 0; t < 4; t++){
				for (h = 3; h > 0; h--){
					if (a[h - 1][l] == 0){
						a[h - 1][l] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		/*竖直方向上,相邻且相同的数字相加*/
		for (l = 0; l < 4; l++){
			for (h = 0; h < 3; h++){
				if (a[h][l] == a[h + 1][l]){
					a[h][l] += a[h + 1][l];
					a[h + 1][l] = 0;
					sum += a[h][l];
				}
			}
		}
		/*向上聚集数字*/
		for (l = 0; l < 4; l++){
			for (t = 0; t < 4; t++){
				for (h = 3; h > 0; h--){
					if (a[h - 1][l] == 0){
						a[h - 1][l] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		break;
	case 's':
	case 'S':
		for (l = 0; l < 4; l++){
			for (t = 0; t < 4; t++){
				for (h = 0; h < 3; h++){
					if (a[h + 1][l] == 0){
						a[h + 1][l] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		for (l = 0; l < 4; l++){
			for (h = 3; h > 0; h--){
				if (a[h][l] == a[h - 1][l]){
					a[h][l] += a[h - 1][l];
					a[h - 1][l] = 0;
					sum += a[h][l];
				}
			}
		}
		for (l = 0; l < 4; l++){
			for (t = 0; t < 4; t++){
				for (h = 0; h < 3; h++){
					if (a[h + 1][l] == 0){
						a[h + 1][l] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		break;
	case 'a':
	case 'A':
		for (h = 0; h < 4; h++){
			for (t = 0; t < 4; t++){
				for (l = 3; l > 0; l--){
					if (a[h][l - 1] == 0){
						a[h][l - 1] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		for (h = 0; h < 4; h++){
			for (l = 0; l < 3; l++){
				if (a[h][l] == a[h][l + 1]){
					a[h][l] += a[h][l + 1];
					a[h][l + 1] = 0;
					sum += a[h][l];
				}
			}
		}
		for (h = 0; h < 4; h++){
			for (t = 0; t < 4; t++){
				for (l = 3; l > 0; l--){
					if (a[h][l - 1] == 0){
						a[h][l - 1] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		break;
	case 'd':
	case 'D':
		for (h = 0; h < 4; h++){
			for (t = 0; t < 4; t++){
				for (l = 0; l < 3; l++){
					if (a[h][l + 1] == 0){
						a[h][l + 1] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		for (h = 0; h < 4; h++){
			for (l = 3; l > 0; l--){
				if (a[h][l] == a[h][l - 1]){
					a[h][l] += a[h][l - 1];
					a[h][l - 1] = 0;
					sum += a[h][l];
				}
			}
		}
		for (h = 0; h < 4; h++){
			for (t = 0; t < 4; t++){
				for (l = 0; l < 3; l++){
					if (a[h][l + 1] == 0){
						a[h][l + 1] = a[h][l];
						a[h][l] = 0;
					}
				}
			}
		}
		break;
	case 'i':
	case 'I':       //存档当前游戏格局 
		Write_file(p_cnt, score);//调用存档函数 
		break;
	case 'o':
	case 'O':
		sum = Read_file(p_cnt);//读档
		break;
	case 'p':
	case 'P':
		system("cls"); //清屏
		Menu();//回到菜单 
	default:
		break;
	}

	return sum;
}

void Table()
{
	int h, l;
	for (h = 0; h < 4; h++){
		if (h == 0){
			printf("\t\t\t┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");
		}
		else {
			printf("\t\t\t┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫\n");
		}
		printf("\t\t\t┃      ┃      ┃      ┃      ┃\n");
		for (l = 0; l < 4; l++){
			if (a[h][l] == 0){//如果二维数组与棋盘对应的位置为零,则不放入数据 
				if (l == 0){
					printf("\t\t\t┃      ");
				}
				else {
					printf("┃      ");
				}
			}
			else{//否则放入与二维数组对应的数据 
				if (l == 0){
					printf("\t\t\t┃");
					box_color(a[h][l]);//判断滑块的数值,给对应颜色 
					printf("%5d ", a[h][l]);
					color(0);//恢复白色背景 
				}
				else {
					printf("┃");
					box_color(a[h][l]);//判断滑块的数值,给对应颜色 
					printf("%5d ", a[h][l]);
					color(0);//恢复白色背景 
				}
			}
		}
		printf("┃\n");
		printf("\t\t\t┃      ┃      ┃      ┃      ┃\n");
	}
	printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n");
}

int Random_number1() //随机生成2 or 4
{
	int s;
	srand(time(0));
	s = ((unsigned)rand() % 2);
	s = s == 0 ? 2 : 4;
	return s;
}

int Random_number2() //随机生成二维数组的下标
{
	int x;
	x = ((unsigned)rand() % 4);
	return x;
}

void Move()
{
	int h, l;
	for (h = 0; h < 4; h++){
		for (l = 0; l < 4; l++){
			A[h][l] = a[h][l];
		}
	}
}

int If_move()
{
	int h, l, sign = 0;
	for (h = 0; h < 4; h++){
		for (l = 0; l < 4; l++){
			if (a[h][l] != A[h][l]){//未进入条件框,说明滑块没有发生移动 
				sign = 1;
				goto out;
			}
		}
	}
	out:
		return sign;
}

int Over()
{
	int over = 0;
	int h, l;
	for (h = 0; h < 4; h++){
		for (l = 0; l < 4; l++){
			if (a[h][l] == 0){//有空格 
				over = 1;//游戏继续 
				return 1;
			}
		}
	}
	if (over == 0){//没有空格 
		for (h = 0; h < 3; h++){
			for (l = 0; l < 3; l++){
				if (a[h][l] == a[h][l + 1]){
					over = 1;//游戏继续 
					break;
				}
				else if (a[h][l] == a[h + 1][l]){
					over = 1;//游戏继续 
					break;
				}
			}
			if (over == 1){
				break;
			}
		}
	}
	return over;//游戏结束 
}

void Write_max(int score)//写入文件 
{
	ofstream fout(name_max);        //读写操作,对打开的文件可进行读写操作 
	fout << score;
	fout.close();
}

int Read_max() // 读取文件
{
	int max_score = 0;
	ifstream fin(name_max, ios::in);
	if (!fin)
	{
		cout << "\t\t读取失败!程序即将自动退出 . . .";
		Sleep(3000);//睡眠3000毫秒,即停留3秒钟 
		exit(0); //退出程序

	}
	else
	{
		fin >> max_score;
		fin.close();
	}

	return max_score;//返回最高记录的值 
}

void Write_file(int *p_cnt, int score)
{
	int h, l;
	ofstream fout(name_file);   
	if (!fout)
	{
		cout << "\t\t存档失败!程序即将自动退出 . . ." << endl;
		Sleep(3000);//睡眠3000毫秒,即停留3秒钟 
		exit(0);
	}
	else
	{
		for (h = 0; h < 4; h++){
			for (l = 0; l < 4; l++){
				fout << a[h][l] << " ";
			}
		}
	}
	fout << score << " ";
	fout << *p_cnt - 1;	

	cout << "\t\t存档成功!游戏即将自动退出 . . ." << endl;
	Sleep(3000); //睡眠3000毫秒,即停留3秒钟 
	exit(0);
	fout.close();
}

int Read_file(int *p_cnt)
{
	int h, l, score = 0;
	ifstream fin(name_file , ios::in);
	if (!fin)
	{
		cout << "\t\t读档失败!程序即将自动退出 . . ." << endl;
		Sleep(3000); //睡眠3000毫秒,即停留3秒钟 
		exit(0);
	}
	else
	{
		for (h = 0; h < 4; h++){
			for (l = 0; l < 4; l++){
				fin >> a[h][l];
			}
		}
	}
	fin >> score;
	fin >> *p_cnt;
	fin.close();
	Table(); // 打印棋盘

	return score;
}

void again()
{
	cout << "\t\t╔══════════════════════════════════════════════╗" << endl;
	cout << "\t\t║                   您已失败                    ║" << endl;
	cout << "\t\t╟──────────────────────────────────────────────╢" << endl;
	cout << "\t\t║是否继续:                                     ║" << endl;
	cout << "\t\t║          ┌───┐                               ║" << endl;
	cout << "\t\t║          │ 1 │ 扶我起来,我还能再来一局!      ║" << endl;
	cout << "\t\t║          └───┘                               ║" << endl;
	cout << "\t\t║          ┌───┐                               ║" << endl;
	cout << "\t\t║          │ 2 │ 不了不了,我要学习!            ║" << endl;
	cout << "\t\t║          └───┘                               ║" << endl;
	cout << "\t\t╚══════════════════════════════════════════════╝" << endl;

	if (getch() == '1'){
		system("cls"); // 清屏
		int h, l;
		for (h = 0; h < 4; h++)
		{
			for (l = 0; l < 4; l++)
			{
				a[h][l] = 0;
				A[h][l] = 0;
			}
		}
		Menu();//回到菜单 
	}
	else {
		cout << "\t\t游戏结束!" << endl;
	}
}
int color(int c)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
		BACKGROUND_INTENSITY |
		BACKGROUND_BLUE |
		BACKGROUND_RED |
		BACKGROUND_GREEN |
		c);
	return 0;
}

void box_color(int x)
{
	switch (x){
	case 2:
		color(8);
		break;
	case 4:
		color(0);
		break;
	case 8:
		color(2);
		break;
	case 16:
		color(6);
		break;
	case 32:
		color(10);
		break;
	case 64:
		color(3);
		break;
	case 128:
		color(9);
		break;
	case 256:
		color(11);
		break;
	case 512:
		color(5);
		break;
	case 1024:
		color(13);
		break;
	case 2048:
		color(12);
		break;
	default:
		color(4);
		break;
	}
}

运行示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

报错解决方法——http404(Spring MVC)

一.检查静态资源是否加载成功 成功的标志就是在项目跑起来之后再target文件夹中的classes文件夹中可以找到自己写的配置文件。 1.查看resources文件夹是否被识别为资源文件夹 如图所示&#xff0c;文件夹图标右下角有三条杠代表被识别为资源文件 2.在pox.xml文件中插入如下…

打造VR数字乡村文旅新品牌,VR全景技术助力乡村振兴

新年伊始&#xff0c;各地乡村特色产业都在蓬勃发展&#xff0c;让冬日里的乡村重新焕发了新的活力。并且在这个冬季&#xff0c;各地还依托生态资源优势&#xff0c;打造智慧乡村文旅新品牌&#xff0c;激活乡村消费活力&#xff0c;例如有些乡村利用空心村&#xff0c;打造多…

Apache Doris 入门 10 问

基于 Apache Doris 在读写流程、副本一致性机制、 存储机制、高可用机制等方面的常见疑问点进行梳理&#xff0c;并以问答形式进行解答。在开始之前&#xff0c;我们先对本文相关的名词进行解释&#xff1a; FE&#xff1a;Frontend&#xff0c;即 Doris 的前端节点。主要负责接…

KEAZ128中MSCAN的同步时钟初始化失败已解决

文章目录 运行环境&#xff1a;MSCAN初始化成功代码初始化流程图初始化失败分析初始化异常原因 运行环境&#xff1a; MSCAN初始化代码(采用24MHz总线时钟当时不行&#xff0c;于是直接采用了外部晶振时钟16MHz) MSCAN初始化成功代码 void CAN_Init(uint_8 mode,uint_8 open…

泛域名和多域名https哪个性价比高

Sectigo已经成立了二十几年&#xff0c;随着互联网的快速发展&#xff0c;Sectigo旗下的https证书种类也逐渐增多&#xff0c;例如&#xff0c;代码签名证书、IP证书&#xff0c;但是Sectigo最多的是各种域名https证书——单域名https证书、多域名https证书和泛域名https证书。…

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第二部分流加密与CPA多重加密 CPA安全加密方案CPA安全实验、预言机访问&#xff08;oracle access&#xff09; 操作模式伪随机函数PR…

uni-app的学习【第二节】

四 路由配置及页面跳转 (1)路由配置 uni-app页面路由全部交给框架统一管理,需要在pages.json里配置每个路由页面的路径以及页面样式(类似小程序在app.json中配置页面路由) (2)路由跳转 uni-app有两种页面路由跳转方式:使用navigator组件跳转(标签式导航)、调用API跳…

LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

题目描述&#xff1a; 解题思路&#xff1a; 创建两个栈&#xff0c;一个用于入数据&#xff0c;一个用于出数据。分别是pushST和popST; 1.如果是入数据就直接入进pushST 2.如果是出数据&#xff0c;先检查popST中有无数据&#xff0c;如果有数据&#xff0c;就直接出。如果没…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

MySQL 图书管理系统

1.需求分析 1.1项目需求分析简介 1.1.1信息需求分析 (1) 图书信息&#xff1a;包括书籍编号&#xff0c;书籍名称&#xff0c;出版社&#xff0c;作者&#xff0c;库存量&#xff0c;出版日期&#xff0c;价格&#xff0c;库存&#xff0c;剩余量&#xff0c;类别等&#xf…

【占用网络】SurroundOcc:基于环视相机实现3D语义占用预测 ICCV 2023

前言 本文分享“占用网络”方案中&#xff0c;来自ICCV 2023的SurroundOcc&#xff0c;它基于环视相机实现3D语义占用预测。 使用空间交叉注意力将多相机图像信息提升到3D体素特征&#xff0c;即3D体素Query到2D图像中查询融合特征的思想。 然后使用3D卷积逐步对体素特征进行…

做科技类的展台3d模型用什么材质比较好---模大狮模型网

对于科技类展台3D模型&#xff0c;以下是几种常用的材质选择&#xff1a; 金属材质&#xff1a;金属材质常用于科技展台的现代感设计&#xff0c;如不锈钢、铝合金或镀铬材质。金属材质可以赋予展台一个科技感和高档感&#xff0c;同时还可以反射光线&#xff0c;增加模型的真实…

全网独家:基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机极简版数据库容器

本文尝试基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机版极简版数据库容器。 一、软件包源 1、openEuler-20.03-LTS容器底包 openEuler-20.03-LTS-SP4 下载链接 sha256:24d8f51c1f3a79eb975c4e498cadd9055bfd708d66c15935ec46664d0f975a7b openEuler-dock…

java.net.ConnectException: Connection refused: connect已解决

&#x1f95a;今日鸡汤&#x1f95a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 —— 《枫》 遇见问题莫着急&#xff0c;着急也没用~&#x1f636;‍&#x1f32b;️ 目录 &#x1f9c2;1.令人发麻的问题 &am…

【前端素材】bootstrap5实现美食餐饮网站RegFood

一、需求分析 美食餐饮网站是指专门提供关于美食和餐饮的信息、服务和资源的在线平台。这类网站通常提供以下功能&#xff1a; 餐厅搜索和预订&#xff1a;用户可以在网站上搜索附近的餐厅&#xff0c;并预订桌位。网站会提供餐厅的详细信息&#xff0c;包括菜单、地址、电话号…

数组计算模块NumPy

NumPy是Python数组计算、矩阵运算和科学计算的核心库。 提供了高性能的数组对象提供了大量的函数和方法NumPy使用机器学习中的操作变得简单NumPy是通过C语言实现的 NumPy的安装 pip install numpy 数组的分类 一维数组 跟Python列表的形状一样&#xff0c;区别在于数组的…

Linux日志服务管理

一&#xff1a;日志管理&#xff1a; 1.日志介绍&#xff1a; /var/log/boot.log 系统服务启动的相关信息&#xff0c;文本格式 2.日志的级别&#xff1a; 3.日志的种类及位置&#xff1a; 3.1系统日志&#xff1a; /var/log/secure&#xff1a;系统安全信息 /var/log/messag…

K8S的部署策略,重建更新和滚动更新

Deployment Strategies 部署战略 When it comes time to change the version of software implementing your service, a Kubernetes deployment supports two different rollout strategies: RecreateRollingUpdate 当需要更改实施服务的软件版本时&#xff0c;Kubernetes …

Beauty algorithm(七)瘦脸

瘦脸的实现采用局部平移法。 一、skills 前瞻 局部平移 二、目标区域定位 左脸: 关键点选择3、5点,基点30 rmax:计算两点5-3间的距离, |x-c|:图像任一点到固定基点c的距离 |m-c|:两固定点距离 右脸: 关键点选择

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…