当前位置: 首页 > news >正文

【C语言】小游戏-扫雷(清屏+递归展开+标记)

大家好,我是深鱼~

目录

一、游戏介绍

二、文件分装

 三、代码实现步骤

1.制作简易游戏菜单

 2. 初始化棋盘(11*11)

 3.打印棋盘(9*9)

4.布置雷 

 5.计算(x,y)周围8个坐标的和 

6.排查雷 

 <1>清屏后打印棋盘

<2>递归展开

<3>标记雷

四、完整代码

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义

 game.c:实现游戏相关的函数

test.c:整个游戏相关的测试

 五、游戏展示


一、游戏介绍

 

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输

排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了 


二、文件分装

 实现这个扫雷游戏,我创建了三个文件

源文件:

test.c:整个游戏相关的测试

game.c:实现游戏相关的函数

头文件:

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义


 三、代码实现步骤

1.制作简易游戏菜单

这个简易菜单和上一篇文章三字棋一样,就不做过多的解释了

test.c

void menu()//打印简易菜单
{printf("************************************\n");printf("************   1.进入游戏  **********\n");printf("************   0.退出游戏  **********\n");printf("************************************\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}

 2. 初始化棋盘(11*11)

(1)定义两个数组为11*11:

定义一个数组(mine数组)表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组(show数组)表示排查雷的信息

假设我们要实现一个9*9的棋盘,如果我们只定义一个9*9的二维数组,计算周围8个坐标会越界,那么我们就需要将数组扩大成11*11的二维数组(上下左右分别多一排)

(2)为了简洁,传一个参数char set表示初始化的字符

初始化棋盘(9*9的外部也要初始化),因为mine和show数组不同,再传一个参数set即要初始化的字符内容

(3)宏定义ROWS,COLS,ROW,COL,EASY_COUNT 

为了方便修改游戏难度(改变棋盘的行和列及雷的个数),我们采用宏定义直接进行修改即可

game.h

#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);

 game.c

//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}

 3.打印棋盘(9*9)

(1)打印出来的棋盘(show)得是9*9的,但是由于定义的数组就是11*11的,所以函数传参还得传11*11定义的数组

(2)因为我们这个游戏是自己输入需要排雷的位置,所以最好在棋盘的旁边打印出对应的数字,方便输入坐标

game.h

//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);

  game.c

//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}

4.布置雷 

(1)布置雷是在mine数组上布置,定义mine数组上1代表有雷,0代表没雷(这样方便后面计算周围8个坐标的和)

(2)布置雷需要随机布置,那就得随机生成横纵坐标,跟上篇三字棋生成随机数一样rand函数

,但是注意取模结束后要+1,因为取模的结果是0-8,我们需要生成的坐标是1-9

(3)这里要注意一点:如果一个位置已经布置了雷,那么这个位置就不需要再布置了,加一条判断语句就可以解决这个问题

game.h

//布置雷
void SetMine(char mine[ROWS][COLS]);

   game.c

//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}

 5.计算(x,y)周围8个坐标的和 

注意求和的时候需要将字符和数字进行转换,加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'

   game.c

//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}

6.排查雷 

 排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了 

(1)传参需要传两个数组,mine数组用来判断是否踩中了雷,show数组打印出来看

(2)排雷需要多次进行,while语句控制结束,当棋盘剩下的格子只剩下10个雷的时间就结束,

或者踩到了雷,直接break跳出结束

 game.h

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);

   game.c

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;char ch = 0;while (win<ROW*COL-EASY_COUNT)//当非雷的坐标已经全部排出来了,即只剩下雷了就跳出循环{printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (mine[x][y] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}

优化: 

 <1>清屏后打印棋盘

system("cls");

头文件:#include<windows.h>

清屏后再打印show数组棋盘,可以让屏幕更干净简洁 

system("cls");
DisplayBoard(show);

<2>递归展开

展开一片,去除和为0,,并打印出和非0的位置(递归实现)

条件:1.这个坐标不是雷
           2.这个坐标周围没有雷,雷的个数是0
           3.这个坐标没有被排查过

(1)递归展开:当mine数组计算周围8个坐标的和返回的是0,那就把show数组的这个位置变为空格,并且再看自己周围的八个坐标是否也为0,如果mine数组为0且show数组的对应位置为*,那么再对这个坐标的周围8个坐标进行爆炸式展开(show数组对应位置为*是为了防止多次把同一个位置变为空格

(2)传参记得传一个指针来使win++(即统计GetMineCount()的位置,每变一个符号,剩下的棋格数就少一个,对应又成功一步)

   game.c

//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}

<3>标记雷

如果show数组上想要标记的位置为*,则可以标记;如果不是*,则不可标记

    game.c

//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}


四、完整代码

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);
//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);
//布置雷
void SetMine(char mine[ROWS][COLS]);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);

 game.c:实现游戏相关的函数

#include"game.h"
//实现游戏相关的代码
//9*9的棋盘,上面布置10个雷//排查雷
//1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
//2.如果这个位置是雷,就炸死了,表示游戏结束
//3.如果把不是雷的位置都找出来了,那就通过了//一个数组表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组表示排查雷的信息
//当要排查数组最外层的雷时,计算周围8个坐标会越界,这就需要把数组扩充为11*11,当然为了两个数组统一起来,两个数组都定义11*11//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;char ch = 0;while (win<ROW*COL-EASY_COUNT)//当非雷的坐标已经全部排出来了,即只剩下雷了就跳出循环{printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (mine[x][y] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}

test.c:整个游戏相关的测试

//测试代码
#include"game.h"
void menu()//打印简易菜单
{printf("************************************\n");printf("************   1.进入游戏  **********\n");printf("************   0.退出游戏  **********\n");printf("************************************\n");
}void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//初始化棋盘(9*9的外部也要初始化)InitBoard(mine, '0');InitBoard(show, '*');//打印棋盘(打印9*9的部分就可以了)DisplayBoard(show);//布置雷(放在mine数组9*9中即可)SetMine(mine);//排查雷FindMine(mine, show);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}

 五、游戏展示

扫雷小游戏演示


本次C语言小游戏扫雷的内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 ! 

相关文章:

【C语言】小游戏-扫雷(清屏+递归展开+标记)

大家好&#xff0c;我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...

云服务 Ubuntu 20.04 版本 使用 Nginx 部署静态网页

所需操作&#xff1a; 1.安装Nginx 2.修改配置文件 3.测试、重启 Nginx 4.内部修改防火墙 5.配置解析 6.测试是否部署成功 1.安装Nginx // 未使用 root 账号 apt-get update // 更新apt-get install nginx // 安装 nginx 1.1.测试是否安装没问题 在网页上输入云服务的公网…...

无后效性

动态规划的概念 在上例的多阶段决策问题中&#xff0c;各个阶段采取的决策&#xff0c;一般来说是与时间有关的&#xff0c;决策依赖于当前状态&#xff0c;又随即引起状态的转移&#xff0c;一个决策序列就是在变化的状态中产生出来的&#xff0c;故有“动态”的含义&#xf…...

Kubernetes系列-删除deployment和pod

通过deployment创建的pod直接执行delete是不会正常被删除的&#xff0c;因为deployment中设置了pod的数量&#xff0c;deployment会动态维护pod的数量&#xff0c;倘若pod数量少于约定数量&#xff0c;deployment会创建pod&#xff0c;直到pod数量达到约定数量才会停止。 如若…...

kotlin字符串方法

以下是一些常用的 String 方法示例&#xff1a; 1.获取字符串长度&#xff1a; val str "Hello, Kotlin" val length str.length2.字符串比较&#xff1a; val str1 "apple" val str2 "banana" val compareResult str1.compareTo(str2)3…...

ubuntu篇---配置FTP服务,本机和docker安装

ubuntu篇---配置FTP服务 一、本机安装1.1 安装FTP服务器软件1.2 配置FTP服务 二、docker安装&#xff08;我用的这个&#xff09;2.1 创建 目录2.2 启动脚本2.3 访问2.4 如何创建一个新的用户2.5 测试2.6 使用 一、本机安装 1.1 安装FTP服务器软件 ubuntu安装vsftp sudo apt…...

SpringBoot中properties、yml、yaml的优先级

原理 配置优先级低的会先加载然后会被配置优先级高的覆盖 验证 创建SpringBoot项目&#xff08;网址&#xff09; 在resource目录下创建application.properties、application.yml、application.yaml文件 运行 结论 优先级顺序&#xff1a; properties>yml>yaml...

SHELL 基础 SHELL注释 及 执行SHELL脚本的四种方法

SHELL 脚本编写规范 &#xff1a; 脚本开头 &#xff1a; # 脚本第一行 &#xff1a; #! /bin/bash 或 #!/bin/sh &#xff08; 脚本解释器 &#xff09; # 程序段开头需要加 版本版权信息 &#xff0c;例如 &#xff1a; # Date 创建日期 # Author : 作者 # …...

【Spring】深入探索 Spring AOP:概念、使用与实现原理解析

文章目录 前言一、初识 Spring AOP1.1 什么是 AOP1.2 什么是 Spring AOP 二、AOP 的核心概念2.1 切面&#xff08;Aspect&#xff09;2.2 切点&#xff08;Pointcut&#xff09;2.3 通知&#xff08;Advice&#xff09;2.4 连接点&#xff08;Join Point&#xff09; 三、Sprin…...

LocalDate介绍和使用

1.什么是 LocalDate&#xff1f; 在我们开始之前&#xff0c;让我先简单介绍一下 LocalDate。它是 Java 8 中引入的日期类&#xff0c;用于表示不带时区信息的日期。也就是说&#xff0c;它专注于日期&#xff0c;并忽略了具体的时间。这样&#xff0c;我们就可以专心解决那些…...

三、使用注解形式开发 Spring MVC程序

文章目录 一、环境准备二、配置 web.xml三、配置 SpringMVC-Servlet.xml &#xff0c;这里不再使用之前那种写法&#xff0c;直接采用注解配置&#xff0c;引入注解支持&#xff0c;配置视图解析器四、编写 Controller&#xff08;Controller 和 RequestMapping 注解说明&#…...

【Go】常见的四个内存泄漏问题

Goroutine没有顺利结束 1、这里更多的是由于channelforselect导致的&#xff0c;错误的写法导致了发送者或接收者没有发现channel已经关闭&#xff0c;任务已经结束了&#xff0c;却仍然在尝试输入输出https://geektutu.com/post/hpg-exit-goroutine.html Map的remove方法不会…...

【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,1…...

TOMCAT基础

tomcat是一个基于Java开发的&#xff0c;开放源代码的web应用服务器。它可以解析html页面中的java代码&#xff0c;执行动态请求&#xff0c;实现动态页面。核心功能是将收到的http请求处理并转发给适当的servlet来处理&#xff0c;然后将响应返回给客户端。 优点 1&#xff0c…...

自动化集装箱码头建设指南

1 总则 1.0.1 为规范和指导自动化集装箱码头建设&#xff0c;提高自动化集装箱码头建设和装卸自动化应用水平&#xff0c;做到技术先进、经济合理、安全可靠、高效节能、绿色环保&#xff0c;制定本指南。 1.0.2本指南适用于新建、改建和扩建自动化集装箱码头的设计&#xff0…...

为什么要用redis

高性能 就是把你一些复杂操作耗时查出来的结果(用了600ms)&#xff0c;如果确定后面不咋变了&#xff0c;然后但是马上还有很多读请求&#xff0c;那么直接结果放缓存(6ms)&#xff0c;后面直接读缓存就好了。 这样&#xff0c;性能就提升了100倍 高并发 说白了就是&#xf…...

QT qmake解析

...

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…...

MySQL 深度分页优化

MySQL 深度分页优化 理解总结&#xff1a; 分页使用limit &#xff0c;前提是要排序好的数据&#xff0c;这时候&#xff0c;就推荐使用带索引的字段排序&#xff0c;因为索引是天然有序的&#xff0c;不需要像是无序的字段一样&#xff0c;全表扫描&#xff0c;如果太大的话…...

如何在CSS中水平居中一个元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 margin: 0 auto⭐ 使用 Flexbox 布局⭐ 使用绝对定位和负边距⭐ 使用表格布局⭐ 使用网格布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...