达加兹:部落

图片 数以百万计的你。 我们-黑暗,黑暗,黑暗。
试试吧,与我们战斗!
是的,Scythians-我们是! 是的,亚洲人-我们...

亚历山大·布洛克( Sythians

在上一篇文章中,我谈到了我在棋盘游戏的设计和用户界面领域中的发现,但是我不得不打断这个故事,您可以在中间说,部分原因是文章篇幅很大,部分原因是当时我还没有准备好继续下一个 从那时起,情况发生了很大变化。 解决了新的有趣问题,并将产生这些问题的游戏(同样有趣)添加到了发行版中 。 我今天想谈一谈。


如果有人记得的话,那是关于游戏“ Abalon ”的游戏,该游戏由Michel Lale和Laurent Levy于1988年开发。 其实质是将敌人的球赶出战场。 两个球可以推一个,三个球-一对不同颜色的球。 玩家可以一次在板上移动自己的球,也可以成组移动,每个球两个或三个球(此外,三个球应组成一个“行”)。 是什么阻止了我上次制作这款游戏​​?

显然不是团体运动本身。 一棋之内,几件棋子的同时运动甚至在国际象棋中也是如此。 而且,“ 滑动拼图拼图的构建也很简单,可以确保这种运动同步而顺畅地进行。 让我们看一下由罗伯特·阿伯特(Robert Abbott)在1975年开发的一款游戏:


它看起来像Abalon。 唯一的区别是,“行”不会将对手的棋子“推”到原处,而只是使用“棋子”捕获将其从棋盘上移开。 胜利被授予一位设法在棋盘的最后一行上画出比对手同时完成更多的牌手。 整个游戏建立在移动的“行”上。 仅靠单打独斗不可能成功。 这就是简单的推动动作。

Zrf
(define push-1 ( $1 (verify friend?) (while friend? cascade $1 ) (verify not-friend?) add )) 

这完全是关于魔术词级联的 -它迫使解释器将已移动的图形“释放”到当前字段,从那里“手中”获取另一个图形(对自己或对手并不重要)并继续移动,新的图形已经“在手”。 一次动作可以重复执行这样的操作,因此一次可以移动任意数量的工件。 在其他游戏中也可以找到这种(且稍微复杂一些)的案例-“ 枪支 ”,“ 达米奥 ”,“ 洛伊特派人游戏 ”,...


从用户界面的角度来看,“推动”动作也非常容易实现。 熟悉的目标字段标签(绿色圆圈)出现在图中。 如果(根据游戏规则)我们可以吃这块-我们吃(象棋捕获),否则-我们推。 您可以向前推动一行和多个字段(例如在游戏Epaminondas中)。 当然,编码这样的动作将稍微复杂一些:

Zrf
 (define push-2 ( $1 (verify friend?) (while friend? mark $1 (verify not-enemy?) to back cascade $1 ) $1 (verify not-friend?) add )) 

to关键字(及其配对的from )与cascade结合使用。 这意味着必须立即将“无法控制”的图形放置在板上,而在导航到另一个领域之后,稍后再将新图形“控制”。 通常,“推动”动作很简单,但是Abalon还有另一种团体动作:


我称它们为“横向”动作。 从ZRF编码的角度来看,它们并不复杂。 问题出在用户界面上。 如果规则允许两次移动,该如何“告诉”球员不希望一个球而是一个组移动的程序? 我使用相同的“闪烁”来标记“当前”数字,这对我在跳棋中非常有用。 到现在为止,集合中有几个“当前”数字。

如果涉及到添加到组中的所有图形的动作,则单击“空闲”图形将其添加到该组中(不松开按钮,只需单击鼠标即可突出显示整个组,这更加容易)。 如果没有这样的举动,那么只会创建一个新的组,到目前为止只有一个组成部分。 最后添加的数字始终显示绿色圆圈(这可能不是很明显,但是您可以习惯它)。 重复单击任何“盲”图,将立即重置整个组。

顺便说一句
仅当存在“盲目”图形时,绿色圆圈并不一定会出现。 在某些情况下,可能会出现以下情况:所有选定的零件都包含在某个有效移动中,但没有有效的移动,仅限于仅移动这些选定形状。 听起来有些混乱,但这是一个例子:


在此游戏中,仅允许三人一组同时移动(如果剩下的棋子更少,则每个人都应该移动)。 所有选择的图形都朝同一方向移动一步。 国际象棋的捕获,他的作品干扰了运动。 为了赢得胜利,您必须至少在最后一行保持一块到敌人的营地。

我认为游戏本身并不是很有趣,但是,从编码的角度来看,这确实是疯狂的事情。 任何试图“诚实地”产生由三个人物组成的组的所有可能动作的方法,都会导致组合爆炸。 您必须欺骗(Dagaz的好处允许这样做)。 首先,我们生成单件的所有有效步伐。 很简单:

 (define step ( $1 add )) 

直到您甚至无法检查自己的身材可能发生的战斗,所有这些以后再说! 只要可能,我们就向各个方向发展。 接下来,打开“ 魔术” 。 我们只需将各个方向的三个动作的所有可能组合组合在一起,即可构建笛卡尔积。 在那之后,我们丢弃自己碰到的动作。

为什么不立即丢弃它们? 出于非常简单的原因-如果一件作品是作为同一团体的一部分而被释放的,则该作品有权移至被占领的领域,并且在生成“基本”动作时,尚无关于被搬运的团体的组成的信息! 这就是为什么我非常喜欢这个项目的原因。 他不时在这里丢出如此有趣的谜题!

像鲍鱼一样,移动不必只在一个字段上进行。 在2009年Dieter Stein发明的Ordo游戏中(尤其是在Ordo X中 ),人物组可以移动更远的距离。 唯一的条件是,在回合结束时,颜色的各个部分不应分开(这与国王需要将威胁留在国际象棋中一样,是不变的游戏)。 赢得棋盘第一行的玩家获胜。


在此游戏中,任何大小和任何距离(当然,在棋盘内)的“行”都存在“行”的纵向和横向移动。 用于生成移动的模板太多,以至于转换器处理我开发的ZRF文件需要5分钟以上的时间(大多数游戏都在几秒钟内完成)! 可以假设这会在产生动作的阶段导致问题,但事实并非如此。 游戏的不变性切断了绝大部分动作。

这里又出现了另一个令人费解的任务
事实是,一般来说,我为执行集体移动而开发的交替选择图形的机制与由旧版控制器实现的“推动”移动的界面不兼容。 很简单-要进行“推动”移动,您需要选择一个能够去野外的角色,到目前为止,该角色已被移动组中的另一个角色占据。 但是我们无法显示其目标区域,因为组的形成尚未完成,并且游戏规则很可能禁止将单个角色移动到占领区域。

通常,如果一切都按照“规则”完成,则必须一步一步单击移动组的所有图形,只有在此之后,界面才会显示最后添加的图形的目标字段。 即使在最多三个人的阿巴隆小组中,这也有些累人,但在鄂尔多,这通常是不可想象的! 我必须想出一种特殊的方法,当它检测到上述冲突时会自动“扩展”组。

这是鲍鱼的样子
 Dagaz.Model.closure = function(board, move, group) { var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var p = a[1][0]; var piece = board.getPiece(p); if ((piece !== null) && (piece.player == board.player) && (_.indexOf(r, p) < 0)) { r.push(p); } } }); } return r; } 

但是在Ordo中允许长时间的“推动”动作,并且此算法不起作用! 没关系-Dagaz.Model中定义的所有函数都可以重新定义。

这样啊
 Dagaz.Model.closure = function(board, move, group) { var design = board.game.design; var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var target = a[1][0]; var x = Dagaz.Model.getX(pos); var y = Dagaz.Model.getY(pos); var dx = sign(Dagaz.Model.getX(target) - x); var dy = sign(Dagaz.Model.getY(target) - y); var dir = design.findDirection(pos, pos + (dy * Dagaz.Model.WIDTH) + dx); if (dir !== null) { while ((pos !== null) && (pos != target)) { var piece = board.getPiece(pos); if ((piece === null) || (piece.player != board.player)) break; if (_.indexOf(r, pos) < 0) { r.push(pos); } pos = design.navigate(board.player, pos, dir); } } } }); } return r; } 

对于Takoka来说,这种过载是最容易的。 由于其中没有“推动”动作(始终需要清楚地突出显示组中包含的所有组件),因此足以阻止此功能,也就是说,只需不扩展组即可:

 Dagaz.Model.closure = function(board, move, group) { return group; } 

我为没有任何意义的函数名称表示歉意。 我只是想出一个更好的名字。


游戏还实现了小组运动,但其机制完全不同! 这里的图形按3x3组移动,此外,组中的空白字段也是移动的“样式”的一部分。 八个外部字段之一上的图形显示了您可以移动的方向,中央字段的填充确定了您是否可以将“样式”移动到任意距离或仅短距离(不超过3步)。 为了赢得胜利,有必要摧毁敌人的“环”-皇家人物的类似物(这是一个空旷的田地,四面八方包围)。 您必须非常小心,不要破坏戒指。

无论是从“ 魔术 ”还是从原型本身(即游戏的骨架)而言, GESS都是一场噩梦。 可以说该板(20x20,考虑到板外部的许多字段)由两层组成。 整个顶层完全填充了控制运动的不可见形状。 构成玩家“模式”的石头运动只是这些运动的副作用。 不幸的是,我还没有为这个游戏开发一个机器人。


在本文的结尾,我想向您介绍与数字组移动主题不直接相关的其他内容。 我被要求把这个游戏当作我的项目页面的订阅者之一-Sultan Ratrout。 通常,这些是六角板上的普通立柱检查器 。 即使没有女士们。 革命的概念是不同的! 游戏领域本身是可变形的! 好好享受

我要去度假...

Source: https://habr.com/ru/post/zh-CN416595/


All Articles