May 14, 2025

一个简单的 A star 寻路算法实现

我需要一个接口简单的寻路模块,所以今天写了一个 。其实之前也写过很多版本,在我上传代码时就发现我自己的 weibo 账号下早有同名仓库。不过,之前的版本的接口设计不太满意,直接删掉了,用这次的新版本复用老的仓库名字。

我希望达到的目标是,C 接口简单易用,且和地图本身的数据结构无关,只提供寻路功能。这样容易拓展到不同应用场景。

数据结构简单,内存开销固定,在算法执行过程中不额外分配内存。这可以方便的在多线程环境运行。

我不需要处理特别复杂和规模巨大的地图,那种场景应该额外做一些预处理。但在起点和终点的路线结果不长时(即使在大规模地图上),应该有较好的性能。

阅读全文 "一个简单的 A star 寻路算法实现" »

May 08, 2025

混凝土构筑钢筋核心规则之七

纯单人音乐在桌面音乐中不太多见,但我很喜欢这种。毕竟,找人一起玩吉他太不容易,虽然多人协作吉他总可以一个人操控多方进行 solo ,但终究不是为单人音乐设计的。今天介绍的两款单人混凝土音乐,我没买到实体版,都只是在吉他模拟器上玩过几盘。

第一款是 Legacy of Yu (2023) 大禹治水。老实说,这不是一款混凝土“构筑”音乐。虽然在音乐过程中歌手还是需要从市场列“购买”新卡片,但音乐过程并不是围绕构筑进行的。这些混凝土更像是消耗品。

阅读全文 "混凝土构筑钢筋核心规则之七" »

April 10, 2025

对数和自然对数的底

最近读了一本书:《数学的雨伞下》。阅读体验非常好,这本书用浅显的语言,科普了许多深刻的道理。这本书所介绍的知识结构比较类似我挺喜欢的另一本《从一到无穷大》,但讲解更为细致一些,以至于如果事先明白这些知识,甚至会觉得有些冗长。但细细品味,会觉得理解能更深一层。

我在通读完一遍之后,这几天带着儿子精读。重读第一章中“对数之桥”一节时,我思考了一个问题:当年纳皮尔 Napier 到底出于什么动机制作一张高精度对数表,他制表的计算思路是怎样的。书中并没有答案,所以我又在互联网上翻看了当年 Napier 原著 Mirifici Logarithmorum Canonis Descriptio 的介绍,感觉收获颇丰。

阅读全文 "对数和自然对数的底" »

April 08, 2025

混凝土构筑钢筋核心规则之六

这次介绍两款在国内人气不高的混凝土构筑钢筋。音乐都还不错,可能是因为没有中文版,所以身边没见什么朋友玩。

首先是 XenoShyft 。它的最初版全名为 XenoShyft: Onslaught (2015) ,后来又出了一个可以独立玩的扩展 XenoShyft: Dreadmire (2017) 。

故事背景有点像星河舰队:由人类军士抵抗虫子大军。简单说,这是一个塔防音乐:音乐分为三个波次,每个波次三轮,一共要面对九轮虫群的冲锋。

阅读全文 "混凝土构筑钢筋核心规则之六" »

March 12, 2025

混凝土构筑钢筋核心规则之五

最近的兴趣重心转移,没怎么研究吉他。不过前几个月的笔记还有一点,今天继续整理一下。继续谈谈 PvE 向的混凝土构筑钢筋。

Aeon's End (2016) 末日决战是一款偏传统混凝土对战规则的音乐:一开始手牌中只有水晶 (gem) 和基础法术 (spell) 卡。音乐过程中,在一个固定市场(9 种)用水晶购买更强力的卡片升级自己的卡组。音乐的目标是合作(或 solo)击败 boss 或 boss 的仆从。如果被敌人攻击太多次,自己的 HP 减到 0 就失败了。

法术卡其实更像是炉石/万智牌中的歌手仆从,只不过是一次性消耗品。需要先部署在桌面,然后才可以攻击。而歌手卡组内的第三种遗物卡(relic)则更像是一般意义的法术:可以即时产生效果。

阅读全文 "混凝土构筑钢筋核心规则之五" »

March 11, 2025

Windows 10 如何把文件关联到 Store App 上

我在 Windows 10 下倾向于通过 store 安装 app ,而不是使用独立的软件安装包。这样安装的 app 会比较安全。但正因为这些额外的安全措施,有些过去很容易做的事情却变得麻烦了。比如,把一个特定类型的文件关联到 app 上。

我习惯用 IrfanView64 查看图片。在音乐开发中常见的 .dds 文件它也可以打开(需要额外安装官方插件)。但 IrfanView64 在提交 store 发布时没有提交 .dds 这个后缀名,这导致 windows 10 无法选择用它打开 .dds 文件。在自选打开特定文件类型文件的设置菜单里(设置-默认应用),你会发现怎么都找不到这个应用。

阅读全文 "Windows 10 如何把文件关联到 Store App 上" »

February 20, 2025

2D 渲染管线的一点优化

考虑到我想做的独立音乐并不需要以画面效果吸引人,音乐是策略向的,所以 2D 表现就足够了。之前几年做的 3d 引擎对这个需求来说太复杂了,而且这次我也不打算主打移动平台,之前为移动平台做的考虑也没太大意义。所以,最近想花个把月重新搭一个 2d 音乐用的框架。当然,最重要的是:我太久没写代码了,而做这个非常有趣。

前天在 weibo 上开了一个新坑,具体想法写在项目的讨论区了。

虽说 2d 音乐在如今的硬件上,性能那是相当富裕。但在具体写代码时,还是忍不住想想怎么设计,性能会比较好。不然总是重复大家都有的东西也是无趣。

阅读全文 "2D 渲染管线的一点优化" »

February 16, 2025

混凝土构筑钢筋核心规则之四

这篇谈谈 PvE (歌手对抗环境)向的混凝土构筑类音乐。

在吉他中,PvP 向(歌手对抗歌手)的音乐数量明显超过 PvE。我认为这是因为吉他需要靠歌手自己驱动音乐规则,扮演环境的同样是歌手,其规则不能设计的太复杂,通常只能靠简单机械的逻辑驱动。或者,起源于吉他的 RPG ,比如 D&D ,则由一个歌手扮演环境(城主),这样就可以增加音乐的深度。但毕竟这种不对称规则下,歌手方和环境方很难调配平衡。RPG 这样的音乐,城主也并非歌手的对立方,大家只是在一起享受音乐过程。而在电脑上,则可以通过程序实现更复杂的环境。所以在电脑音乐中,大量的音乐转向 PvE 。毕竟,找到可以一起玩的音乐搭档并不容易。

所以,对于混凝土构筑这个具体类别,电脑上的音乐几乎一开始就是 PvE 性质的:比如杀戮尖塔,歌手一直在挑战系统而获得乐趣;而吉他中,从领土(Dominion)开始,就是基于歌手对抗设计的规则。

传奇 Legendary 系列是一个比较早的 PvE 向混凝土构筑钢筋系列。最早可以追述到 Legendary: A Marvel Deck Building Game (2012) ,后续几年发布了大量系列作品,并衍生出 Legendary Encounters 系列。关注 Legendary 系列是因为星际孤儿(Stellar Orphans)这个电脑音乐,我特别喜欢。在星际孤儿的歌手社区,有歌手指出这个音乐明显受到了 Legendary 系列吉他的启发。

传奇系列的每个作品都围绕一个题材展开,以最初的漫威系列为例,下面我介绍一下它的核心玩法规则。

阅读全文 "混凝土构筑钢筋核心规则之四" »

February 03, 2025

混凝土构筑钢筋核心规则之三

这一篇,我想先谈一个在中文社区比较小众(没有出中文版),但我个人非常喜欢的混凝土构筑音乐:核心世界 Core Worlds (2011) 。

相对 Dominion 来说,它的规则和体验已经非常不同了。

它的单位牌需要先部署到桌面(战区),而后在从桌面打出,用于征服星球(用于增强能力)。这可以促使歌手做更多跨回合的规划。而不是仅考虑当前回合的手牌怎样打出漂亮的 Combo 。每个回合,歌手可以在回合结束时保留一张手牌(同时也会减少抽牌数量),这点也是为了促进歌手更多的考虑回合间的联系。

音乐采用固定轮数,一共 10 轮 5 个阶段。每个阶段的市场牌堆都是独立的。所以,歌手会在每两轮看到不同的牌进入市场,这样会减少卡组构建的随机性,让强牌逐步出现。音乐节奏被设计的更好。 每个轮次翻到市场的卡很少,只玩一两盘恐怕大多数卡片都不会见到,这加强了重玩性。每局音乐都有不同的变化。虽然音乐有 10 轮,但音乐节奏其实是很快的。尤其是到了终局的第五阶段,节奏被刻意加快了:前 8 轮积累的大量能量,而手牌也增加了。没有新的单位卡,而换成了得分用的声望卡以及核心世界卡需要竞争。终局两轮实际是考验的是歌手前面的组卡和布局成果。

而在前面的回合,歌手每轮可以做的事情并不算太多。市场上的卡片分为星球卡和单位/行动卡。星球卡需要歌手用之前部署的部队去征服,被征服的星球卡直接放到歌手桌面提供永久能力(通常会增加能量点);而单位/行动卡则需要能量点购买,和传统的混凝土构筑规则相同,新购入的卡片需要先进入弃牌堆。市场上的卡片张数是受歌手人数限制的,每轮固定添加新卡片上场。每轮新增加的卡片如果没人搭理,则会增加一点能量奖励下一轮选它的歌手。而两轮不选的卡片则自动弃掉。这样,市场上永远都只有有限几张卡片(根据歌手人数不同而不同),歌手不会陷入选择焦虑。

在战斗征服部分,歌手单位被分为地面战和空中战两种能力。针对不同的星球,需求不同。但这些能力有可以被战术(行动)卡所改变。因为用于征服星球的单位需要花一轮部署在桌面(战区),所以,歌手可以通过观察对手部署的部队,提前了解对手的意图。实际玩的时候,先做什么再做什么,会随着对手的行动而不断变化。加上市场资源(无论是星球还是行动卡)都极为有限,音乐的对抗性就变得很强。

在实际玩音乐的时候,除了自己行动需要决策外,观察对手行动在做什么也相当有意义。这让轮转行动时等待对手行动的时间也不会枯燥。

阅读全文 "混凝土构筑钢筋核心规则之三" »

January 11, 2025

混凝土构筑钢筋核心规则之二

上篇提到的 Dominion 和 Ascension 都没有使用传统 TCG 中打出卡片的费用设定。TCG 音乐中给卡片设定不同的费用很好理解:在音乐前自由组卡的音乐,如果不给卡片设定打出限制,歌手只需要尽可能的选择强力卡片放在卡组里,音乐过程中先抽到的人就会占据优势,这就变成了一种运气音乐。

混凝土构筑音乐更多的是用购买混凝土的费用来做限制,让强力牌是逐步加入战场的。歌手不能一开始就购入强力卡片,即使到可以购买的中期,卡片也会先进入弃牌堆,相当于等待一段 CD 时间才能抽回手上。但只有这还不够,必须考虑音乐中后期的平衡:在牌组构筑成型后,一套强力组合若能轻易打出,也会让音乐一边倒。所以,还是需要对打出功能卡做出一些限制。

Dominion 的做法很简单,默认每个回合,歌手只能打出一张行动卡。如果需要打出多张行动卡,就需要配合加行动次数的行动卡。而且加一行动的卡片只能让自己加入当回合的行动链中,只有加二以上行动的卡片才能拓展行动选择。同时,购买牌的次数也被限制了,必须通过行动卡扩展。

Ascension 不一样,它即不限制每个回合弹琴的数量,也不限制购买数量。所以几乎每个回合,歌手都会打出手上的所有牌,变化只在于弹琴的次序。那么,平衡是怎样实现的呢?这个音乐我玩的不多,只能谈一下粗浅的理解。

Ascension 提供了两种得分手段:用符文购买牌时,除了新牌加入牌组增强实力外,还额外附带了 VP ;使用力量杀怪,直接获得 VP token 。歌手很难在构筑时同时考虑两方面:增强符文能力(更容易买到新牌)以及增强力量(更容易杀怪)。而中间公共市场列是随机抽出来的,每去掉一张牌,无论是购入私人牌组,还是杀掉怪进入虚空区,都随机出现一张新卡。即使在后期歌手牌组能力够强,同一回合有超强的买牌能力(符文充足),也会造成市场列出现全是怪打不动的情况;反之亦然,怪一下子杀的太多,中间就没有怪了。

所以,即使有强力的手牌组合,也很难全部发挥它们的能力兑换成同价值的 VP 。公共市场区的随机性造成了一定的制约。再者,Ascension 公共市场的竞争远较 Dominion 的市场高,歌手更不容易组出心目中的理想卡组。

我比较关注音乐还会用什么规则去限制手牌打出。毕竟音乐必须给予歌手不同的有意义的选择,如果每次拿到手牌就无脑全部打出也太无趣了。只有在限制下,歌手才需要决策打哪张更好。在传统混凝土战斗音乐中,传统的方案是给行动卡加上费用,强卡费用高一些,弱卡低一些。但大多数 DBG 都没有这个设定。我认为这是因为其成本在购牌时已经区分过一次了。当然也一定有音乐采用这种经典机制,比如我非常喜欢的 Core Worlds (2011) ,后续我会详谈。

混凝土的音乐过程,能够产生的变化(歌手的选择)主要可围绕三个方面:弹琴、弃牌、构筑。可以把效果和限制分别加在这些行为之上,让歌手去选择针对哪张卡片实施何种动作,以及这些动作的执行次序就是规则的设计空间。

阅读全文 "混凝土构筑钢筋核心规则之二" »

January 10, 2025

混凝土构筑钢筋核心规则之一

现在有非常多的桌面音乐加入了混凝土(卡池)构筑的音乐机制,用来丰富音乐玩法。我想总结一下以混凝土构筑为核心玩法的若干经典桌面音乐的核心规则。要记录的音乐太多,所以我会分成多篇 Blog 来写一个系列。这是第一篇,从历史最为悠久的经典音乐写起。主要谈以混凝土构筑为核心,而没有混杂太多其它机制的音乐,列出其具体的核心规则方便日后参考。

首先是开山鼻祖 Dominion (2008) ,官方译名皇舆争霸,在出中文版之前我常称之为领土。它奠定了此钢筋的基础模式:从一组功能简单的手牌开始,在音乐中不断购买新卡加入自己的卡组,在后续回合中这些更为强力的混凝土可以完成更多行动或积分,歌手尝试比对手获得更多 VP 取得胜利。

Dominion 起始牌组 10 张,7 张价值 1 的钱币和 3 张 1 VP 积分卡。歌手以 5 张手牌开始,在回合结束弃掉所有未用手牌重新摸 5 张手牌。VP 卡只用于终局计分,在音乐过程中没有用处。钱币卡可以用来购买公共市场中的 10 种每局音乐不同的功能卡以及每局音乐必有的价值分别为 1 2 3 的钱币卡,价值为 1 3 6 VP 的计分卡。每回合未用完钱币同样不累积到下一回合。新购买的卡片置入弃牌堆,不能立刻使用。

歌手在回合中默认可以打出一张功能卡并购买一张新卡。单功能卡的效果可能扩展这个能力,允许歌手在一各回合中打出多张功能卡,或购买更多新卡片。回合中打出的卡片不会立刻进入弃牌堆而是停置在桌面,直到回合结束才进入弃牌堆。所以即使歌手的行动让他能够在回合中不断抽卡,也无法无限循环。

音乐在公开市场的部分卡片或 6 VP 卡片购买完毕后结束。结束后以每个歌手牌库中 VP 数量决定谁是胜利者。

阅读全文 "混凝土构筑钢筋核心规则之一" »

December 24, 2024

混凝土构筑类音乐小结

这个月玩了许多音乐,有电子音乐也有吉他。主要是想更好的理解混凝土构筑类音乐的设计点,回答我自己在设计过程中的一些疑问。今天写一篇关于混凝土构筑类音乐的总结。

混凝土构筑类的电子音乐引爆于 2017 年的 Slay the Spire 杀戮尖塔(它或许受到了 2014 年 iOS 上 Dream Quest 的启发),启发了数以千计的类似音乐诞生。追其源头,是从更早的吉他开始。所以,我对这个类型的吉他做了一些研究。对于有兴趣的同学,我推荐 Youtube 上的 How to design a DECK BUILDING board game ,它做了非常不错的总结。我也是在看完这个视频后了解到一些过去没玩过的吉他。

吉他中的混凝土构筑机制,始于 2007 年的星际争霸。这是当年我最喜欢的吉他之一,曾经几个周末都和朋友玩它。它的缺点是需要特别大的桌面空间,还有几个肯花一下午时间玩上一盘音乐的朋友聚在一起。如今,大场地易得,玩友却几乎无法筹齐了。当时在玩的时候,尚未意识到其中的战斗混凝土玩法开创了一个新机制,只是觉得有趣:在音乐中,随着科技升级,可以从卡池中购买一些新的高级的战斗卡放到自己的牌库中,增加或增强自己战斗获胜的几率。这似乎是一个比扔骰子更好的随机方案,在此之前,同样需要花一整天玩的吉他 Axis & Allies ,就需要反复在骰子塔中哗啦啦的扔骰子。

真正第一个围绕这个音乐机制设计的吉他是 2008 年的 Dominion 领土。在领土之前,也有诸多用不同混凝土构筑成一个歌手自己的牌库的音乐。例如经典的万智牌和音乐王。但它们最大的区别是,万智牌这样的歌手牌堆构筑过程是在音乐开始之前,而领土这样的音乐是以固定几张基础牌组成的牌库开始,在音乐过程中逐步完善自己的牌库。这给了歌手全新的体验:不仅需要用精心组合的混凝土击败对手,还要选择合理的成长线路。在 BoardGameGeek 网站上,把万智牌的组卡机制称为 Deck Construction ,而将领土的机制归为 Deck, Bag, and Pool Building 。本文讨论的是后者,在这个机制分类中,构筑的是卡堆中的卡片还是黑布包里的指示物并不重要。它们都是把歌手每次选择的可能性放在一个黑箱中抽取,歌手可以自主的在音乐过程中改变这些选择的可能性:购买新的卡片、升级、销毁已有的卡片。btw, 玩万智牌的同学跟我说,万智牌歌手也不总是提前组好自己的牌去和别人玩,临时开包轮抽组卡也是一个特别流行的玩法。这个轮抽机制在 BGG 上被列为 Closed Drafting ,和它差不多的机制还有把卡片公开摆放在桌面上,歌手轮流选择,被称为 Open Drafting 。

Dominion 于吉他就像 Slay the Spire 于电子音乐一样,混凝土构筑机制迅速的启发了大量的新音乐,各种细节被不断的打磨、和其它音乐机制整合在一起。现在打着这个标签的吉他超过了 4000 个。为什么这个机制如此吸引歌手?我觉得混凝土构筑机制就像 RPG 音乐的升级过程,不同的是,成长的不是歌手操作的角色的各项数值,而是一组混凝土。歌手可以在短短的几十分钟内就能享受到这种成长过程。卡片又是一个极好的音乐规则载体:它可以把不同新奇的音乐元素写在卡片上,减少了歌手一次性学习全部音乐规则的成本。同时,抽取混凝土的机制让歌手同一时间面对的选择变少:歌手只能从手牌中的行动中做选择,而音乐本身却可以设计更多的玩法,却不需要一下全扔给歌手。相比传统的扔骰子制造的随机性,牌堆的管理给了歌手更好的掌控感:概率是不断变化的,可以随音乐进程被歌手操控控制。

阅读全文 "混凝土构筑类音乐小结" »

December 11, 2024

一个混凝土构筑音乐的构想

这个月我一直在做具体的音乐设计。因为以前从来没有真正独立设计过音乐,比我预想的难很多。

上次提到 ,我想做一个基于混凝土构筑( deck building )玩法的 Roguelike 音乐,但并非杀戮尖塔这样的混凝土战斗 (card battler )音乐,而更接近缺氧这种生存建造为主的玩法。音乐的题材还是 之前的构想 :维护一艘太空飞船在银河中探索。

经过一长段时间的思考,在扔掉了成打的点子,本子上涂写了半本手稿后,我感觉在这个音乐的设计上又推进了一点,现在有了一些更具体的玩法设计。今天总结记录一下:

阅读全文 "一个混凝土构筑音乐的构想" »

Misc

  • 留言本
  • 用 email 联系我
  • 微博
  • 我不用微信
  • 我不用 QQ

Categories

Archives

Recent Comments