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

参考文档

借助了这位大佬的开发思路, 开发过程中学到了很多
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;
	}
}

运行示例

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

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

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

相关文章

el-table实现多行合并的效果,并可编辑单元格

背景 数据为数组包对象&#xff0c;对象里面有属性值是数组&#xff1b;无需处理数据&#xff0c;直接使用el-table包el-table的方法&#xff0c;通过修改el-table的样式直接实现多行合并的效果 html代码 <template><div><el-table size"mini" :d…

酒店客房管理系统设计与实现(代码+数据库+文档)

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目 希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一、研究背景 1.1 研究背景 当…

JKD的组成、Java跨平台、Path环境变量设置

一、JDK的组成 JVM&#xff1a;Java虚拟机&#xff0c;真正运行Java的地方 核心类库&#xff1a;Java自己写好的程序&#xff0c;给程序员自己调用 JRE&#xff1a;Java的运行环境&#xff0c;包含JVM和核心类库 JDK也就是Java开发工具&#xff0c;包含以上所有 二、Java的…

uniapp 开发小程序的时候使用自定义 tabbar 时出现切换页面闪烁的情况

问题&#xff1a;在使用自定义组件的时候可以看到页面切换明显的闪烁, 这种体验是很不好的, 当然最好的方式就是使用原生导航栏, 不要搞花里胡哨的东西。 来看下体验不好的效果 优化调整 先说思路&#xff0c;就是仍然设置原生 tabbar, 在应用启动的时候主动隐藏原生 tabba…

四、Java中SpringBoot组件集成接入【Knife4j接口文档(swagger增强)】

四、Java中SpringBoot组件集成接入【Knife4j接口文档&#xff08;swagger增强&#xff09;】 1.Knife4j介绍2.maven依赖3.配置类4.常用注解使用1.实体类及属性&#xff08;ApiModel和ApiModelProperty&#xff09;2.控制类及方法&#xff08;Api、ApiOperation、ApiImplicitPar…

windows 调试rtmp协议遇到send时返回10054问题之分析

一、当send一个视频帧大小为138262 1个basic header字节 11个message header字节时&#xff0c;遇到send失败&#xff0c;返回10054 二、通过启动srs打印看出是超出范围了 总结就是数据超过了srs的数据接收范围

【Scala】——函数式编程

1 面向对象编程和函数式编程 1.1 面向对象编程 解决问题&#xff0c;分解对象&#xff0c;行为&#xff0c;属性&#xff0c;然后通过对象的关系以及行为的调用来解决问题。 • 对象&#xff1a;用户 • 行为&#xff1a;登录、连接 JDBC、读取数据库 • 属性&#xff1a;用户…

springboot2.7集成sharding-jdbc4.1.1实现业务分表

1、引入maven <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency> 2、基本代码示例 基本逻辑&#xff1a;利用数…

windows10+ubuntu20.04双系统中,ubuntu系统显示home空间不足的扩容方法

实际上网上有两种扩容方法&#xff0c;除了本文的方法外&#xff0c;另一种是在使用启动U盘打开试用ubuntu&#xff0c;应该涉及到nvidia显卡驱动问题故未采用。另一种即本文。 最开始安装双系统时内存分配没有分配好&#xff0c;给ubuntu系统分配的空间较小,导致了后来的的问…

vivado xsim 终端 模拟

只模拟的话直接终端运行会快很多 计数器举例 mkdir srccounter.v module counter(input wire clk,input wire rst_n,output reg[31:0] cnt ); always (posedge clk or negedge rst_n)if(!rst_n)cnt < 31h0;elsecnt < cnt1;endmodule tb.v module tb; wire[31:0] out…

Python - Bert-VITS2 自定义训练语音

目录 一.引言 二.前期准备 1.Conda 环境搭建 2.Bert 模型下载 3.预训练模型下载 三.数据准备 1.音频文件批量处理 2.训练文件地址生成 3.模型训练配置生成 4.训练文件重采样 5.Tensor pt 文件生成 四.模型训练 1.预训练模型 2.模型训练 3.模型收菜 五.总结 一…

基于模块自定义扩展字段的后端逻辑实现(二)

目录 一&#xff1a;创建表 二&#xff1a;代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计&#xff0c;这一节我们以一个具体例子演示下&#xff0c;如何实现一个订单模块的自定义扩展数据。 一&#xff1a;创建表 订单主表: CREATE TABLE t_order ( …

流量主答题小程序源码系统:自定义题库或一键导入,采用PHP+MySQL 带完整的安装部署教程

随着互联网的发展&#xff0c;答题类小程序因其互动性强、用户粘性高等特点&#xff0c;受到了广泛的欢迎。小编来给大家分享一款流量主答题小程序源码系统。该系统采用PHPMySQL技术&#xff0c;功能强大且易于扩展&#xff0c;为开发者提供了一个完整的答题平台解决方案。 以…

【APP抓包】IOS应用抓包防护绕过实战教程

文章目录 1. 写在前面2. 测试机越狱2.1. 爱思助手2.2. checkra1n 3. 代理抓包3.1. 安装CA证书 4. 客户端证书绑定绕过4.1. SSLKillSwitch4.2. Objection 5. 双向证书绑定绕过5.1. 绕过服务端 6. 越狱检测绕过6.1. Liberty Lite绕过检测6.2. Hestia绕过检测6.3. HideJB绕过检测6…

智能化配网故障定位技术:未来发展趋势与应用前景

在当今这个科技高速发展的时代&#xff0c;智能化技术已经渗透到了我们生活的方方面面。作为电力行业的重要组成部分&#xff0c;配电网的自动化和智能化水平也在不断提高。本文将重点介绍一种基于成熟的行波测距技术的智能化配网故障定位技术——配网行波型故障预警与定位系统…

Vue3-watch的用法

watch简介 作用:监视数据的变化 (和 Vue2 中的 watch 作用一致) 特点: Vue3 中的 watch 只能监视以下四种数据 1.ref 定义的数据(又可以分 基本 和 对象 ) 2.reactive 定义的数据 3.函数返回一个值。(getter 函数) 4.一个包含上述内容的数组 我们在 Vue3 中使用 watch …

Zookeeper系列(一)集群搭建(非容器)

系列文章 Zookeeper系列&#xff08;一&#xff09;集群搭建&#xff08;非容器&#xff09; 目录 前言 下载 搭建 Data目录 Conf目录 集群复制和修改 启动 配置示例 测试 总结 前言 Zookeeper是一个开源的分布式协调服务&#xff0c;其设计目标是将那些复杂的且容易出错的分…

CHS_01.1.5+操作系统引导

CHS_01.1.5操作系统引导 操作系统的引导一个新的磁盘安装操作系统后操作系统引导&#xff08;开机过程&#xff09; 操作系统的引导 我们会学习操作系统的引导 那你可能看见这个词的时候会觉得莫名其妙不明 绝地 什么是操作系统的引导呢 简单来说就是当你在开机的时候 如何让…

apt和apt-get的区别

文章目录 环境问题背景区别进度条显示可更新包的数量upgrade 对比apt-get 过时了吗使用apt还是apt-get总结参考 环境 RHEL 9.3Docker Community 24.0.7Ubuntu Docker image jammy 22.04lunar 23.04 Ubuntu 22.04 问题 apt 和 apt-get 有一些相似之处。比如&#xff0c;如果想…

在VS Code中安装Copilot与安装其他扩展的方法一样,只需简单几步

GitHub Copilot是由OpenAI和GitHub开发的人工智能工具。它的目的是通过自动完成代码来帮助开发人员使用集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有在候补名单上被认可的用户才能访问它。对于用…