让我们每周一次洗牌

在Flatiron学校的第一周,他们给了我们二十一点实验室一个工作。 我慢慢地开始逐步研究它。 我创建了卡片,播放器,卡片组,引擎,并设置了所有实例,方法,初始化程序等。一切都以正常且良好的速度向前发展,直到实验室指示要求我对卡片组进行洗牌。

说明:

我的第一个想法是“这很容易。 因此,我开始在arc4random_uniform()周围键入各种不同的变体,但似乎无济于事。

在花了很多时间尝试解决这个问题之后,我决定发挥创造力,并提出了自己的解决方案,我将其称为“弗兰克·辛纳屈”。

第一周:弗兰克·辛纳屈

开始了。 让我们将其分为几步:

  • 我们的任务是创建shuffle()方法,以获取包含52张随机洗牌的卡组。 这时的牌组“ undealtCards”一副纸牌,看起来像这样:
  • 我的第一个想法是创建一个名为“ cardsToShuffle ”的纸牌阵列,并确保我名为“ undealtCards ”(我的牌)和“ DealtCards ”(另一装有发牌的牌)的两个阵列是空的。
  • 然后,我用一个for循环填充我的arraycardToShuffle阵列,使我的Card类中的所有西服和等级符合我的52张牌。 此时,问题是我有一副纸牌,但它们又重新排列好了,没有被洗掉。
  • 最后一部分是创建一个新的for循环,在该循环中,我们以随机顺序将所有Cards从cardsToShuffle移至undealCards
  • 并做了! 我们设法洗牌了。 如果一切顺利,我们应该有两个空数组( cardsToShuffleDealtCards )来启动, undealtCards应该有52个Card元素被改组。

我不得不说,我为自己感到非常自豪。 尽管现在看来这很容易,但是在第一周想出这个解决方案对我来说感觉非常好,我做到了。

第二周:印第安纳·琼斯

一周后,当我们回顾二十一点实验室的工作时,一位同学(@ramamilaneha)向我展示了一种改组甲板的更好方法。 我们将其称为“印第安纳琼斯”。

解决方法如下:

  • 我们将创建一个for循环,该循环将从0到几乎undealtCards计数运行。 然后,我们将使用arc4random方法获得randomIndex。
  • 然后我们验证i值是否与randomIndex不同,并以良好的“ Indiana Jones”风格交换了每个元素的顺序

第三周:魔术技巧

然后,在熨斗学校的第三周开始了,随之而来的是更多的实验室。 我认为经过一两个实验室之后,我们又不得不改组阵列。 老实说,我回到了最初的“ Frank Sinatra”解决方案,因为那时我还不太了解“ Indiana Jones”的方式。 我输入了整个解决方案,几分钟后,我决定必须有一个更好的方法。 我用谷歌搜索,直到找到第三个最好的解决方案“魔术”。

这是逐步的:

  • 带来GameKit框架。
  • 现在,我们可以使用GameKit框架中GKRandomSource类来创建新的纸牌阵列。 然后我们可以调用实例方法“ arrayByShufflingObjects” ,该方法允许我们对数组进行混洗。 完成后,我们只需将新的改组值设置为“ unealtCards”即可

我们无需做任何其他事情,它的工作方式就像魔术!

重要的是要注意,还有许多其他方法可以对数组进行改组。 该博客的目的是表明,即使每周都有新的挑战,但我自己测试想法,与同行合作以及使用网络工具仍使我能够学习解决问题的新方法。 我相信这是成为开发人员的重要组成部分。

恩里克

重要链接:

https://www.hackingwithswift.com/example-code/arrays/how-to-shuffle-an-array-in-ios-8-and-below

Swift:交换数组值并了解In-Out参数

Swift:随机播放任何类型的数组

https://developer.apple.com/reference/gamekit

https://developer.apple.com/reference/gameplaykit/gkrandomsource

https://developer.apple.com/reference/gameplaykit/gkrandomsource/1501123-sharedrandom

https://developer.apple.com/reference/gameplaykit/gkrandomsource/1501128-arraybyshufflingobjects