3 个版本 (破坏性更新)
0.2.0 | 2022 年 12 月 27 日 |
---|---|
0.1.0 | 2022 年 12 月 24 日 |
0.0.0 | 2022 年 12 月 20 日 |
#439 在 游戏
83KB
1.5K SLoC
Genius Invokation TCG
这是一个简单的 crate,用于抽象 Genius Invokation TCG 的元素,这是来自原神的卡牌游戏。
用法
创建 Deck
您可以使用公共枚举创建 CharacterCard
和 ActionCard
(提示:所有动作卡子类型都实现了 Into<ActionCard>
)。从这些中,您可以将其转换为 Card
类型(这是两个主要类型的枚举包装器),并使用 from_iter
创建一个 Deck
。
当然,如果您已经恰好有 3 张角色卡和 30 张动作卡,您可以使用 from_exact
方法,这比迭代器方法更快,因为它跳过了分配,仅验证重要的属性(例如,没有重复的角色卡或没有匹配的角色卡的技能卡)。
或者,如果您已经在卡组构建网站上构建了一个卡组,您可以使用 deck-url 功能,这为您提供了访问 deck_from_url
函数的权限,该函数接收一个类似这样的 URL 字符串
https://genshin.hotgames.gg/tcg/deck-builder?deck=1.6.MC.MD.MF.MG.MH.MI.MJ.MK.ML.MM.MN.MO.MP.MV.MY.e.g8.gB.gD.gF.gb.ge.gh.gk.gt.gv.gx.gz.wj.wl.wm&ver=1&lang=en&author=DefaultDeck
该函数返回一个卡迭代器,然后您可以使用 from_iter
创建一个卡组。
提取信息
现在,假设您想分析大量卡组中的某些信息。假设您有一个包含所有卡组构建器 URL 的文件,逐行读取,您可以使用 include 或简单地 read to string,完成后,它就非常简单了
let iter = decks.lines()
.map(|url| Deck::from_iter(deck_from_url(url).unwrap()));
当然,这将产生结果,因此您也可以在您 100% 确保这些卡组都不无效的情况下展开它。
假设您想计算包含特定卡的卡组数量,例如,Strategize
,您可以简单地运行
iter.filter(|deck| deck.contains(NormalEventCard::Strategize.into())).count()
现在假设您只想查看同伴卡,也许您想计算它们并查看哪些是最突出的
iter.map(|deck| deck.iter().filter_map(|card| card.companion())).flatten()
您现在有一个 Iterator<Item=CompanionCard>
。请注意,这包括重复的卡片,所以如果玩家有两张相同的卡片,迭代器会两次产生那张卡片。如果您只想查看卡片的独特实例,请运行 deck.iter_unique()
。
当然,companion()
并不是唯一的方法,它只是 PlayingCard
特性中的所有辅助方法之一。
正在进行中!
到目前为止,我还需要弄清楚很多事情,比如
-
有一个将字符串和枚举变体之间进行转换的优雅实现。我可以手动匹配每个变体,但这既无聊又难以维护。
-
序列化实现,特别是如果 API 以后希望使用这个 crate。
-
弄清楚如何为所有内容编写文档。每次我尝试为像
CharacterCard
枚举这样的东西编写文档时,我总是看到自己在做重复的工作或试图解释游戏的工作方式,这两者都不是文档应该做的。 -
弄清楚是否应该包括“特殊”类型的卡片,这些卡片不能在牌组中。这包括深渊法师或希尔丘尔卡片,还包括青行灯的特殊卡片 雷电剑,它可以在游戏中成为你的手牌的一部分,但不能添加到你的实际牌组中。
-
也许包括一个
description
功能,为每张卡片添加描述方法?这会极大地增加 crate 的大小(因为它存储了大量的静态文本),但这可能是一个有用的功能。 -
将更多项目添加到此列表。