使用SwiftUI构建美元游戏
使用图论开发一个简单游戏的A到Z
如果你在过去几周一直关注我,你会知道我发表了半打关于Swift 5.5中的并行编程功能的文章,这个编码奥德赛涵盖了这些天编写Swift的一些更具挑战性的方面。
但不要害怕,因为本文会更有趣。受这个基于数字的简单游戏视频的启发,我想我将尝试建立一个电子版的游戏。当然,一个我认为很容易的任务看起来也是有欺骗性的。
简介
在美元游戏中,你画了一个节点网络。所有的节点至少有一个连接,有些是多个。你在每个节点中都有一个美元值,有些节点是负值,有些是正值。
游戏的目标是确保每个节点的美元价值至少为零。你点击一个节点,与它的邻居分享它的价值。分享是一个挑战,因为节点必须与所有直接连接的节点分享其重要性。
设计
现在我应该先说,我不认为纯SwiftUI是做这个的最佳选择--我可能会通过使用SpriteKit构建游戏来证明这一点。
这里的挑战是建立棋盘,一个由节点组成的棋盘--那些不重叠且相互连接的节点。这是一个SwiftUI不太适合的任务,整个设计范式在一个调整为布局平衡的界面的框架内。
但这并不是唯一的挑战--因为你需要确保属相,也就是所有节点的总和,也能发挥作用。属数的公式是节点数+边数+1,视频中是这么说的--虽然我不确定自己是否理解正确,因为我得到的属数要小得多。
单一的
最初的重点是建立一个最小功能的游戏。为了感受一下我如何能有效地制作界面。我使用了六个节点,彼此之间都有单一的连接。
美元游戏的初稿
它运行得相当好,它背后的主要代码库看起来像这样。它首先为边缘、节点和数值设置网格坐标--几乎所有的东西都是硬编码。然后,它运行几个循环,把一切都画出来。
一些循环
在这之后,我又添加了一些节点和一些循环,其净效果看起来像这样。这对游戏的玩法肯定是有影响的,循环使它更具有挑战性。
美元游戏的第二稿
但是制造这些差异的代码并不像我希望的那样好。它的大部分都是硬编码的--这种变化意味着你将永远看到相同的节点/边缘排列。我们可以做得更好。
随机解决方案
在这一点上我退了一步,重新考虑了我的选择。节点的数值是个大难题;实际上,只要我把它们混在一起,每次使用相同的数值也没有关系。
秘密就在于节点+边的数量。所以我重新编码了双重连接,使其成为随机的,并增加了节点的数量。
虽然我还增加了一个重要的区别,那就是可以重新排列地图上的节点。
第三稿的美元游戏
仅仅看着我重新排列节点,你就可以开始体会到,用算法来做这件事将是非常困难的。所有这一切都把我带到了这篇文章的结尾。这里是最后的代码,可以让你开始。
我说的是结尾;我并没有完全停在那里--我决定继续构建一个变化,并将这个版本上传到应用商店。你所看到的最终版本的快照是以这篇文章为标题的。除了我在这里描述的内容,我还做了什么改变?
- 我定制了使用的字体。
- 我定义了一个自定义的结构来保存链接,取代了我在这里使用的数组。
- 我建立了一个入口页面,让你可以选择播放不同的网络尺寸。
- 我替换了我在这段代码内使用的神奇数字来完成上述工作。
- 我设置了一些基本的来回导航。
- 我添加了一个检查,看看你什么时候解决了这个网格--连同一个警报。
然后我在iTunes中设置了它,包括截图和描述,并提交给了审查。它只用了24小时就被批准了,当你读到这篇文章时,它已经在商店里了;在这里(链接到应用程序商店)。
这让我真正来到了本文的结尾。受到启发--写出你自己的游戏并上传到应用商店。