【问题标题】:Assigning pattern information to pictures (iOS)将图案信息分配给图片 (iOS)
【发布时间】:2014-12-18 01:36:05
【问题描述】:

我是 iOS 开发领域的新手,我正在制作一款小型(可能会让人上瘾)游戏。我知道 Python 和 HTML/CSS,所以我能够应付计算机术语,但如果你能解释任何答案,那就太好了。

在我的游戏中,一个图案会在屏幕上闪烁一小段时间,假设它是“左箭头,右箭头,左箭头”(以图片的形式)。然后用户必须复制模式(以正确的顺序)才能向前推进。我将使用 UIGestureRecogniser 以“正确”模式调用 boost 函数。我编程的下一步是为图片分配“路径”。识别器将测试用户输入是否等于显示的模式,但我需要一种方法让计算机查看显示的模式是否由用户输入(抱歉,如果它令人困惑)。本质上,如果用户给出的模式与屏幕上显示的模式相似,那么让计算机识别的最有效方法是什么。

提前谢谢你,

【问题讨论】:

  • 它是什么图案..任何特定的形状?举一个模式的例子
  • @turbo 模式可能是“左箭头,右箭头,左箭头”或“向下箭头,向右箭头,向上箭头”。当然我的意思是“向上的箭头”(它是图片形式)。
  • 你觉得至少可以从UIGestureRecogniser生成输入模式吗?换句话说,您可以正确检测左、右、上和下吗?
  • @MobileBen 当然,非常感谢您能给我的任何帮助。 Radwa Ebrahim 给出的答案很好,但我希望代码对我在该问题的第一条评论中给出的示例“个性化”。

标签: ios objective-c design-patterns swift uigesturerecognizer


【解决方案1】:

假设您有一个名为Pattern 的对象,其中包含一个名为Shape 的对象数组。每个Shape 对象都有一个名为type 的属性,它可以是一个枚举,如下所示:

enum ShapeType {
    case ArrowLeft
    case ArrowRight
    case ArrowUp
    case ArrowDown
}

每次生成要显示的模式时,都将其保存在 Pattern 对象中,我们称之为“currentPattern”,然后将用户输入输入到另一个 Pattern 对象中并称之为“userPattern”。

Pattern 和 Shape 类应提供 == 运算符重载,如下所示:

形状

func == (left: Shape, right: Shape) -> Bool {
  return left.type == right.type
}

在模式中

func == (left: Pattern, right: Pattern) -> Bool {
  return left.shapesArray == right.shapesArray
}

在你的函数中这样比较模式(比如当他点击完成时,或者当输入的计数达到所需的计数时),你需要做的就是

if currentPattern == userPattern {
   // it's correct,proceed to the next step
}else {
   // show a pretty losing message
}

提示上面的代码是用 Swift 编写的,如果你使用的是 Objective-C,你需要覆盖 isEqual 而不是 == 操作符。

【讨论】:

  • 基本上我知道我需要使用 UIGestureRecogniser 函数。我还没有太多编程,但我觉得我现在需要做的就是开发模式。所以,假设我有三种模式(用于示例的基本模式)。 1) 向左箭头,向右箭头。 2) 向上箭头,向下箭头。 3) 向上箭头,向左箭头。我可以让电脑识别输入的图案,但我需要一种方法让电脑检查它是否与图片相似。换句话说,假设模式 3 弹出,用户执行“向下箭头,向左箭头”。计算机是如何意识到输入错误的?
  • @arcofclark 我已经编辑了我的答案,请检查并告诉我是否有任何不清楚的地方。
  • 感谢 Radwa,您将我从数周的困惑和绝望中拯救出来!由于我对编程比较陌生,如果您能解释诸如枚举和中缀函数之类的东西,我将不胜感激。非常感谢!会
  • Welcome =)...Enum 用于定义变量可以具有的值,例如当您想要表示红绿灯值时,它可以是红色、黄色或绿色,所以它是一个变量类型而不是一个函数。关于infix,通常说你要重载一个新的中缀运算符(在两个操作数之间使用的运算符),这实际上不是我们这里的情况,因为 == 不是一个新的运算符,所以你可以删除它,检查 [link](developer.apple.com/library/ios/documentation/General/Reference/…)
  • 在这里您可以阅读有关运算符重载、中缀、后缀和前缀的更多信息 [链接] (developer.apple.com/library/ios/documentation/Swift/Conceptual/…)。我会将其从答案中删除以减少混淆
【解决方案2】:

好吧,所以我实际上是第一次误读并更新了这个。之前我已经指出了如何解决找到哪个模式将匹配一个序列,如果有的话。您已经知道顺序,这使得它更容易!

让我们做一些假设:

-我们正在使用枚举

enum PatternType: Int {
    case Left = 0, Right, Up, Down
}

注意,我知道 Radwa Ebrahim 提到了一个枚举并将其定义为 ShapeType。但是,您听起来确实像是在做“模式识别”。因此ShapeType 没有明确定义枚举是什么。实际上应该是PatternDirection 甚至GestureDirection

-您已经具备正确阅读手势的能力。结果在Array<PatternType> 中提供。

-你有一个定义的数组,代表要匹配的模式。这是Array<Array<PatternType>>。换句话说,你现在是你想要匹配的对象。

-您现在已经如何将图像映射到枚举中的每个方向。

-您知道要匹配的序列。

让我们来看看蛮力方法。蛮力方法是像这样存储模式序列(只是一个例子):

let patternSequences:[[PatternType]] = [
    [ .Left, .Left, .Left ], // This is sequence 0
    [ .Right, .Right, .Right], // This is sequence 1
    [ .Left, .Right, .Right, .Up ] // This is sequence 2
    // Add more of your sequences here, each line is a sequence to match against
    // as well as the pattern you will show on screen
    [ .Down, .Up, .Left, .Down, .Up ] // Later on this, could be sequence 35
]

从 JSON 或 plist 加载它会更巧妙,但这个练习留给你。

假设你有结果:

var results:[PatternType] = [ .Left, .Right, .Right, .Up ]

您的匹配可以使用== 完成(此设置不需要重载,因为我们是PatternType 的数组,它已经是 Equatable,因为枚举不包含关联数据)

所以调用它就像

// After you have retrieved the input
if patternSequences[currentSequence] == results {
    // Indicate success
} else {
   // Indicate failure
}

currentSequence 是您刚刚从用户那里获得的 currentSequence。

【讨论】:

  • 感谢您花这么多时间在这上面。在我授予赏金之前,有几件事最好弄清楚。 1)您的第一个 let 语句,三个不同的“示例” - 它们算作三种模式吗?是否可以添加更多内容,并通过执行 PatternType[35] 之类的操作来访问它们。我已经有一个创建五个随机数的函数,那么我可以做 PatternType[rand] 吗?与你的 for 和 ifs 相反,'if PatternType[35] = userinput' 会更容易吗? PS。我会将用户的输入存储在文件中,然后匹配,还是其他?非常感谢
  • 更新了答案。我一开始看错了。你不需要找到它。要回答您的问题,是的,这些是 3 种模式(将它们视为模式序列,或者只是序列以帮助使名称更易于区分)。您可以添加更多内容,并且可以使用 patternSequences[35] 之类的内容访问它们。您不能使用 PatternType[35],因为 PatternType 是一种数据类型。我也不会硬编码值,而是使用currentSequence 之类的东西来指示索引。您还需要进行边界检查以确保 currentSequence 在数组的边界内。
  • 测试类似于patternSequences[currentSequence] == results。结果来自您的程序。无需将其保存到文件中。您将需要弄清楚如何计算从用户输入到调用将比较然后显示结果的代码的数据流,因为在这里解释起来有点困难。
  • 只是出于兴趣,为什么需要 Left = 0? (=0 部分)?谢谢。赏金。
  • 另外,使用 .Lefts 和其他东西时,我收到错误“AnyObject.Protocol 没有名为“Left”的成员”。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多