使用Swift创建篮球模拟应用程序:第2部分

让我们继续建设篮球。

欢迎回到篮球应用项目。 您可以在这里继续学习第1部分。

如果您还记得我们上次离开的地方,我们已经成功创建了用于模拟篮球比赛的Player,Team和Game类。 比赛由两支球队共同进行,他们都有机会得分。 我们可以进行一些比赛,并获得最终的比分:

但是,仍有许多工作要做。 以下是我想到的一些问题:

  1. 我们可以用名字来个性化我们的团队吗? 我们也可以命名玩家吗?
  2. 我们可以建立一个盒子得分,看看谁在得分,每个球员得分多少?
  3. 从接下来的两个功能开始,我们还需要建立什么样的联赛呢? 我们可以跟踪每个游戏的结果,并在“赛季”结束时提供统计信息吗?

这些是本部分要完成的主要目标。 在我们深入探讨之前,我将提出一个非常酷的建议,即有人提出来支持模拟财产中的三分球目标。 此代码块由Aaron A提供:

我很喜欢这个主意。 但是,对于软件开发过程来说,我决定完全重新考虑playPossession 功能并重构代码。 您会稍等一下。 但是首先,我们需要一些非通用名称! 从上次打开我们的Swift项目开始,让我们开始吧。

为我们的篮球队和球员取名

我们需要一些随机的球员和球队名称。 我们可以将这些名称列表作为数组包含在Player类和Team类中,但是可能会出现问题。 我们可能需要特殊功能来生成普通数组无法处理的名称。 同样,通常,我们应该尝试从类中抽象出尽可能多的与玩家或团队的行为没有直接关系的功能。 让我们创建一个名为NameGenerator.swift的新文件 我已经填写了一些:

好的,希望其中大部分是简单的。 我们在此列出了球员和球队的可能名字。 现在,让我们具体看一下这一行:

Swift中的单例

这条线表示的是单例模式,这是一种常见的软件设计模式。 简而言之(也是因为我对此经验不足),它仅允许在应用程序的整个生命周期中创建和使用一个类的实例。 现在,这种模式将如何帮助我们? 当我们将名称分配给新创建的玩家时,我们不希望两个玩家使用相同的名称。 我们也不想让尼克斯与尼克斯对抗。 因此,我们将能够在单个NameGenerator类中跟踪未选择的名称。 现在,我们将添加功能来完全做到这一点:

基本上在这里,我们将从名称列表中获取,并将其从列表中删除,这样就无法再次选择它。 看起来很棒! 现在,我们将Player类和Team类的初始化更新为一个名称:

我们的第一个目标几乎完成。 最后,我们必须先初始化NameGenerator单例类,然后再开始仿真。 让我们在ViewController.swift文件的顶部进行操作:

现在我们可以在任何地方使用它了:)。 继续执行步骤2。

进行盒子评分

篮球比赛中的得分是两队比赛结果的摘要。 大多数禁区得分都包含诸如得分,篮板和助攻之类的信息,但我们暂时将其保持在得分上。 如果这样做的话,想想一个数据结构来表示我们的盒子分数很简单。 我们有球员,每个人都会得分。 因此,让我们将盒子得分存储为字典,其中玩家将是关键,而他们的得分将是值。 这特别有效,因为我们保证玩家姓名是唯一的,因此我们不必担心会覆盖统计信息。 由于每个游戏在现实生活中都有自己的得分,因此我们可以将其存储在Game类中:

初始化游戏时,我们要确保已设置boxScore键,因此我们会将两个花名册中的每个玩家添加到其中。

改变篮球的运作方式

因此,我们希望让每个玩家单独得分,而不是由负责得分的团队来得分。 我们将通过重新考虑playPossession的逻辑来做到这一点 功能:

与其使用我们球队的进攻和防守得分,不如使用我们球员的得分。 我们可以对进攻和防守进行相同的比较,并从两队中随机选择两名球员。 当我们这样做时,如果他们成功的话,我们将能够增加他们的得分:

使用Swift的randomElement函数,我们可以轻松地从两个花名册中选择随机的Player来播放我们的财产。 我们仍然会从playPossession函数返回一个值,但是现在我们的玩家可以控制每个游戏。 在解决这一部分的最终目标之前,让我们看看我们的新变化。 我们现在仅运行一个游戏,并在runGame函数中添加一些额外的打印格式:

现在,我们可以构建并运行我们的应用程序!

一切看起来都不错! 对于Logan Hurless来说太糟糕了,对于他的球队来说,他似乎并不是一个得分选择。 现在,我们的最后一次飞跃。

篮球联赛的开始

一个篮球联赛由多个球队组成,每个球队在一个赛季中互相比赛。 在下一部分中,我一定会重点介绍更多内容,但让我们考虑一下联盟中一个很小但很重要的部分。 你猜对了,联盟统计。 篮球赛季最激动人心的部分之一就是查看我们最喜欢的球员平均能获得多少分。 我们联赛的设计可能会在将来发生变化,但是我们现在只模拟一个进行测试。 让我们创建一个名为LeagueSimulation.swift的新文件并创建我们的新类。 由于这是一次仿真,将在我们的应用程序的整个生命周期中进行,因此我敢肯定,您可以猜测我们将如何构建它:

就像Game类中的盒子分数一样,我们可以将玩家的得分总数存储在Dictionary中。 首先,在ViewController.swift中初始化我们的实例:

现在,每次比赛结束时,我们都可以将每个球员的得分加到我们的联赛中。 让我们返回我们的Game类来完成该操作:

更进一步! 我们只需要在最后显示我们的联赛统计数据即可。 将此函数放在LeagueSimulation.swift中

运行我们的篮球联赛模拟

看起来一切正常。 我认为我们已经准备好在两支球队之间进行短暂的赛季训练,看看我们的球员平均得分如何! 让我们创建两个随机的团队,并在它们之间运行十场比赛。 回到ViewController.swift中 。 之后,我们将介绍联盟统计数据:

手指交叉以获得不错的效果。 让我们来看看十个球员的平均值。

哇。 得分超高的联赛,但这是适合您的现代NBA。

结论

再次阅读并喜欢我的上一篇文章的人们让我再次感到非常震惊和震惊。 我曾经有一些宠物项目编码的经验,但是我绝不是Swift或开发方面的专家。 我也愿意就如何处理此部分提供更多反馈和建议(再次感谢Aaron)。 在下一篇文章中,我打算探讨我们年轻的新联盟的发展和维护!