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

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容,请查看或订阅上面的专栏。

方块(Block) 是构成Minecraft世界的主要组成部分,是组成游戏地图的最基本单元,也是模组开发的核心元素之一。

与创建物品类似,方块同样也需要在游戏注册表中注册,也同样需要创建对应的模型文件、模型描述文件和方块纹理。方块的复杂程度要高于物品,因此方块需要创建更多的配置文件来完成方块各种功能的设置。如果是首次阅读到本文且没有Fabric模组开发基础,请先访问我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品;

在本章,我们将创建一个自定义方块——浓缩泥土(condensed_dirt)。文章将先以最简单方块的形式详细讲解创建方块的步骤,然后在最简单方块的基础上,拓展更多关于方块其他功能的配置方式。

通常,如果是首次创建方块,以最简单的方块为例,整个过程应当按照以下步骤推进:

  • 创建方块注册类;
  • 封装register()方法;
  • 注册方块并将其添加到指定物品组中;
  • 在语言文件中为方块添加翻译键值对;
  • 创建方块的模型文件、模型描述文件和方块纹理;
  • 创建方块状态定义文件;

此外还可以为方块:

  • 配置掉落物;
  • 配置挖掘工具。

创建方块注册类

对于简单的方块,我们可以直接将其在游戏注册表中注册。不过,在此之前可以提前封装Minecraft API中提供的Registry.register()方法,使注册过程更加简单。

一般,方块注册类中有三种内容:

  • register():封装了Registry.register()方法并用于注册方块的核心方法,将在下一小节详细讲解;
  • initialize():用于初始化方块注册类,需要在入口点类中调用;
  • 类型为Block的方块注册静态常量:用于注册自定义方块。

1.在com/example/test/utils目录中创建ModBlocks.java,作为方块注册类;

public class ModBlocks {}

2.声明静态方法register(),用于注册方块;

public static Block register(){}

下一小节将详细讲解方法体中的内容;

3.声明静态方法initialize(),用于初始化方块注册类;

public static void initialize(){Test.LOGGER.info("注册方块!");
}

其中可以输出日志信息;

4.在入口点类的onInitialize()方法中调用ModBlocks.initialize(),完成方块注册类的初始化;

@Override
public void onInitialize() {...ModBlocks.initialize();...
}

封装register()方法

根据Fabric官方文档所述,应当使用下面的写法封装Registry.register()方法,来简化注册方块的代码;

private static Block register(String name, Function<AbstractBlock.Settings, Block> blockFactory, AbstractBlock.Settings settings, boolean shouldRegisterItem) {// Create a registry key for the blockRegistryKey<Block> blockKey = RegistryKey.of(RegistryKeys.BLOCK, Identifier.of(FabricDocsReference.MOD_ID, name));// Create the block instanceBlock block = blockFactory.apply(settings.registryKey(blockKey));// Sometimes, you may not want to register an item for the block.// Eg: if it's a technical block like `minecraft:moving_piston` or `minecraft:end_gateway`if (shouldRegisterItem) {// Items need to be registered with a different type of registry key, but the ID can be the same.RegistryKey<Item> itemKey = RegistryKey.of(RegistryKeys.ITEM, Identifier.of(FabricDocsReference.MOD_ID, name));BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));Registry.register(Registries.ITEM, itemKey, blockItem);}return Registry.register(Registries.BLOCK, blockKey, block);
}

方法中需要传递四个参数:

  • String name:指定方块名,即标识符中的路径;
  • Function<AbstractBlock.Settings, Block> blockFactory:抽象方块设置内部类对象和方块对象的函数表达式,仅用于创建Block对象;
  • AbstractBlock.Settings settings:抽象方块设置内部类对象,可以用于配置方的属性;
  • boolean shouldRegisterItem:指定是否需要为方块注册方块物品,使其可以在创造模式物品栏中显示;

方法首先使用RegistryKey.of()方法获取方块注册键对象,其中按顺序传递了注册键为方块RegistryKeys.BLOCK和由模组Id和方块路径组成的Identifier标识符对象。然后通过RegistryKey<Block>注册键创建方块Block对象。至此,方块对象创建完毕;

接着,根据shouldRegisterItem变量的值,来确定是否需要注册方块对应的方块物品。如果需要注册,则再次使用RegistryKey.of()方法获取物品的注册键对象,其中按顺序传递了注册键为物品RegistryKeys.Item和由模组Id和方块路径组成的Identifier标识符对象。然后调用BlockItem类的构造方法来创建方块物品BlockItem对象,方法中按顺序传递了方块对象和物品注册键对象。最后调用Registry.register()方法将方块物品在游戏注册表中注册,方法中按顺序传递了注册键常量Registries.ITEM、方块物品注册键对象和方块物品对象;

如果不需要注册方块物品,则直接调用Registry.register()方法将方块在游戏注册表中注册,方法中按顺序传递了注册键常量Registries.BLOCK、方块注册键对象和方块对象。

关于IdentifierRegistry类的详细用法说明请参考我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品;关于RegistryKey.of()方法的详细用法说明请参考我的世界Java版1.21.4的Fabric模组开发教程(五)创建高级物品:盔甲。


方块类Block

Block类是Minecraft中所有方块的基类,定义了方块的核心行为和属性。通常,创建带有复杂自定义行为和属性的方块时,可以创建继承了Block类的自定义方块类。在游戏中,同一类型的方块共享同一个Block实例,例如,一个世界中的所有石头方块只共享一个石头方块实例,而不是为每一个石头方块都创建实例。创建方块对象后对应的方块物品对象不会自动创建,创建方块物品对象还需调用Registy.register()方法。

Block类中提供了许多方法,可以在涉及到方块的任何场景调用:

  • asItem():方法返回与方块对应的物品对象;

在后续章节中用到的方法将在此处补充。

抽象方块类AbstractBlock及其设置内部类AbstractBlock.Settings

AbstractBlock作为一个抽象类,定义了所有方块的基础属性和通用行为AbstractBlockBlock类的父类,但AbstractBlock不能直接继承自定义方块类。

方块的自定义属性由内部类AbstractBlock.Settings的实例控制,其构造方法已经被私有化,想要创建AbstractBlock.Settings的实例,只能调用其静态方法create(),直接返回一个内部类AbstractBlock.Settings的实例;

public static AbstractBlock.Settings create() {return new AbstractBlock.Settings();
}

AbstractBlock.Settings类中提供了许多方法来配置方块的属性,所有方法均支持链式编程,包括:

  • requiresTool():配置方块只能由工具采集;
  • sounds():配置方块与玩家交互的声音,通常传递一个BlockSoundGroup类中的静态常量;
  • hardness():指定方块硬度。参考值:橡木木板2.0f;

在后续章节中用到的方法将在此处补充。

方块物品类BlockItem

BlockItem类继承了Item类,用于将方块和物品关联起来,使得方块能够以物品的形式存在于玩家的背包、快捷栏或合成表中,并允许玩家在世界中通过方块物品来使用方块。

一般,调用其构造方法来创建BlockItem类的对象;

public BlockItem(Block block, Item.Settings settings) {super(settings);this.block = block;
}

其中需要传递两个参数:

  • Block block:指定要创建方块物品的方块对象;
  • Item.Settings settings:指定物品设置内部类对象,在注册时通常通过此参数传递注册键;关于内部类Item.Settings的详细用法说明,请参考我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品。

直接将register()方法体复制到方块注册类ModBlocks.javaregister()方法中,然后将访问修饰符改为private

注册方块并将其添加到指定物品组中

现在,我们将方块“浓缩泥土”在游戏注册表中注册,然后将其方块物品添加到物品组中。方块注册逻辑可以写在方块注册类ModBlocks.java中,但将方块物品添加到物品组的逻辑依然需要写在入口点类中。

1.在ModBlocks.java中声明静态常量CONDENSED_DIRT,类型为Block,并调用register()方法对其初始化;

public static final Block CONDENSED_DIRT = register("condensed_dirt",Block::new,AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS),true
);

按顺序依次设置了物品名为“condensed_dirt”、抽象方块设置内部类对象和方块对象的函数式Block::new、交互声音为BlockSoundGroup.GRASS并要求注册方块对应的方块物品。

2.在入口点类的onInitialize()方法中,将方块添加到指定物品组中;

ItemGroupEvents.modifyEntriesEvent(CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {...itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());...});

需要调用asItem()方法将方块转换为物品。

在语言文件中为方块添加翻译键值对

打开语言文件zh-cn.json,为方块添加中文翻译;

{..."item.test.condensed_dirt": "浓缩泥土",...
}

“condensed_dirt”为注册方块时使用的路径名。

创建方块的模型文件、模型描述文件和方块纹理

同物品一样,方块也需要创建模型文件、模型描述文件和对应的方块纹理。但是这些配置文件和物品的配置文件存放的位置不同。如果是首次创建自定义方块,可能需要创建新的目录。

1.在assets/test/models目录中创建block目录,用于存放方块的模型文件。在目录中创建condensed_dirt.json

{"parent": "minecraft:block/cube_all","textures": {"all": "test:block/condensed_dirt"}
}

此时我们使用的模型为block/cube_alltextures配置项中,需要添加all配置项,值为test:block/condensed_dirt,即“模组Id+:block/+标识符”,代表方块的所有面应用的纹理图位置;

2.在assets/test/items中创建condensed_dirt.json,代表方块的模型描述文件;

{"model": {"type": "minecraft:model","model": "test:block/condensed_dirt"}
}

此处与物品模型描述文件的写法大致相同;

3.在assets/test/textures目录中创建block目录,将方块纹理图移动到目录中;

在这里插入图片描述
图片大小为16*16,文件名为“condensed_dirt.png”,即方块路径名。不能使用其他格式的图片, 只能使用.png文件。

创建方块状态定义文件

方块状态定义用于指示游戏基于当前方块的状态要渲染哪个模型。目前,还不需要编程式的方块状态定义,只需要创建方块状态定义JSON文件即可。

“浓缩泥土”方块并没有复杂的状态,方块状态定义文件中只需要添加一条配置项;

assets/test目录中创建blockstates目录,用于存放方块的状态定义文件。在其中创建condensed_dirt.json,文件名应当与方块路径名相同;

{"variants": {"": {"model": "test:block/condensed_dirt"}}
}

其中的配置项包含:

  • "variants":设置变种与对应的模型,内部需要列出此方块的所有变种;
    • "":变种名。不含有方块属性的方块状态使用""作为变种名;
      • "model":指定模型文件的标识符;

其中有更多的配置项,将在后续章节详细讲解关于方块状态的知识。

启动游戏测试

现在,我们打开游戏测试一下“浓缩泥土”方块的各种功能。

1.启动游戏,打开创造模式物品栏,找到“浓缩泥土”;
在这里插入图片描述
可以看到方块物品已经成功注册,方块纹理和中文名称显示正常。将其添加到背包,然后主手持“浓缩泥土”,右键点击使用方块;
在这里插入图片描述
可以看到方块显示正常。

至此,一个最简单的方块已经创建完毕。如果想给方块添加更多自定义功能和属性,还请继续阅读下文。

添加方块的掉落物/战利品列表

现在,无论是在创造模式,还是生存模式,使用任何工具或徒手破坏方块都不会出现掉落物。我们可以为其添加掉落物,由于某些方块破坏后掉落的东西不止一种,方块的掉落物也称之为战利品列表

在开始前,确保你的项目已经启用数据生成(即使不使用数据生成类)。关于启用项目的数据生成说明,请参考我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品中的“为物品添加合成配方”小节。

data/test目录中创建loot_table目录,用于存放方块战利品列表JSON配置文件,在其中创建blocks文件夹,代表方块的掉落物/战利品列表JSON配置文件,然后继续在其中创建condensed_dirt.json,文件名与方块注册时使用的路径相同。
在这里插入图片描述
对于“浓缩泥土”方块,破坏方块时只需掉落其本身即可,其配置文件的写法应当如下:

{"type": "minecraft:block","pools": [{"rolls": 1,"entries": [{"type": "minecraft:item","name": "test:condensed_dirt"}],"conditions": [{"condition": "minecraft:survives_explosion"}]}]
}

其中的配置项包含:

  • "type":战利品上下文的参数集类型。指定了调用该战利品时要应用的上下文环境,用于验证其他配置项的合法性,当某些配置错误或缺失时,游戏日志中会打印警告信息;
  • "pools":战利品表的随机池的列表。主要定义了若干待选的抽取项;
    • "rolls":指定该随机池的抽取次数;
    • "entries":指定随机池中的抽取项。抽取项分为单一抽取项和复合抽取项,单一抽取项定义了单个物品生成行为,是随机池中最终要抽取的带权重的项目。如果不使用物品修饰器,物品数量默认为1。此处我们使用的是单一抽取项,下面给出类型为item的战利品池抽取项的数据格式:
      • "type""minecraft:item"
      • "name":物品的标识符;
    • "conditions":战利品表谓词列表。仅当满足列表中的所有条件时,该随机池才会被使用;
      • "condition":战利品表谓词,又称战利品表物品条件,用于在战利品表中制定战利品的产生条件。此处使用了"minecraft:survives_explosion",代表物品可以通过爆炸掉落;

启动游戏,在创造模式下将“浓缩泥土”放入背包,然后切换为生存模式,放置方块,然后破坏方块,可以看到掉落物。
请添加图片描述

配置推荐的挖掘工具

如果想限制挖掘方块的工具,可以继续添加配置文件。例如,这里我们令“浓缩泥土”只能由锹类工具挖掘时才会掉落。

data目录中创建minecraft文件夹,然后在其中依次创建tag/block/mineable目录,最后创建shovel.json
在这里插入图片描述
配置文件中的结构如下:

{"values": ["test:condensed_dirt"]
}

"values"配置项中直接提供方块的标识符。将“浓缩泥土”的标识符添加到文件中,代表只能使用锹挖掘方块才能获得掉落物,否则挖掘速度将很慢且没有掉落物;

shovel.json文件中存放推荐使用锹类工具破坏的方块的集合。此外,还有其他配置文件:

  • hoe.json:推荐使用锄类工具破坏;
  • axe.json:推荐使用斧类工具破坏;
  • pickaxe.json:推荐使用镐类工具破坏;

这些文件和Minecraft原生配置文件的文件名和文件位置相同,数据将会追加到原生配置文件中,而不是完全替换原生配置文件。

配置指定的工具等级

如果想限制挖掘方块所用工具的材质级别,可以继续添加配置文件。例如,这里我们令“浓缩泥土”只能由“铁锹”及以上的材料(钻石锹、下界合金锹)挖掘时才会掉落。

data/minecraft/tags/block目录中创建needs_diamond_tool.json,文件结构与文的shovel.json相同;

{"values": ["test:condensed_dirt"]
}

为了演示效果,我们调用hardness()方法为方块设置硬度,使其破坏需要一定时间。找到ModBlocks.java,修改register()方法中的参数;

public static final Block CONDENSED_DIRT = register("condensed_dirt",Block::new,AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS).requiresTool().hardness(2.5f),true
);

将硬度改为2.5。启动游戏,使用铁锹破坏方块;
请添加图片描述
可以看到掉落物。使用钻石锹或下界合金锹破坏方块也可以获得掉落物。

本章小结

本章详细阐述了创建一个自定义方块的步骤。本文篇幅较长,但难度一般,阅读本文要求开发者有创建物品的知识基础,才能理解文中的部分写法。感谢各位的阅读,有兴趣可以订阅此专栏!

相关文章:

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块(Block) 是构成Minecraft世界的主要组成部分&#xff0c;是组成游戏地图的最基本单元&#xff0c;也是模组开发的核心元素之一…...

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…...

C++ 命令模式:设计与实现详解

一、引言 在软件开发中,我们经常需要将“请求”或“操作”封装成对象,以便在不同的上下文环境中传递、存储、延迟执行或撤销。命令模式(Command Pattern)正是为解决这类问题而生的行为设计模式。本文将深入探讨 C++ 中命令模式的设计理念、实现方式及其应用场景。 二、命…...

系统思考:化繁为简的艺术

系统思考&#xff0c;其实是一门化繁为简的艺术。当我们能够把复杂的问题拆解成清晰的核心以及更加简单&#xff0c;从而提升团队的思考品质和行动品质&#xff0c;发挥最大的合力。 每个公司都想在某方面成为最优秀的&#xff0c;但是实际上具有穿透性的洞察力和摆脱虚荣心的清…...

java/mysql/ES下的日期类型分析

mysql的timestamp和datetime mysql的TIMESTAMP类型内部存的是unix时间戳&#xff0c;可认为是一个32位的整型&#xff0c;它记录了1970.1.1以来的秒数。因为存储长度4字节的限制&#xff0c;所以有2038年限制。 DATETIME类型内部存的是long型&#xff0c;记录了1000.1.1以来的…...

Angularjs-Hello

1 关于Angularjs 最近因为项目需要又要做这个&#xff0c;所以简单复习下。其实这个大概7&#xff0c;8年前就用过&#xff0c;当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度&#xff0c;本来以为早死在 沙滩上了&#xff0c;没想到现在还在坚…...

Python训练营---Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 …...

Linux 1.0.4

父子shell linux研究的就是shell 打开两个窗口就是两个shell 终端的软件有很多 bash也是一个软件 我们在terminal里面再打开一个bash&#xff0c;然后再次使用ps命令发现多出来一个bash&#xff0c;之后点击exit只是显示了一个exit&#xff0c;这个只是退出了在terminal中打开…...

Qt -下载Qt6与OpenCV

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 前言 呃啊&#xff0c;本来就想在 Qt 里简单几个 OpenVC 的函数&#xff0c;没想到一搞就是一天。 我之前的开发环境是 Qt 5.14.2&#xff0c;使用 MinGW 7.3.0 64-bit 编…...

机器学习无监督学习sklearn实战一:K-Means 算法聚类对葡萄酒数据集进行聚类分析和可视化( 主成分分析PCA特征降维)

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main/1-Wine%20cluster%20analysis 如果对于聚类算法理论不理解可参考这篇之前文章机器学习中无监督学习方法的聚类&#xff1a;划分式聚类、层次聚类、密度聚类&…...

可灵2.1 vs Veo 3:AI视频生成谁更胜一筹?

在Google发布Veo 3几天后,可灵显然感受到了压力,发布了即将推出的视频模型系列可灵 2.1的早期体验版。 据我了解,有三种不同的模式: 可灵 2.1 标准模式: 720p分辨率 仅支持图像转视频(生成更快,一致性更好) 5秒视频仍需20积分 可灵 2.1 专业模式: 1080p分辨率 仅在图…...

C语言之编译器集合

C语言有多种不同的编译器&#xff0c;以下是常见的编译工具及其特点&#xff1a; 一、主流C语言编译器 GCC&#xff08;GNU Compiler Collection&#xff09; 特点&#xff1a;开源、跨平台&#xff0c;支持多种语言&#xff08;C、C、Fortran 等&#xff09;。 使用场景&…...

计量表计的演进历程与技术变革:从机械到物联网时代

前言 近期在用python写一些关于计量表计数据集采模型。主要就是针对计量表计采集的相关数据&#xff0c;按照通讯协议格式进行解析&#xff0c;最后根据自己需求&#xff0c;编制界面进行数据的展示&#xff0c;存储&#xff0c;以及运算的内容。现在就个人关于计量表计的一点…...

更换Homebrew 源

以下是查看和修改 Homebrew 源的详细步骤&#xff0c;适用于需要切换到国内镜像以加速下载的场景&#xff1a; 1. 查看当前 Homebrew 源 # 查看 brew 主仓库地址 git -C "$(brew --repo)" remote get-url origin# 查看 homebrew-core 仓库地址 git -C "$(brew…...

人工智能在智能供应链中的创新应用与未来趋势

随着全球化的加速和市场竞争的加剧&#xff0c;供应链管理的复杂性和重要性日益凸显。传统的供应链管理面临着诸多挑战&#xff0c;如需求预测不准确、库存管理效率低下、物流配送延迟等。智能供应链通过引入人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#x…...

鸿蒙OSUniApp自定义手势识别与操作控制实践#三方框架 #Uniapp

UniApp自定义手势识别与操作控制实践 引言 在移动应用开发中&#xff0c;手势交互已经成为提升用户体验的重要组成部分。本文将深入探讨如何在UniApp框架中实现自定义手势识别与操作控制&#xff0c;通过实际案例帮助开发者掌握这一关键技术。我们将以一个图片查看器为例&…...

LLM优化技术——Paged Attention

在Transformer decoding的过程中&#xff0c;需要存储过去tokens的所有Keys和Values&#xff0c;以完成self attention的计算&#xff0c;称之为KV cache。 &#xff08;1&#xff09;KV cache的大小 可以计算存储KV cache所需的内存大小&#xff1a; batch * layers * kv-he…...

推荐几个不错的AI入门学习视频

引言&#xff1a;昨天推荐了几本AI入门书&#xff08;AI入门书&#xff09;&#xff0c;反响还不错。今天&#xff0c;我再推荐几个不错的AI学习视频&#xff0c;希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的&#xff0c;也有免费的。我今天只推荐免费的。 我们按…...

采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更

一、引言 在信息爆炸的时代&#xff0c;作为科技领域的内容创作者&#xff0c;我每天都要花费2-3小时手动收集行业新闻、撰写摘要并发布到各个社群。直到我发现Bright Datan8nAI这套"黄金组合"&#xff0c;才真正实现了从"人工搬运"到"智能自动化&qu…...

Real SQL Programming

目录 SQL in Real Programs Options Stored Procedures Advantages of Stored Procedures Parameters in PSM SQL in Real Programs We have seen only how SQL is used at the generic query interface --- an environment where we sit at a terminal and ask queries …...

Sentinel限流熔断机制实战

1、核心概念 1.1、流量控制 流量控制是为了 防止系统被过多的请求压垮&#xff0c;确保资源合理分配并保持服务的可用性&#xff0c;比如对请求数量的限制。 流量控制的 3 个主要优势&#xff1a; 防止过载&#xff1a;当瞬间涌入的请求量超出系统处理能力时&#xff0c;会…...

Java 数据处理 - 数值转不同进制的字符串(数值转十进制字符串、数值转二进制字符串、数值转八进制字符串、数值转十六进制字符串)

一、数值转十进制字符串 调用 String.valueOf() int num 123;String decStr String.valueOf(num);System.out.println(decStr);# 输出结果123调用 Integer.toString()&#xff0c;指定进制 int num 123;String decStr Integer.toString(num);System.out.println(decStr)…...

79. 单词搜索-极致优化,可行性剪枝和顺序剪枝

给你一个目标字符串&#xff0c;和一个二维字符数组&#xff0c;判断在数组中是否能找到目标字符串。 例如&#xff0c;board [["A","B","C","E"],["S","F","C","S"],["A","…...

ICDMC 2025:创新媒体模式,迎接数字时代的挑战

2025年数字媒体与通讯国际会议将在风景秀丽的中国山东举行。此次会议致力于促进数字媒体和通讯领域的国际合作与交流&#xff0c;为相关产业发展提供智力支持和技术引领。我们诚挚邀请来自世界各地的学者、研究人员和行业专家参加本次会议&#xff0c;共同探讨前沿问题和发展方…...

深入解析C#多态性:基类引用、虚方法与覆写机制

基类引用的本质 在C#面向对象编程中&#xff0c;派生类对象由基类部分和扩展部分组成。通过基类引用访问派生类对象时&#xff0c;实际是在进行「观察视角」的转换&#xff1a; MyDerivedClass derived new MyDerivedClass(); MyBaseClass mybc (MyBaseClass)derived; //…...

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!

摘要&#xff1a;人类的认知通常涉及通过抽象、灵活的概念进行思考&#xff0c;而不是严格依赖离散的语言符号。然而&#xff0c;当前的推理模型受到人类语言边界的限制&#xff0c;只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…...

C++中 newdelete 与 mallocfree 的异同详解

C中 new/delete 与 malloc/free 的异同详解 在 C 开发中&#xff0c;动态内存管理是重中之重&#xff01;new/delete 和 malloc/free 都是用来动态申请和释放内存的&#xff0c;但它们有本质的区别。今天我们就来彻底搞懂它们的区别&#xff0c;避免内存泄漏和 undefined beha…...

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册 晨控CK-UR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕…...

STM32入门教程——LED闪烁LED流水灯蜂鸣器

前言 本教材基于B站江协科技课程整理&#xff0c;适合有C语言基础、刚接触STM32的新手。它梳理了STM32核心知识点&#xff0c;帮助大家把C语言知识应用到STM32开发中&#xff0c;更高效地开启STM32学习之旅。 一、硬件电路搭建与工程配置 电路连接要点 LED 闪烁 / 流水灯&…...

鸿蒙OSUniApp 实现的数据可视化图表组件#三方框架 #Uniapp

UniApp 实现的数据可视化图表组件 前言 在移动互联网时代&#xff0c;数据可视化已成为产品展示和决策分析的重要手段。无论是运营后台、健康监测、还是电商分析&#xff0c;图表组件都能让数据一目了然。UniApp 作为一款优秀的跨平台开发框架&#xff0c;支持在鸿蒙&#xf…...