扫雷(C 语言)

news2024/10/17 5:28:19

目录

  • 一、游戏设计分析
  • 二、各个步骤的代码实现
    • 1. 游戏菜单界面的实现
    • 2. 游戏初始化
    • 3. 开始扫雷
  • 三、完整代码
  • 四、总结

一、游戏设计分析

本次设计的扫雷游戏是展示一个 9 * 9 的棋盘,然后输入坐标进行判断,若是雷,则游戏结束,否则继续判断,直到排除所有雷,游戏胜利。然后选择退出或者重新开始游戏。

(1)游戏菜单界面实现
提供开始游戏和退出游戏两个选项,游戏结束后可以再次选择,直到退出游戏。
(2)游戏初始化
开始游戏后,初始化棋盘,随机设置地雷,然后显示棋盘。这里需要两个二维数组,一个用来显示棋盘,一个用来存储地雷的信息。
(3)开始扫雷
提示玩家输入坐标,然后检查坐标是否合法,最后判断位置是否为雷。若为雷,则游戏结束;若不为雷则计算周围地雷的个数,若周围地雷的个数不为 0,则显示将其显示在棋盘上;若周围地雷个数为 0,则使用刚才的方法继续检查周围的 8 个位置,以此类推,检查结束后把信息全部显示在棋盘上。然后继续下一次坐标输入,直到把所有的雷找出,游戏获胜。

上述需要计算输入坐标周围的的雷的个数,如果在该坐标在最边上一圈,那么会存在排查的坐标非法的情况。这里可以使用 11 * 11 的棋盘,然后通过把雷设置为字符 ‘1’,非雷设置为字符 ‘0’,当计算时把周围八个坐标相加然后减去 8 个字符 ‘0’ 即可。
(4)游戏结束或重新开始游戏

二、各个步骤的代码实现

1. 游戏菜单界面的实现

游戏菜单界面需要提供开始游戏和退出游戏两个选项,且玩完一局游戏之后可以选择再玩一局。在主函数使用一个循环来控制实现,如下:

(1)test.c 测试文件

// 头文件
#include "Mine.h"

int main()
{
	// 所需变量
	int select;
	// 选择
	do
	{
		// 菜单
		menu();
		// 输入
		scanf("%d", &select);
		// 判断
		switch (select)
		{
		case 1:
			printf("扫雷游戏\n");
			//Minesweeper_game();
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (select);

	return 0;
}

(2)Mine.h 头文件

// 头文件
#include <stdio.h>

// 函数声明
// 菜单
void menu();

(3)Mine.c 函数实现文件

// 头文件
#include "Mine.h"

// 函数定义
// 菜单
void menu()
{
	printf("*****************************************\n");
	printf("*************    1. play    *************\n");
	printf("*************    0. exit    *************\n");
	printf("*****************************************\n");
}

(4)代码运行效果:
在这里插入图片描述

2. 游戏初始化

游戏初始化需要显示棋盘,然后随机设置雷。这里需要使用两个数组,一个数组用来显示棋盘,另一个数组用来存储雷的信息。为了方便计算,两个数组都采用 11*11 的字符数组,初始棋盘使用符号 ‘*’,地雷使用字符 ‘1’,非地雷使用字符 ‘0’。数组大小使用在头文件中定义的符号常量,设计一个初始化函数 InitBoard() 和设置雷函数 SetMine(),还有显示棋盘函数 PrintBoard()。

InitBoard() 函数可以一次性传两个数组,也可以通过参数传递设置的值。SetMine() 函数需要使用随机数。PrintBoard() 函数显示的时候可以在左边和上面加上行号和列号,方便玩家输入坐标。

(1)test.c 测试文件
添加了扫雷游戏函数 Minesweeper_game()

// 头文件
#include "Mine.h"

int main()
{
	// 所需变量
	int select;
	// 选择
	do
	{
		// 菜单
		menu();
		// 输入
		scanf("%d", &select);
		// 判断
		switch (select)
		{
		case 1:
			Minesweeper_game();  // 扫雷游戏
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (select);

	return 0;
}

(2)Mine.h 头文件

// 头文件
#include <stdio.h>

// 常量声明
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

// 函数声明
// 菜单
void menu();

// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);

// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col);

// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col);

// 扫雷游戏
void Minesweeper_game();

(3)Mine.c 函数实现文件

// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
	int i;
	for (i = 0; i < rows; ++i)
	{
		int j;
		for (j = 0; j < cols; ++j)
		{
			Board[i][j] = set;
		}
	}
}

// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col)
{
	// 所需变量
	int x, y;  // 雷的坐标
	int num = MINE_COUNT;  // 雷的数量
	// 设置雷
	while (num)
	{
		// 随机设置坐标值
		x = rand() % row + 1;  // 11 * 11 实际坐标 1 - 9
		y = rand() % col + 1;
		// 检查坐标是否重复
		if (Board[x][y] == '0')
		{
			Board[x][y] = '1';
			--num;
		}
	}
}

// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col)
{
	// 分界线
	printf("-----------------------扫雷----------------------\n");
	// 列号
	printf("  ");
	int j;
	for (j = 0; j < col; ++j)
	{
		printf("%d ", j + 1);
	}
	printf("\n");
	// 棋盘
	int i;
	for (i = 0; i < row; ++i)
	{
		// 列号
		printf("%d ", i + 1);
		for (j = 0; j < col; ++j)
		{
			printf("%c ", Board[i+1][j+1]);
		}
		// 下一行
		printf("\n");
	}
	// 分界线
	printf("-----------------------扫雷----------------------\n");
}

// 扫雷游戏
void Minesweeper_game()
{
	// 创建两个棋盘
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	// 初始化棋盘
	InitBoard(board, ROWS, COLS, '*');
	printf("初始化两个数组:\n");  // 删除
	PrintBoard(board, ROW, COL);  // 删除
	InitBoard(mine, ROWS, COLS, '0');
	PrintBoard(mine, ROW, COL);  // 删除
	// 设置雷
	SetMine(mine, ROW, COL);
	printf("雷的信息:\n");  // 删除
	PrintBoard(mine, ROW, COL);  // 删除
}

上述标记了删除的语句都是不需要的,这是作者写完代码用来检测的。

(4)代码运行效果
在这里插入图片描述

3. 开始扫雷

开始扫雷,设计一个函数 find(),要求玩家输入坐标,检查该坐标是否合法,然后判断该位置是否为雷,是雷则游戏结束,不是雷则使用函数 calc_mine() 计算周围一圈的雷的个数。如果周围一圈没有雷,则按照刚才的步骤检查周围一圈,实现函数 calc_mine() 递归。然后继续扫雷,直到找出所有的雷。

函数 calc_mine() 只在 find() 函数中使用,可以设置为 Mine.c 函数实现文件中的静态函数。判断游戏结束也需要使用一个变量,这里使用一个全局变量 REAMIN 来进行控制,当 REAMIN 的值为棋子总数减去雷数时,则排除所有雷,游戏结束。

代码测试时,可以一个一个功能进行测试,一个功能完成无误后再进入下一个。作者是全部测试好了才放上来的。

(1)Mine.h 头文件

// ...

// 找雷
void find(char Board[ROWS][COLS], int row, int col);

// 扫雷游戏
void Minesweeper_game();

(2)Mine.c 函数实现文件

// 计算周围的雷
void calc_mine(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col, int x, int y)
{
	// 坐标非法或者已经排查或该位置为雷则退出
	if (x < 1 || x > 9 || y < 1 || y > 9 || Board[x][y] != '*' || Mine[x][y] != '0')
		return;
	// 所需变量
	int num = 0;
	int i;
	for (i = x - 1; i <= x + 1; ++i)
	{
		int j;
		for (j = y - 1; j <= y + 1; ++j)
		{
			num += Mine[i][j];
		}
	}
	// 加的是字符 '0' 所以要减去
	num = num - 9 * '0';
	// 排雷 +1
	++REMAIN;
	if (num)
	{
		Board[x][y] = num + '0';
	}
	else
	{
		Board[x][y] = ' ';

		// 如果该坐标周围没雷,则对其周围八个坐标进行检查,形成递归
		for (i = x - 1; i <= x + 1; ++i)
		{
			int j;
			for (j = y - 1; j <= y + 1; ++j)
			{
				calc_mine(Board, Mine, row, col, i, j);
			}
		}
	}
}

// 找雷
int find(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col)
{
	// 所需变量
	int x, y;
	// 输入排查坐标
	while (1)
	{
		printf("请输入排雷坐标:");
		scanf("%d %d", &x, &y);
		// 判断坐标是否合法
		if (Board[x][y] != '*')
		{
			printf("该坐标已被排查!\n");
			continue;
		}
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了!\n");
				printf("以下是本局雷的信息\n");
				return 0;
			}
			else
			{
				calc_mine(Board, Mine, row, col, x, y);
				return 1;
			}
		}
	}
}

// 扫雷游戏
void Minesweeper_game()
{
	// 重置
	REMAIN = 0;
	// 创建两个棋盘
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	// 初始化棋盘
	InitBoard(board, ROWS, COLS, '*');
	InitBoard(mine, ROWS, COLS, '0');
	// 设置雷
	SetMine(mine, ROW, COL);
	int ret = 0;
	while (REMAIN != ROW * COL - MINE_COUNT)
	{
		// 显示棋盘
		PrintBoard(board, ROW, COL);
		// 排雷
		ret = find(board, mine, ROW, COL);
		// 如果是雷,则显示雷的信息,游戏结束
		if (!ret)
		{
			PrintBoard(mine, ROW, COL);
			break;
		}
	}
	// 判断
	if (REMAIN == ROW * COL - MINE_COUNT)\
	{
		printf("恭喜你排雷成功,游戏结束!\n");
		printf("以下是本局雷的信息:\n");
		PrintBoard(mine, ROW, COL);
	}
}

(3)代码运行效果:
下图是完整代码运行效果,一整局游戏的运行图:
在这里插入图片描述

三、完整代码

完整代码分为三个文件:头文件 Mine.h,测试文件 test.c,函数实现文件 Mine.c

头文件 Mine.h

#pragma once

// 头文件
#include <stdio.h>
#include <stdlib.h>

// 常量声明
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define MINE_COUNT 10

// 函数声明
// 菜单
void menu();

// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);

// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col);

// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col);

// 找雷
int find(char Board[ROWS][COLS],char Mine[ROWS][COLS], int row, int col);

// 扫雷游戏
void Minesweeper_game();

测试文件 test.c

// 头文件
#include "Mine.h"
#include <time.h>

int main()
{
	// 设置随机数种子
	srand((unsigned)time(0));
	// 所需变量
	int select;
	// 选择
	do
	{
		// 菜单
		menu();
		// 输入
		scanf("%d", &select);
		// 判断
		switch (select)
		{
		case 1:
			Minesweeper_game();  // 扫雷游戏
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (select);

	return 0;
}

函数实现文件 Mine.c

// 头文件
#include "Mine.h"

// 全局静态变量
static REMAIN = 0;

// 函数定义
// 菜单
void menu()
{
	printf("*****************************************\n");
	printf("*************    1. play    *************\n");
	printf("*************    0. exit    *************\n");
	printf("*****************************************\n");
}

// 初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
	int i;
	for (i = 0; i < rows; ++i)
	{
		int j;
		for (j = 0; j < cols; ++j)
		{
			Board[i][j] = set;
		}
	}
}

// 设置雷
void SetMine(char Board[ROWS][COLS], int row, int col)
{
	// 所需变量
	int x, y;  // 雷的坐标
	int num = MINE_COUNT;  // 雷的数量
	// 设置雷
	while (num)
	{
		// 随机设置坐标值
		x = rand() % row + 1;  // 11 * 11 实际坐标 1 - 9
		y = rand() % col + 1;
		// 检查坐标是否重复
		if (Board[x][y] == '0')
		{
			Board[x][y] = '1';
			--num;
		}
	}
}

// 显示棋盘
void PrintBoard(char Board[ROWS][COLS], int row, int col)
{
	// 分界线
	printf("-----------------------扫雷----------------------\n");
	// 列号
	printf("  ");
	int j;
	for (j = 0; j < col; ++j)
	{
		printf("%d ", j + 1);
	}
	printf("\n");
	// 棋盘
	int i;
	for (i = 0; i < row; ++i)
	{
		// 列号
		printf("%d ", i + 1);
		for (j = 0; j < col; ++j)
		{
			printf("%c ", Board[i+1][j+1]);
		}
		// 下一行
		printf("\n");
	}
	// 分界线
	printf("-----------------------扫雷----------------------\n");
}

// 计算周围的雷
void calc_mine(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col, int x, int y)
{
	// 坐标非法或者已经排查或该位置为雷则退出
	if (x < 1 || x > 9 || y < 1 || y > 9 || Board[x][y] != '*' || Mine[x][y] != '0')
		return;
	// 所需变量
	int num = 0;
	int i;
	for (i = x - 1; i <= x + 1; ++i)
	{
		int j;
		for (j = y - 1; j <= y + 1; ++j)
		{
			num += Mine[i][j];
		}
	}
	// 加的是字符 '0' 所以要减去
	num = num - 9 * '0';
	// 排雷 +1
	++REMAIN;
	if (num)
	{
		Board[x][y] = num + '0';
	}
	else
	{
		Board[x][y] = ' ';

		// 如果该坐标周围没雷,则对其周围八个坐标进行检查,形成递归
		for (i = x - 1; i <= x + 1; ++i)
		{
			int j;
			for (j = y - 1; j <= y + 1; ++j)
			{
				calc_mine(Board, Mine, row, col, i, j);
			}
		}
	}
}

// 找雷
int find(char Board[ROWS][COLS], char Mine[ROWS][COLS], int row, int col)
{
	// 所需变量
	int x, y;
	// 输入排查坐标
	while (1)
	{
		printf("请输入排雷坐标:");
		scanf("%d %d", &x, &y);
		// 判断坐标是否合法
		if (Board[x][y] != '*')
		{
			printf("该坐标已被排查!\n");
			continue;
		}
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了!\n");
				printf("以下是本局雷的信息\n");
				return 0;
			}
			else
			{
				calc_mine(Board, Mine, row, col, x, y);
				return 1;
			}
		}
	}
}

// 扫雷游戏
void Minesweeper_game()
{
	// 重置
	REMAIN = 0;
	// 创建两个棋盘
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	// 初始化棋盘
	InitBoard(board, ROWS, COLS, '*');
	InitBoard(mine, ROWS, COLS, '0');
	// 设置雷
	SetMine(mine, ROW, COL);
	int ret = 0;
	while (REMAIN != ROW * COL - MINE_COUNT)
	{
		// 显示棋盘
		PrintBoard(board, ROW, COL);
		// 排雷
		ret = find(board, mine, ROW, COL);
		// 如果是雷,则显示雷的信息,游戏结束
		if (!ret)
		{
			PrintBoard(mine, ROW, COL);
			break;
		}
	}
	// 判断
	if (REMAIN == ROW * COL - MINE_COUNT)\
	{
		printf("恭喜你排雷成功,游戏结束!\n");
		printf("以下是本局雷的信息:\n");
		PrintBoard(mine, ROW, COL);
	}
}

四、总结

本次扫雷游戏的代码实现,总体来说还比较可以。基本功能均实现,游戏也能正常进行。本游戏还有许多可以提升的地方,比如:代码的优化,雷的标记,难度的选择等等。

本代码稍微难一点的地方在于排查坐标周围地雷数的函数 calc_mine() 的递归,需要明确何时需要递归,和递归的结束条件。

复习一下递归需要满足两个条件:
(1)需要结束条件
(2)每次递归都更加靠近这个结束条件

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

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

相关文章

南京邮电大学电工电子A实验九译码器及其应用

文章目录 1 实验报告预览2 Word版本报告下载 1 实验报告预览 2 Word版本报告下载 点我

git push错误failed to push some refs to解决方法

主流解决方法网上全是&#xff0c;例如解决目标仓库和本地仓库的版本冲突&#xff1b;关闭”受保护的仓库“权限。 本文讲述一种 网上几乎没有文章会讲解的一种可能的解决方式&#xff1a; 问题描述&#xff1a; 解决方式&#xff1a; 取消勾选即可

【Cadence27】HDL拷贝工程➕Allegro导出DXF和3D文件STP

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办&#xff1f; 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

python之socket网络编程

华子目录 引言什么是socketsocket套接字类型TCP和UDP socket服务端核心组件1.创建socket对象2.绑定地址和端口3.监听连接4.接受连接5.接受client端消息client_sock.revc(1024)6.发送响应给client端6.1client_sock.send()6.2client_sock.sendall() 7.关闭client端连接8.关闭serv…

【初阶数据结构】归并排序 - 分而治之的排序魔法

文章目录 前言1. 什么是归并排序&#xff1f;1.1 归并排序的步骤 2. 归并排序的代码实现2.1 归并排序代码的关键部分讲解2.1.1 利用递归2.1.2 将拆解的数组的元素放到一个临时空间中进行重新排序2.1.3 将在临时空间中排好的数组复制到目标数组中 3. 归并排序的非递归写法 前言 …

未来汽车究竟该是什么样子?

24年10月14日&#xff0c;在中国&#xff08;深圳&#xff09;机器视觉展暨机器视觉技术及工业应用研讨会上&#xff0c;同行者分享了未来智能座舱应该长什么样子。 受此启发&#xff0c;个人觉得当前大多数新能源车都极力想做出电动感&#xff0c;但是布局传统没跳出来&#…

DAY52WEB 攻防-XSS 跨站反射型存储型DOM 型标签闭合输入输出JS 代码解析

#知识点&#xff1a; 1、XSS跨站-输入输出-原理&分类&闭合 2、XSS跨站-分类测试-反射&存储&DOM 演示案例&#xff1a; ➢XSS跨站-输入输出-原理&分类&闭合 ➢XSS跨站-分类测试-反射&存储&DOM #XSS跨站-输入输出-原理&分类&闭合 漏…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天&#xff0c;安防监控领域也迎来了技术革新的春风。今天&#xff0c;我们就来聊聊这一领域的产品——摄像头图传模组&#xff0c;以及它如何借助飞睿智能1公里WiFi无线传输技术&#xff0c;为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

基于Java+Springboot+Vue开发的酒店客房预订管理系统

项目简介 该项目是基于JavaSpringbootVue开发的酒店客房预订管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java…

【AI学习】Mamba学习(七):HiPPO通用框架介绍

HiPPO这篇论文《HiPPO: Recurrent Memory with Optimal Polynomial Projections》&#xff0c;提出了一个通用框架。 我们再重新看一下论文的摘要&#xff1a; 从连续数据中学习的一个核心问题是&#xff0c;随着更多数据的处理&#xff0c;以增量方式表示累积历史。我们介绍了…

【记录】Windows|Windows 修改字体大全(Windows 桌面、VSCode、浏览器)

【记录】Windows&#xff5c;Windows 修改字体大全&#xff08;Windows 桌面、VSCode、浏览器&#xff09; 前言 最近从学长那里发现了一款非常美观的衡水体字体——Maple Mono SC NF。您可以通过以下链接下载该字体&#xff1a;https://github.com/subframe7536/maple-font/…

【C语言刷力扣】1832.判断句子是否为全字母句

题目&#xff1a; 法一 bool checkIfPangram(char* sentence) {int str[256];memset(str, 0, sizeof(int));for (int i 0; i < strlen(sentence); i) {str[ sentence[i] ];}for (int j a; j < z; j) {if (!str[j]) return false;}return true; } 法二 动态分配 typ…

C++ operator new和operator delete的深入讲解

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 关于operator new和operator delete我们需要明确一个概念&#xff0c;这两个都是…

2024全新UI网址发布页源码带黑夜模式

源码简介 2024全新UI网址发布页源码带黑夜模式&#xff0c;带网站延迟测速&#xff0c;该源码是html源码&#xff0c;可以做个引导页面。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可(或在本地直接打开) 首页截图 源码下载 2024全新UI网址发布页源码带黑…

​​Vision Pro/空间计算小白体系化练手案例:从入门到精通的实战项目指南

引言 随着苹果Vision Pro的发布,空间计算技术正迎来前所未有的发展机遇。对于希望进入这一领域的开发者来说,掌握visionOS及相关工具链是至关重要的第一步。本文将介绍一系列由浅入深的实战项目,旨在帮助初学者系统地学习并实践visionOS开发。这些项目不仅适合个人学习,也…

踩坑日记:线上接口超时问题排查

1.背景: 上线后,功能测试. 进入小程序页面发现很慢,耗时超过5秒,打开skywalking发现大量接口耗时都很高. 2.top命令 服务器top命令查看cpu资源发现占用并不高 3.mysql查看sql运行情况 # 当前运行的所有事务 select * from information_schema.innodb_trx; 1 | …

国内液压一体式潜孔钻机市场相对分散

根据研究团队调研统计&#xff0c;2023年全球液压一体式潜孔钻机市场销售额达到了52亿元&#xff0c;预计2030年将达到90亿元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为7.1%&#xff08;2024-2030&#xff09;。中国市场在过去几年变化较快&#xff0c;2023年市场…

计算机网络基础(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络基础 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 计算机网…

100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里&#xff0c;我们将制作一个范围魔法&#xff0c;释放魔法时&#xff0c;我们将在鼠标拾取位置绘制一个魔法光圈&#xff0c;用于显示技能释放时攻击的范围&#xff0c;然后再次点击可以释放技能。 创建贴花类 魔法范围标识的光圈&#xff0c;我们采用贴花实现&…

AI 代码工具大揭秘:提高编程效率的必备神器!

近年来&#xff0c;人工智能得到了迅猛的发展&#xff0c;并在各行各业都得到了广泛应用。尤其是近两年来&#xff0c;AI开发工具逐渐成为开发者们的新宠&#xff0c;其中GitHub Copilot更是引发了无限可能性的探索。在本文中&#xff0c;我将向大家介绍一些实用性较高的智能开…