C语言(扫雷游戏)

                     Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。

                                一、扫雷游戏

                                                1、扫雷游戏规则

                                                2、扫雷游戏的实现

                                                3、

一、扫雷游戏

1、扫雷游戏的规则

        首先我们来介绍一下扫雷游戏的玩法,扫雷游戏的常规界面(9*9)如下:

         上面游戏板上有许多个格子,有些格子里面埋有雷,玩家需要点击格子揭开它们,如果揭开的格子里是雷则被炸死游戏结束,若果揭开的格子不是雷则显示点开的格子周围有多少个雷,玩家需要通过给出的信息进行逻辑判断和猜测来排除所有的雷。

2、扫雷游戏的实现

        2.1打印游戏界面

        了解完游戏的玩法后,我们就要来好好想想要怎么通过代码来实现这个小游戏。

        首先,我们需要新建一个 main.c 文件来存放函数的主体代码,新建一个 game.c 文件用来游戏实现代码,新建一个 game.h 来包含其中会用到的一些头文件和相关函数的声明。

        跟其他游戏一样,我们得有个游戏菜单吧,在 —> 猜数字小游戏 这篇文章中我们已经有了一种打印游戏菜单的方法,不妨我们就继续延用这种办法吧。

main.c 

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"//这里我将头文件<stdio.h>包含到game.h,再在main.c和
                 //game.c文件中包含game.h,避免重复引用

void menu()
{
	printf("##########################\n");
	printf("########  1.play  ########\n");
	printf("########  0.exit  ########\n");
	printf("##########################\n");
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)//通过输入的input来选择开始游戏还是退出游戏
		{
		case 1:
			printf("开始游戏!\n");
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:  //如果不小心输入错误的值,还要提示重新选择
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);//do—while循环可以帮助我们实现重复玩游戏
	return 0;
}

        代码运行先打印一个简易的游戏菜单,提示我们选择1开始游戏,选择0退出游戏,选择其他值则提示选择错误,重新选择。当我们选择1开始游戏,游戏结束后通过 break 跳出来到 while 判断,input 的值为1继续循环开始游戏;当我们选择0则退出游戏,通过 break 跳出来到 while 判断,input 的值为0退出循环;当我们选择其他非0的值通过 break 跳出来到 while 判断,非0继续循环。

        通过代码执行可以试验出我们当前的逻辑是正确的。我们在写工程量比较大的代码时,写完一段程序最好运行试验一下是否符合我们的想法。

 

        2.2游戏分析

        接下来我们就要分析一下该如何实现这个游戏了。首先我们得有一个矩形棋盘吧,这里我们就先设计一个简单的 9*9 游戏棋盘。提到矩形 9*9 棋盘我们就很容易联想到之前学习过的二维数组,二维数组就能很好的帮我们实现这个事情,并且二维数组还能通过坐标唯一确定一个小格子。有了游戏棋盘在玩游戏之前还应该由系统自动布置好雷的位置,并且位置是随机的,影藏在棋盘下我们看不到。

        我们设计的这个棋盘不仅要事先随机布置隐藏好雷,还要在我们玩的时候显示周围雷的个数,是不是对这个棋盘要求太高了,我们实现起来也比较复杂。这里我们有一个还不错的解决办法,我们可以定义两个二维数组,一个用来随机产生并且隐藏雷,在我们玩游戏的时候并不打印;另一个在我们玩的时候打印显示排雷的信息也就是周围雷的个数。

        提到定义两个二维数组就不得不想清楚我们究竟要定义两个什么类型的二维数组呢?在这之前,我们需要考虑一下怎么区分雷和非雷。其实这一步有很多种方法,想要怎么设计完全由你自己决定,这里我们不妨就定义字符 ‘0’ 为雷,字符 ‘1’ 为非雷吧,至于为什么要定义为字符而不是我们常见的数字1和0,其实是有原因的。

        我们前面说过,如果揭开的格子下不是雷,就要将这个格子周围的雷的数目加起来并在我们揭开的这个格子上显示,要显示的话当然显示的是数字,如果这个格子周围恰好是一个雷就要在这个格子上显示数字1,这就非常容易与我们定义的雷(0)或非雷(1)冲突,我们定义为字符的话就可以很好的避免这个问题。

 

         还有一个隐藏的问题,如果我们想排查(8,7)这个坐标,很明显越界了,那我们要判断这个坐标是不是雷之前还要先判断数组是否越界,因为数组越界是比较危险的事情,谁也不知道越界访问到的是什么数据,严重还会导致程序崩溃,所以我们要想办法避免这个问题。

        我们可以把之前定义的两个字符型二维数组大小改为 11 行 11 列,而不是用 9 行 9 列,在操作的时候外面一圈不操作,只在 9*9 的棋盘内排雷,这样就不会有越界的问题。

        2.3打印游戏棋盘

       接上所述,我们定义了两个 11 行 11 列的字符型二维数组,定义好后我们先将埋雷的二维数组初始化为 ‘1’,将显示排雷信息的二维数组初始化为 * ,因为埋雷的二维数组并不打印,所以我们就实现了用一个棋盘覆盖另一个棋盘的效果。

        到这里我们先来看一下效果:

         测试效果跟我们预期的一样,当然,在真正玩的时候上面埋雷的棋盘是不打印的,这里我们只是测试一下棋盘是否初始化成功。

        相关代码如下:

        main.c 

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"//这里我将头文件<stdio.h>包含到game.h,再在main.c和
                 //game.c文件中包含game.h,避免重复引用

void menu()
{
	printf("##########################\n");
	printf("########  1.play  ########\n");
	printf("########  0.exit  ########\n");
	printf("##########################\n");
}

void game()
{
	//定义两个二维数组作棋盘
	char mine[ROWS][COLS] = { 0 };//存放雷
	char show[ROWS][COLS] = { 0 };//存放排雷的信息

	//初始化二维数组
	Init_Board(mine, ROWS, COLS, '1');
	Init_Board(show, ROWS, COLS, '*');

	//打印棋盘
	Display_Board(mine, ROW, COL);
	Display_Board(show, ROW, COL);

}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)//通过输入的input来选择开始游戏还是退出游戏
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:  //如果不小心输入错误的值,还要提示重新选择
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);//do—while循环可以帮助我们实现重复玩游戏
	return 0;
}

         game.c

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"

void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void Display_Board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("————————扫雷————————\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

        game.h 

#pragma once

#include <stdio.h>

#define ROW 9  //定义二维数组的行和列方便修改大小
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2

//初始化两个二维数组
void Init_board(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void Display_Board(char board[ROWS][COLS], int row, int col);

        注意: 虽然我们有些函数操作的是 ROW 和 COL , 但我们函数传参的时候传的还是 ROWS 和 COLS , 因此我们形参接收的时候一定要用 ROWS 和 COLS 接收。

        2.4埋雷

        我们之前确定了定义 ‘0’ 为雷,下面我们就来探讨如何埋雷。

        首先,我们需要确定埋多少个雷,可以定义一个符号常量来选择埋多少个雷,这里就先埋10个雷。其次,埋雷的话肯定是要随机的埋10个雷,那就要产生10个随机的坐标,产生随机数的函数我们在之前的猜数字小游戏中已经使用过,这里就不过多介绍了。(猜数字小游戏

        我们在埋雷的过程中还需要判断这个坐标是否已经埋了雷,这个不难实现,只需要加一个 if 语句即可。我们来看代码实现:

        main.c

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"//这里我将头文件<stdio.h>包含到game.h,再在main.c和
                 //game.c文件中包含game.h,避免重复引用

void menu()
{
	printf("##########################\n");
	printf("########  1.play  ########\n");
	printf("########  0.exit  ########\n");
	printf("##########################\n");
}

void game()
{
	//定义两个二维数组作棋盘
	char mine[ROWS][COLS] = { 0 };//存放雷
	char show[ROWS][COLS] = { 0 };//存放排雷的信息

	//初始化二维数组
	Init_Board(mine, ROWS, COLS, '1');
	Init_Board(show, ROWS, COLS, '*');

	//打印棋盘
	//Display_Board(mine, ROW, COL);
	Display_Board(show, ROW, COL);

	//埋雷
	Set_Mine(mine, ROW, COL);
	Display_Board(mine, ROW, COL);//打印看一下埋雷是否成功

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//调用rand函数之前先要调用srand函数
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)//通过输入的input来选择开始游戏还是退出游戏
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:  //如果不小心输入错误的值,还要提示重新选择
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);//do—while循环可以帮助我们实现重复玩游戏
	return 0;
}

        game.c 

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"

void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void Display_Board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("————————扫雷————————\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void Set_Mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < EASY_COUNT)
	{
		x = rand() % row + 1;//产生范围为1-9的随机数
		y = rand() % col + 1;
		if (mine[x][y] != '0')
		{
			mine[x][y] = '0';
			count++;
		}
	}
}

        game.h 

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9  //定义二维数组的行和列方便修改大小
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASY_COUNT 10

//初始化两个二维数组
void Init_board(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void Display_Board(char board[ROWS][COLS], int row, int col);

//埋雷
void Set_Mine(char mine[ROWS][COLS], int row, int col);

        运行结果为: 

 

         可以看到,我们已经实现了埋10个雷。

        2.5扫雷

        接下来就到了最后一步,实现扫雷。

        我们需要输入一个坐标,判断此坐标下是否埋着雷,如果是雷则打印 “你踩雷了,游戏失败!”,并且打印出所有雷的位置;如果不是雷则需要在这个坐标处显示周围8个坐标内雷的个数,继续输入坐标扫雷。

        怎么获得排查过的坐标周围雷的个数呢?我们不难发现,(x,y)周围8个坐标分别可以表示为x或y加-1、0、1得到的9个坐标,然后把这9个坐标的值分别进去字符 ‘0’,使其转换为整型再加起来,经过处理就能得到雷的个数。

        最终的代码为:

        main.c

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"//这里我将头文件<stdio.h>包含到game.h,再在main.c和
                 //game.c文件中包含game.h,避免重复引用

void menu()
{
	printf("##########################\n");
	printf("########  1.play  ########\n");
	printf("########  0.exit  ########\n");
	printf("##########################\n");
}

void game()
{
	//定义两个二维数组作棋盘
	char mine[ROWS][COLS] = { 0 };//存放雷
	char show[ROWS][COLS] = { 0 };//存放排雷的信息

	//初始化二维数组
	Init_Board(mine, ROWS, COLS, '1');
	Init_Board(show, ROWS, COLS, '*');

	//打印棋盘
	//Display_Board(mine, ROW, COL);
	Display_Board(show, ROW, COL);

	//埋雷
	Set_Mine(mine, ROW, COL);
	//Display_Board(mine, ROW, COL);//打印看一下埋雷是否成功

	//扫雷
	Find_Mine(mine, show, ROW, COL);
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//调用rand函数之前先要调用srand函数
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)//通过输入的input来选择开始游戏还是退出游戏
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:  //如果不小心输入错误的值,还要提示重新选择
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);//do—while循环可以帮助我们实现重复玩游戏
	return 0;
}

        game.c

#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"

void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void Display_Board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("————————扫雷————————\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void Set_Mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < EASY_COUNT)
	{
		x = rand() % row + 1;//产生范围为1-9的随机数
		y = rand() % col + 1;
		if (mine[x][y] != '0')
		{
			mine[x][y] = '0';
			count++;
		}
	}
}

int Get_Mine_Count(char mine[ROWS][COLS], int x, int y)
{
	int i = 0;
	int count = 0;
	for (i = -1; i <= 1; i++)
	{
		int j = 0;
		for (j = -1; j <= 1; j++)
		{
			count += (mine[x + i][y + j] - '0');
		}
	}
	return (9 - count);
}

void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	while (count < (row * col - EASY_COUNT))//排查出所有的非雷坐标后退出循环
	{
		printf("请输入想要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//必须输入范围内的坐标
		{
			if (mine[x][y] == '0')
			{
				printf("你踩雷了,游戏结束!\n");
				Display_Board(mine, ROW, COL);
				printf("\n\n\n");
				break;
			}
			else
			{
				int count = Get_Mine_Count(mine, x, y);
				show[x][y] = count + '0';//整型count需要加上字符‘0’才能赋值给字符型数组show
				Display_Board(show, ROW, COL);
			}
		}
		else
		{
			printf("输入的坐标有误,x和y的范围为1-%d\n", row);
		}
	}
	if (count == EASY_COUNT)
	{
		printf("恭喜你,扫雷成功!\n");
		Display_Board(mine, ROW, COL);
	}
}

        game.h 

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9  //定义二维数组的行和列方便修改大小
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASY_COUNT 10

//初始化两个二维数组
void Init_board(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void Display_Board(char board[ROWS][COLS], int row, int col);

//埋雷
void Set_Mine(char mine[ROWS][COLS], int row, int col);

//扫雷
void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

            至此,我们就完成了整个游戏的实现。

                                    点击跳转主页—> 💥个人主页小羊在奋斗

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

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

相关文章

基于docker搭建瀚高数据库HighGo6.0.1【图文】

基于docker搭建瀚高数据库HighGo6.0.1 拉取镜像启动验证进入容器 登录数据库查看数据库加密方式修改加密方式为sm3进入数据库修改密码重启容器 数据库验证数据库密码到期参考 docker部署 https://blog.csdn.net/weixin_44385419/article/details/127738868 拉取镜像 docker p…

Springboot+Vue项目-基于Java+MySQL的网上点餐系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

[XR806开发板试用]MQ-2烟雾传感器

非常感谢这次极术社区给我这个机会直接接触harmonyos&#xff0c;日常接触的一般都是恩智浦的I.MX RT系列比较多&#xff0c;对于这一类高速汽车芯片来说&#xff0c;最常接触的是RThread系统比较多。而且相对编译环境比较容易配置&#xff0c;直接接触这类系统还是第一次&…

【Qcom Camera】DumpDebugInfo分析

DumpDebugInfo&#xff1a; DumpDebugInfo主要包括Session::DumpDebugInfo、Pipeline::Dumpdebuginfo、Node::Dumpdebuginfo、DRQ::Dumpdebuginfo、Usecase::DumpDebugInfo log&#xff1a;Hit SOF threshold of [xx] consecutive frames CamX: [ERROR][CORE ] camxpip…

1.基于Springboot对SpringEvent初步封装

一&#xff1a;前置知识 Spring Event是Spring框架提供的一种事件机制&#xff0c;用于处理组件之间的通信。在复杂的系统中&#xff0c;模块或组件之间的通信是必不可少的。Spring Event可以用于以下场景&#xff1a; 1.系统间解耦&#xff1a;模块或组件之间通过事件进行通…

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

跨语言大模型最新综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

L2-052 吉利矩阵

题目描述 题解思路 这个道题就是很简单&#xff0c;就跟n皇后问题一样&#xff0c;给矩阵填数&#xff0c;使得矩阵满足一个什么条件&#xff0c;最后求方案数或者方案。很容易想到回溯法&#xff0c;根据数据范围&#xff0c;应该能够确定回溯法是没有问题的。 我们只需要枚举…

《C语言深度解剖》(9):深度剖析数据在内存中的存储

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

双线性插值计算手动实现以及原理

双线性插值计算手动实现以及原理 代码原理 代码 先贴代码吧&#xff0c;原理其实也比较简单&#xff0c;看代码基本也就理解了&#xff0c;时间太晚了&#xff0c;原理后续再补吧。 import torch from torch.nn import functional as F import numpy as np from itertools im…

力扣经典150题第三十六题:旋转图像

目录 力扣经典150题第三十六题&#xff1a;旋转图像引言题目详解解题思路代码实现示例演示复杂度分析总结扩展阅读 力扣经典150题第三十六题&#xff1a;旋转图像 引言 本篇博客介绍了力扣经典150题中的第三十六题&#xff1a;旋转图像。题目要求将给定的 n n 二维矩阵顺时针…

玩转 AIGC!使用 SD-WebUI 实现从文本到图像转换

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大家…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

小白必备:Python必须掌握的十大模块,建议收藏!

前言 Python 是一种高级、解释型和通用动态编程语言&#xff0c;侧重于代码的可读性。 它在许多组织中使用&#xff0c;因为它支持多种编程范例。 它还执行自动内存管理。 它是世界上最受欢迎的编程语言之一。 这是有很多原因的&#xff1a; 这很容易学习。它超级多才多艺。…

Jenkins 构建踩坑经历

SourceLink.Create.CommandLine.targets(30,5): error : unable to convert OriginUrl: 打开报错“SourceLink.Create.CommandLine.targets”文件所在编辑此文件&#xff0c;找到30行 修改如下

浮动的4个案例详解:网易云音乐列表/导航,淘宝banner区,文字环绕

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

如何在Windows10中管理自动维护?这里有详细步骤

为了使你的Windows操作系统和应用程序保持最新状态并保持良好的健康&#xff0c;有必要定期进行Windows维护。 ​快速的方法是启动自动维护&#xff0c;这样Windows就可以每天自动运行维护任务&#xff0c;包括软件更新、安全扫描和系统诊断。本文介绍了一个在Windows10中管理…

Arthas介绍及使用技巧

文章目录 简介能做什么&#xff1f; 使用下载并启动arthas选择应用 java 进程退出 arthas 常用查看命令帮助查看 dashboard通过 thread 命令来获取到线程的栈通过 jad 来反编译 Classwatch 查看方法出入参、sc 搜索类: 查看已加载类所在的包monitor 方法执行监控trace 方法内调…

HTML 如何实现一个带间隙的圆环

实际效果&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5e634cedded9424d96fbe6d46f34f61a.png#pic_center 代码实现&#xff1a; HTML部分&#xff1a; <svg width"500" height"500" viewBox"0 0 100 100">&…

VideoComposer: Compositional Video Synthesis with Motion Controllability

decompose videos into three distinct types of conditions: textual conditions, spatial conditions, temperal conditions 条件的内容&#xff1a; a. textual condition: coarse grained visual content and motions, 使用openclip vit-H/14的text encoder b. spatial co…