SandCat —更新1

欢迎使用我的最新项目SandCat的第一次更新。 我尚未对该项目进行真正的介绍,因此您现在只需要忍受我。 但是-这是项目的重点。 SandCat是第一种游戏规则集原型语言。 该语言旨在通过允许设计人员完全专注于核心机制和规则,而忽略软件要求,从而加快游戏设计过程。 如果您想进一步了解我的意思,请阅读我以前的文章“改善游戏设计过程”。

这是第一个更新-显然意味着这是许多更新中的第一个。 这些更新是我计划讨论语言设计决策,计划的功能,总体进度以及适用于该项目的其他所有内容的地方。 更新将是快速的,非正式的和未打磨的。 我之所以写这些文件,有两个原因:1.对于读者来说-推销该项目,说出话来,并希望能得到反馈。 2.对于我自己-记录进度并整理我的想法。

考虑到这些都是快速的非正式更新,所有内容均为初稿,很可能会更改。 因此:我强烈建议读者忽略分钟的细节,而将注意力放在长期目标上。 例如,不要在意语法。 我还不担心语法。 我知道这是非常粗糙的,次优的,而且非常不一致。 我的目的是在完善细节之前证明核心思想。

基础工作

对于此第一次更新,我将简单介绍项目的开始。

首先,所有游戏都需要某种状态。 您可以像这样指定状态,

 鸡。 

播放时,您会得到。

这只是一个事实陈述。 没有更多上下文,很难概念化。 我们可以通过提供更好的名称来添加一些上下文。

 鸡肉健康。 

但是鸡的健康意味着数值。 我们也可以指定。

  ChickenHealth(10)。 

大。 我们有一些非常基本的初始状态。 现在我们如何改变这种状态? 目前,这是通过事件完成的。 他们遵循的模式

  //事件(EVENT_NAME)-STATE_CHANGING:CONDITIONS 
事件(HurtChicken)-ChickenHealth(ChickenHealth-1):有条件(ChickenHealth> 0)。

用英语来说,此内容表示为—此事件称为HurtChicken,它将ChickenHealth设置为减去当前ChickenHealth的值,并且仅在ChickenHealth大于0时才有可能。

我认为这是一个不错的开始。 它非常初级,但是已经可以表达简单的游戏了。

盾牌推

仅使用这两个功能,我就可以编写一个名为Shield Push的小型游戏。

该游戏具有规则的图形表示。 不用担心 给设计师提供视觉上组织游戏的工具非常重要,但是我还没有解决这个挑战。

回到游戏。 在此游戏中,玩家可以移动红色方块,但不能移出网格边界,也不能移入黑色方块。 蓝色矩形是一个盾牌,一旦被拾起,玩家就只能向上或向下推动黑色方块。 以下是游戏的规则定义,后跟正在玩的游戏的gif。

  //初始状态 
GridMaxX(10)。
GridMinX(0)。
GridMaxY(10)。
GridMinY(0)。
  PlayerX(2)。 
PlayerY(3)。
  BlockX(3)。 
BlockY(3)。
  ShieldPosX(5)。 
ShieldPosY(7)。
  //移动的玩家。 无法进入街区。 
event(MoveUp)-PlayerY(PlayerY-1):
有条件的(PlayerY> GridMinY)&! [conditional(PlayerY-1 = BlockY)&conditional(PlayerX = BlockX)]。
  event(MoveDown)-PlayerY(PlayerY + 1): 
有条件的(PlayerY <GridMaxY)&! [条件(PlayerY +1 = BlockY)和条件(PlayerX = BlockX)]。
  event(MoveLeft)-PlayerX(PlayerX-1): 
有条件的(PlayerX> GridMinX)&! [conditional(PlayerX-1 = BlockX)&conditional(PlayerY = BlockY)]。
  event(MoveRight)-PlayerX(PlayerX + 1): 
有条件的(PlayerX <GridMaxX)&! [conditional(PlayerX +1 = BlockX)&conditional(PlayerY = BlockY)]。
  //推块。 
event(PushBlockUp)-PlayerY(PlayerY-1),BlockY(BlockY-1):
有条件的(PlayerY> GridMinY)和[有条件的(PlayerY-1 = BlockY)和有条件的(PlayerX = BlockX)]和有条件的(BlockY> GridMinY)和有条件的(PlayerHoldingShield = 0)。
  event(PushBlockDown)-PlayerY(PlayerY + 1),BlockY(BlockY +1): 
条件(PlayerY <GridMaxY)和[条件(PlayerY + 1 = BlockY)和条件(PlayerX = BlockX)]和条件(BlockY <GridMaxY)和条件(PlayerHoldingShield = 0)。
  //拾起盾牌 
event(PickupShield)-PlayerHoldingShield(0):
有条件的(PlayerX = ShieldPosX)和有条件的(PlayerY = ShieldPosY)。

问题与解决方案

这显然可以改善。 我看到有两个大问题。

  • 规则定义中有很多重复。 上下移动播放器是一个非常相似的概念,因此应压缩相似之处并将其放入自己的可重用单元中。 可以说是相同的。 确保播放器与块的位置不同,只需要写入一次,但是当前它已分布在多个事件中。
  • 您不能捆绑数据。 例如,添加第二个块是一项艰巨而单调的任务。 这部分是由于第一个问题,而且还因为该块的数据和规则未捆绑在一起。

这是我接下来的两项主要任务:减少相似规则的重复,并简化数据的捆绑和复制。 我认为这是一个良好的开端,但仍有很多工作要做。