[
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 PJHubs\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# 《Swift 游戏开发》\n\n这里汇集了我的小专栏《Swift 游戏开发》的全部代码，小专栏地址：https://xiaozhuanlan.com/pjhubs-swift-game\n\n![](https://images.xiaozhuanlan.com/photo/2019/4305214109ad56a7bbc8ed9e66c2bbf6.png)\n\n[Swift 游戏开发序言](https://xiaozhuanlan.com/topic/9704163285)\n\n![](https://images.xiaozhuanlan.com/photo/2019/22c830968d31df2249696119aa63d2db.png)\n\n[Swift 游戏开发之能否关个灯（〇）](https://xiaozhuanlan.com/topic/9806127435)\n\n[Swift 游戏开发之能否关个灯（一）](https://xiaozhuanlan.com/topic/2564017938)\n\n[Swift 游戏开发之能否关个灯（二）](https://xiaozhuanlan.com/topic/8654723190)\n\n![](https://images.xiaozhuanlan.com/photo/2019/a0dd4d112c81e08d47c1822a7a9888d0.png)\n\n[Swift 游戏开发阶段总结（〇）](https://xiaozhuanlan.com/topic/7942150836)\n\n![](https://images.xiaozhuanlan.com/photo/2019/d8805030d828cae0c691121d3d3c5ccb.png)\n\n[Swift 游戏开发之黎锦拼图（〇）](https://xiaozhuanlan.com/topic/8079642315)\n\n[Swift 游戏开发之黎锦拼图（一）](https://xiaozhuanlan.com/topic/0312569847)\n\n[Swift 游戏开发之黎锦拼图（二）](https://xiaozhuanlan.com/topic/9738401526)\n\n[Swift 游戏开发之黎锦拼图（三）](https://xiaozhuanlan.com/topic/3968275140)\n\n[Swift 游戏开发之黎锦拼图（四）](https://xiaozhuanlan.com/topic/7436519820)\n\n![](https://images.xiaozhuanlan.com/photo/2019/ac56d26bd4577bcdd242e2fe90141d6d.png)\n\n[Swift 游戏开发阶段总结（一）](https://xiaozhuanlan.com/topic/8109647352)\n\n![](https://images.xiaozhuanlan.com/photo/2019/e4fb08d3c028c97f5da6e62a7a08a6cd.png)\n\n[Swift 游戏开发之方块弹珠（〇））](https://xiaozhuanlan.com/topic/1758926340)\n\n"
  },
  {
    "path": "bounceGame/bounceGame/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2019/12/22.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n\n}\n\n"
  },
  {
    "path": "bounceGame/bounceGame/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "bounceGame/bounceGame/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "bounceGame/bounceGame/Ball/Ball.swift",
    "content": "//\n//  Ball.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2019/12/29.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport SpriteKit\n\nclass Ball: SKShapeNode {\n    var isShot = false\n    \n    \n    override init() {\n        super.init()\n        \n        initObject()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func initObject() {\n        self.fillColor = .red\n        self.physicsBody = SKPhysicsBody(circleOfRadius: 10)\n        self.physicsBody?.categoryBitMask = BitMask.Ball\n        self.physicsBody?.contactTestBitMask = BitMask.Box | BitMask.Ground\n        self.physicsBody?.collisionBitMask = BitMask.Box\n        self.physicsBody?.usesPreciseCollisionDetection = true;\n        self.physicsBody?.linearDamping = 0\n        self.physicsBody?.restitution = 1.0\n    }\n}\n"
  },
  {
    "path": "bounceGame/bounceGame/Ball/Box.swift",
    "content": "//\n//  Box.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2020/1/7.\n//  Copyright © 2020 翁培钧. All rights reserved.\n//\n\nimport SpriteKit\n\nclass Box: SKShapeNode {\n\n}\n"
  },
  {
    "path": "bounceGame/bounceGame/Ball/Label.swift",
    "content": "//\n//  Label.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2020/1/8.\n//  Copyright © 2020 翁培钧. All rights reserved.\n//\n\nimport SpriteKit\n\nclass Label: SKLabelNode {\n    var typoTag = 0\n}\n"
  },
  {
    "path": "bounceGame/bounceGame/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "bounceGame/bounceGame/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BV1-FR-VrT\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Game View Controller-->\n        <scene sceneID=\"tXr-a1-R10\">\n            <objects>\n                <viewController id=\"BV1-FR-VrT\" customClass=\"GameViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"3se-qz-xqx\" customClass=\"SKView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"4qk-I5-YsI\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"SZV-WD-TEh\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "bounceGame/bounceGame/Define.swift",
    "content": "//\n//  Define.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2019/12/30.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport Foundation\n\n\nstruct BitMask {\n    static let Ball = UInt32(0x00001)\n    static let Box = UInt32(0x00002)\n    static let Wall = UInt32(0x00003)\n    static let Ground = UInt32(0x00004)\n}\n"
  },
  {
    "path": "bounceGame/bounceGame/Extension.swift",
    "content": "//\n//  Extension.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2020/1/8.\n//  Copyright © 2020 翁培钧. All rights reserved.\n//\n\nimport SpriteKit\n\n\n"
  },
  {
    "path": "bounceGame/bounceGame/GameScene.swift",
    "content": "//\n//  GameScene.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2019/12/22.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport SpriteKit\n\nclass GameScene: SKScene {\n    \n    private var balls = [Ball]()\n    private var contactGroundBalls = [Ball]()\n    \n    \n    private var isBegin = false\n    \n    \n    private var ground = SKSpriteNode()\n    private var firstDownBall: Ball?\n    \n    \n    \n    \n    override init(size: CGSize) {\n        super.init(size: size)\n        \n        physicsWorld.gravity = CGVector(dx: 0, dy: -1)\n        physicsWorld.contactDelegate = self\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    var contentCreated = false\n    \n    override func didMove(to view: SKView) {\n        if !contentCreated {\n            createContent()\n            contentCreated = true\n        }\n    }\n    \n    private func createContent() {\n        ground = SKSpriteNode(color: .gray, size: CGSize(width: size.width, height: 120))\n        ground.position = CGPoint(x: size.width / 2, y: ground.size.height / 2)\n        addChild(ground)\n        ground.physicsBody = SKPhysicsBody(rectangleOf: ground.size)\n        ground.physicsBody?.isDynamic = false\n        ground.physicsBody?.collisionBitMask = BitMask.Ball\n        ground.physicsBody?.categoryBitMask = BitMask.Ground\n        ground.physicsBody?.contactTestBitMask = BitMask.Ball\n        \n        let wall = SKNode()\n        wall.position = CGPoint(x: 0, y: 0)\n        wall.physicsBody?.friction = 0\n        wall.physicsBody?.isDynamic = false\n        wall.physicsBody?.restitution = 1.0\n        wall.physicsBody?.collisionBitMask = BitMask.Wall\n        wall.physicsBody?.categoryBitMask = BitMask.Wall\n        wall.physicsBody?.contactTestBitMask = BitMask.Wall\n        wall.physicsBody = SKPhysicsBody(edgeLoopFrom: CGRect(x: 0, y: 0, width: size.width, height: size.height))\n        addChild(wall)\n        \n        for _ in 0..<5 {\n            let ball = Ball(circleOfRadius: 10)\n            balls.append(ball)\n            addChild(ball)\n            ball.physicsBody?.isDynamic = false\n            ball.position = CGPoint(x: size.width / 2, y: ground.frame.size.height + ball.frame.size.height / 2)\n        }\n        \n        for row in 1...5 {\n            let box = Box(rectOf: CGSize(width: 50, height: 50))\n            box.position = CGPoint(x: 50 + (row * 50 + 20), y: (800 - row * 50 + 20))\n            box.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50, height: 50))\n            box.physicsBody?.categoryBitMask = BitMask.Box\n            box.physicsBody?.contactTestBitMask = BitMask.Ball\n            box.physicsBody?.collisionBitMask = BitMask.Box\n            box.physicsBody?.linearDamping = 0\n            box.physicsBody?.restitution = 1.0\n            box.physicsBody?.isDynamic = false\n            box.fillColor = .red\n            \n            let label = Label(text: \"\\(row)\")\n            label.fontSize = 22\n            label.typoTag = 666\n            label.fontName = \"Arial-BoldMT\"\n            label.color = .white\n            label.position = CGPoint(x: 0, y: -label.frame.size.height / 2)\n            box.addChild(label)\n            \n            addChild(box)\n        }\n    }\n}\n\nextension GameScene {\n    private func shot() {\n        for (index, ball) in balls.enumerated() {\n            DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 * Double(index)) {\n                ball.physicsBody?.isDynamic = true\n                if (!self.children.contains(ball)) {\n                    self.addChild(ball)\n                }\n                ball.physicsBody?.applyImpulse(CGVector(dx: 10, dy: 10))\n                ball.physicsBody?.applyTorque(1.8)\n//                ball.physicsBody?.applyForce(CGVector(dx: 400 + CGFloat(index) * 0.1, dy: 800))\n                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {\n                    ball.isShot = true\n                    \n                    if (index == self.balls.count - 1) {\n                        self.firstDownBall?.removeFromParent()\n                        self.firstDownBall = nil\n                    }\n                }\n            }\n        }\n    }\n}\n\nextension GameScene {\n    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {\n        shot()\n    }\n}\n\nextension GameScene: SKPhysicsContactDelegate {\n    func didBegin(_ contact: SKPhysicsContact) {\n        print(\"\\(contact.bodyA.contactTestBitMask) == \\(contact.bodyB.contactTestBitMask)\")\n        \n        \n        \n        switch contact.bodyA.categoryBitMask {\n        case BitMask.Box:\n            checkNodeIsBox(contact.bodyA.node)\n            checkNodeIsWall(contact.bodyB.node)\n        case BitMask.Wall:\n            checkNodeIsWall(contact.bodyB.node)\n        case BitMask.Ground:\n            checkNodeIsGround(contact.bodyB.node)\n        default:\n            break\n        }\n        \n        switch contact.bodyB.categoryBitMask {\n        case BitMask.Box:\n            checkNodeIsBox(contact.bodyB.node)\n            checkNodeIsWall(contact.bodyA.node)\n        case BitMask.Wall:\n            checkNodeIsWall(contact.bodyA.node)\n        case BitMask.Ground:\n            checkNodeIsGround(contact.bodyA.node)\n        default:\n            break\n        }\n    }\n}\n\nextension GameScene {\n    private func checkNodeIsBox(_ node: SKNode?) {\n        guard let box = node else { return }\n        \n        if box.physicsBody?.categoryBitMask == BitMask.Box {\n            let label = box.children.first! as! Label\n            var tag = Int(label.text!)!\n            if (tag > 1) {\n                tag -= 1\n                label.text = \"\\(tag)\"\n            } else {\n                box.removeFromParent()\n            }\n        }\n    }\n    \n    private func checkNodeIsWall(_ node: SKNode?) {\n        guard let ball = node as? Ball else { return }\n           \n        ball.isShot = true\n    }\n    \n    private func checkNodeIsGround(_ node: SKNode?) {\n        guard let ball = node as? Ball else { return }\n        \n        // NOTE: 小球 & 发射出去\n        if (ball.physicsBody?.categoryBitMask == BitMask.Ball && ball.isShot) {\n            ball.removeFromParent();\n            \n            // NOTE: 定位小球不存在 || 当前 Scene 中不包含定位小球\n            if (firstDownBall == nil || !children.contains(firstDownBall!)) {\n                firstDownBall = Ball(circleOfRadius: 10)\n                firstDownBall!.position = CGPoint(x: ball.position.x, y: ground.frame.size.height + ball.frame.size.height / 2 - 2)\n                addChild(firstDownBall!)\n                // NOTE: 静止\n                firstDownBall!.physicsBody?.isDynamic = false\n            }\n        \n            // NOTE: 统一重设后续触底小球位置。二次发射时，直接读取各个小球的初始位置进行发射\n            ball.position = CGPoint(x: firstDownBall!.position.x, y: ground.frame.size.height + ball.frame.size.height / 2)\n        }\n    }\n}\n\n"
  },
  {
    "path": "bounceGame/bounceGame/GameViewController.swift",
    "content": "//\n//  GameViewController.swift\n//  bounceGame\n//\n//  Created by 翁培钧 on 2019/12/22.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\nimport SpriteKit\n\nclass GameViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        if let view = self.view as! SKView? {\n            \n            let scene = GameScene(size: view.frame.size)\n            scene.scaleMode = .aspectFill\n            view.presentScene(scene)\n            view.ignoresSiblingOrder = true\n            view.showsFPS = true\n            view.showsNodeCount = true\n            view.showsPhysics = true\n        }\n    }\n\n    override var prefersStatusBarHidden: Bool {\n        return true\n    }\n}\n"
  },
  {
    "path": "bounceGame/bounceGame/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarHidden</key>\n\t<true/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "bounceGame/bounceGame.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0C8BB82F23C4C84B00F88BD6 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C8BB82E23C4C84B00F88BD6 /* Box.swift */; };\n\t\t0C964EBD23B8E5D0001EA659 /* Ball.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C964EBC23B8E5D0001EA659 /* Ball.swift */; };\n\t\t0C964EBF23BA3FDF001EA659 /* Define.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C964EBE23BA3FDF001EA659 /* Define.swift */; };\n\t\t0CA02F8523AFAB7D004A580E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA02F8423AFAB7D004A580E /* AppDelegate.swift */; };\n\t\t0CA02F8723AFAB7D004A580E /* GameScene.sks in Resources */ = {isa = PBXBuildFile; fileRef = 0CA02F8623AFAB7D004A580E /* GameScene.sks */; };\n\t\t0CA02F8923AFAB7D004A580E /* Actions.sks in Resources */ = {isa = PBXBuildFile; fileRef = 0CA02F8823AFAB7D004A580E /* Actions.sks */; };\n\t\t0CA02F8B23AFAB7D004A580E /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA02F8A23AFAB7D004A580E /* GameScene.swift */; };\n\t\t0CA02F8D23AFAB7D004A580E /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA02F8C23AFAB7D004A580E /* GameViewController.swift */; };\n\t\t0CA02F9023AFAB7D004A580E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0CA02F8E23AFAB7D004A580E /* Main.storyboard */; };\n\t\t0CA02F9223AFAB7E004A580E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0CA02F9123AFAB7E004A580E /* Assets.xcassets */; };\n\t\t0CA02F9523AFAB7E004A580E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0CA02F9323AFAB7E004A580E /* LaunchScreen.storyboard */; };\n\t\t0CFFFBBE23C629AD00BB3F13 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFFFBBD23C629AD00BB3F13 /* Label.swift */; };\n\t\t0CFFFBC223C62AD300BB3F13 /* Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFFFBC123C62AD300BB3F13 /* Extension.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t0C8BB82E23C4C84B00F88BD6 /* Box.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Box.swift; sourceTree = \"<group>\"; };\n\t\t0C964EBC23B8E5D0001EA659 /* Ball.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ball.swift; sourceTree = \"<group>\"; };\n\t\t0C964EBE23BA3FDF001EA659 /* Define.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Define.swift; sourceTree = \"<group>\"; };\n\t\t0CA02F8123AFAB7D004A580E /* bounceGame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = bounceGame.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0CA02F8423AFAB7D004A580E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t0CA02F8623AFAB7D004A580E /* GameScene.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = GameScene.sks; sourceTree = \"<group>\"; };\n\t\t0CA02F8823AFAB7D004A580E /* Actions.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = Actions.sks; sourceTree = \"<group>\"; };\n\t\t0CA02F8A23AFAB7D004A580E /* GameScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = \"<group>\"; };\n\t\t0CA02F8C23AFAB7D004A580E /* GameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = \"<group>\"; };\n\t\t0CA02F8F23AFAB7D004A580E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t0CA02F9123AFAB7E004A580E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t0CA02F9423AFAB7E004A580E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t0CA02F9623AFAB7E004A580E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t0CFFFBBD23C629AD00BB3F13 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = \"<group>\"; };\n\t\t0CFFFBC123C62AD300BB3F13 /* Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extension.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0CA02F7E23AFAB7D004A580E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0C964EBB23B8E5A6001EA659 /* Ball */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C964EBC23B8E5D0001EA659 /* Ball.swift */,\n\t\t\t\t0C8BB82E23C4C84B00F88BD6 /* Box.swift */,\n\t\t\t\t0CFFFBBD23C629AD00BB3F13 /* Label.swift */,\n\t\t\t);\n\t\t\tpath = Ball;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CA02F7823AFAB7D004A580E = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CA02F8323AFAB7D004A580E /* bounceGame */,\n\t\t\t\t0CA02F8223AFAB7D004A580E /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CA02F8223AFAB7D004A580E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CA02F8123AFAB7D004A580E /* bounceGame.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CA02F8323AFAB7D004A580E /* bounceGame */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CA02F8423AFAB7D004A580E /* AppDelegate.swift */,\n\t\t\t\t0CA02F8623AFAB7D004A580E /* GameScene.sks */,\n\t\t\t\t0CA02F8823AFAB7D004A580E /* Actions.sks */,\n\t\t\t\t0CA02F8A23AFAB7D004A580E /* GameScene.swift */,\n\t\t\t\t0CA02F8C23AFAB7D004A580E /* GameViewController.swift */,\n\t\t\t\t0C964EBE23BA3FDF001EA659 /* Define.swift */,\n\t\t\t\t0CFFFBC123C62AD300BB3F13 /* Extension.swift */,\n\t\t\t\t0C964EBB23B8E5A6001EA659 /* Ball */,\n\t\t\t\t0CA02F8E23AFAB7D004A580E /* Main.storyboard */,\n\t\t\t\t0CA02F9123AFAB7E004A580E /* Assets.xcassets */,\n\t\t\t\t0CA02F9323AFAB7E004A580E /* LaunchScreen.storyboard */,\n\t\t\t\t0CA02F9623AFAB7E004A580E /* Info.plist */,\n\t\t\t);\n\t\t\tpath = bounceGame;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t0CA02F8023AFAB7D004A580E /* bounceGame */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0CA02F9923AFAB7E004A580E /* Build configuration list for PBXNativeTarget \"bounceGame\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0CA02F7D23AFAB7D004A580E /* Sources */,\n\t\t\t\t0CA02F7E23AFAB7D004A580E /* Frameworks */,\n\t\t\t\t0CA02F7F23AFAB7D004A580E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = bounceGame;\n\t\t\tproductName = bounceGame;\n\t\t\tproductReference = 0CA02F8123AFAB7D004A580E /* bounceGame.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0CA02F7923AFAB7D004A580E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1120;\n\t\t\t\tLastUpgradeCheck = 1120;\n\t\t\t\tORGANIZATIONNAME = \"翁培钧\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t0CA02F8023AFAB7D004A580E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.2.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 0CA02F7C23AFAB7D004A580E /* Build configuration list for PBXProject \"bounceGame\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 0CA02F7823AFAB7D004A580E;\n\t\t\tproductRefGroup = 0CA02F8223AFAB7D004A580E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t0CA02F8023AFAB7D004A580E /* bounceGame */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t0CA02F7F23AFAB7D004A580E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0CA02F9023AFAB7D004A580E /* Main.storyboard in Resources */,\n\t\t\t\t0CA02F8723AFAB7D004A580E /* GameScene.sks in Resources */,\n\t\t\t\t0CA02F9223AFAB7E004A580E /* Assets.xcassets in Resources */,\n\t\t\t\t0CA02F9523AFAB7E004A580E /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t0CA02F8923AFAB7D004A580E /* Actions.sks in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t0CA02F7D23AFAB7D004A580E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C964EBD23B8E5D0001EA659 /* Ball.swift in Sources */,\n\t\t\t\t0CA02F8B23AFAB7D004A580E /* GameScene.swift in Sources */,\n\t\t\t\t0CA02F8D23AFAB7D004A580E /* GameViewController.swift in Sources */,\n\t\t\t\t0C8BB82F23C4C84B00F88BD6 /* Box.swift in Sources */,\n\t\t\t\t0C964EBF23BA3FDF001EA659 /* Define.swift in Sources */,\n\t\t\t\t0CFFFBBE23C629AD00BB3F13 /* Label.swift in Sources */,\n\t\t\t\t0CA02F8523AFAB7D004A580E /* AppDelegate.swift in Sources */,\n\t\t\t\t0CFFFBC223C62AD300BB3F13 /* Extension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t0CA02F8E23AFAB7D004A580E /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t0CA02F8F23AFAB7D004A580E /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CA02F9323AFAB7E004A580E /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t0CA02F9423AFAB7E004A580E /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0CA02F9723AFAB7E004A580E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0CA02F9823AFAB7E004A580E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0CA02F9A23AFAB7E004A580E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tINFOPLIST_FILE = bounceGame/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.pjhubs.bounceGame;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0CA02F9B23AFAB7E004A580E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tINFOPLIST_FILE = bounceGame/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.pjhubs.bounceGame;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0CA02F7C23AFAB7D004A580E /* Build configuration list for PBXProject \"bounceGame\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0CA02F9723AFAB7E004A580E /* Debug */,\n\t\t\t\t0CA02F9823AFAB7E004A580E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0CA02F9923AFAB7E004A580E /* Build configuration list for PBXNativeTarget \"bounceGame\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0CA02F9A23AFAB7E004A580E /* Debug */,\n\t\t\t\t0CA02F9B23AFAB7E004A580E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0CA02F7923AFAB7D004A580E /* Project object */;\n}\n"
  },
  {
    "path": "bounceGame/bounceGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:bounceGame.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "bounceGame/bounceGame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "bounceGame/bounceGame.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"F52A3FF6-A55D-463E-895F-7E3D1A48B3E6\"\n   type = \"1\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"CBBEE58E-AF60-4B1B-B0DC-67F6E289D242\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"bounceGame/GameScene.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"179\"\n            endingLineNumber = \"179\"\n            landmarkName = \"checkNodeIsWall(_:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "bounceGame/bounceGame.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>bounceGame.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "liGame/liGame/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/4.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n\n}\n\n"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/01.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"01.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/AppIcon-1.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/Line0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Line0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/Line1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Line1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/Line2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Line2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/Line3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Line3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_1.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_10.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_11.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_12.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_13.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_14.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_14.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_15.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_17.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_1.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_18.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_3.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_3.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_4.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_5.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_6.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_7.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_8.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/created_9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"created_9.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/finalMan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"finalMan.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Assets.xcassets/finalManContent.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"finalMamContent.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "liGame/liGame/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "liGame/liGame/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "liGame/liGame/Extension/Animation.swift",
    "content": "//\n//  Animation.swift\n//  WWDC19\n//\n//  Created by PJHubs on 2019/3/20.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport UIKit\n\nprotocol PJParticleAnimationable {}\n\nextension PJParticleAnimationable where Self: UIViewController {\n    func startParticleAnimation(_ point : CGPoint) {\n        let emitter = CAEmitterLayer()\n        emitter.emitterPosition = point\n        emitter.preservesDepth = true\n        \n        var cells = [CAEmitterCell]()\n        for i in 0..<20 {\n            let cell = CAEmitterCell()\n            cell.velocity = 150\n            cell.velocityRange = 100\n            cell.scale = 0.7\n            cell.scaleRange = 0.3\n            cell.emissionLongitude = CGFloat(-Double.pi / 2)\n            cell.emissionRange = CGFloat(Double.pi / 2)\n            cell.lifetime = 3\n            cell.lifetimeRange = 1.5\n            cell.spin = CGFloat(Double.pi / 2)\n            cell.spinRange = CGFloat(Double.pi / 2 / 2)\n            cell.birthRate = 2\n            cell.contents = UIImage(named: \"Line\\(i)\")?.cgImage\n            \n            cells.append(cell)\n        }\n        emitter.emitterCells = cells\n        view.layer.addSublayer(emitter)\n    }\n\n    func stopParticleAnimation() {\n        view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self)}).first?.removeFromSuperlayer()\n    }\n}\n\n"
  },
  {
    "path": "liGame/liGame/Extension/Define.swift",
    "content": "//\n//  Define.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/4.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\n/// 屏幕宽\nlet screenWidth = UIScreen.main.bounds.size.width\n/// 屏幕高\nlet screenHeight = UIScreen.main.bounds.size.height\n/// 底部安全距离\nlet bottomSafeAreaHeight = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0.0\n///顶部的安全距离\nlet topSafeAreaHeight = UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0.0\n/// 状态栏高度\nlet statusBarHeight = UIApplication.shared.statusBarFrame.height;\n/// 导航栏高度\nlet navigationBarHeight = CGFloat(44 + topSafeAreaHeight)\n\n"
  },
  {
    "path": "liGame/liGame/Extension/UIColor+Extension.swift",
    "content": "//\n//  UIColor+Extension.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/4.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nextension UIColor {\n    class func rgb(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat) -> UIColor {\n        return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1)\n    }\n    \n    class func rgba(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat, _ a: CGFloat) -> UIColor {\n        return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a)\n    }\n    \n    static var bgColor: UIColor {\n        return rgb(29, 36, 73)\n    }\n}\n"
  },
  {
    "path": "liGame/liGame/Extension/UIImage+Extension.swift",
    "content": "//\n//  UIImage+Extension.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/6.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nextension UIImage {\n    /// 通过原图获取 rect 大小的图片\n    func image(with rect: CGRect) -> UIImage {\n        let scale: CGFloat = 2\n        let x = rect.origin.x * scale\n        let y = rect.origin.y * scale\n        let w = rect.size.width * scale\n        let h = rect.size.height * scale\n        let finalRect = CGRect(x: x, y: y, width: w, height: h)\n        \n        let originImageRef = self.cgImage\n        let finanImageRef = originImageRef!.cropping(to: finalRect)\n        let finanImage = UIImage(cgImage: finanImageRef!, scale: scale, orientation: .up)\n        \n        return finanImage\n    }\n}\n"
  },
  {
    "path": "liGame/liGame/Extension/UIView+Extension.swift",
    "content": "//\n//  UIView+Extension.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/4.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nextension UIView {\n    \n    static private let PJSCREEN_SCALE = UIScreen.main.scale\n    \n    private func getPixintegral(pointValue: CGFloat) -> CGFloat {\n        return round(pointValue * UIView.PJSCREEN_SCALE) / UIView.PJSCREEN_SCALE\n    }\n    \n    public var x: CGFloat {\n        get {\n            return self.frame.origin.x\n        }\n        set(x) {\n            self.frame = CGRect.init(\n                x: getPixintegral(pointValue: x),\n                y: self.y,\n                width: self.width,\n                height: self.height\n            )\n        }\n    }\n    \n    public var y: CGFloat {\n        get {\n            return self.frame.origin.y\n        }\n        set(y) {\n            self.frame = CGRect.init(\n                x: self.x,\n                y: getPixintegral(pointValue: y),\n                width: self.width,\n                height: self.height\n            )\n        }\n    }\n    \n    public var width: CGFloat {\n        get {\n            return self.frame.size.width\n        }\n        set(width) {\n            self.frame = CGRect.init(\n                x: self.x,\n                y: self.y,\n                width: getPixintegral(pointValue: width),\n                height: self.height\n            )\n        }\n    }\n    \n    public var height: CGFloat {\n        get {\n            return self.frame.size.height\n        }\n        set (height) {\n            self.frame = CGRect.init(\n                x: self.x,\n                y: self.y,\n                width: self.width,\n                height: getPixintegral(pointValue: height)\n            )\n        }\n    }\n    \n    public var bottom: CGFloat {\n        get {\n            return self.y + self.height\n        }\n        set(bottom) {\n            self.y = bottom - self.height\n        }\n    }\n    \n    public var right: CGFloat {\n        get {\n            return self.x + self.width\n        }\n        set (right) {\n            self.x = right - self.width\n        }\n    }\n    \n    public var left: CGFloat {\n        get {\n            return self.x\n        }\n        set(left) {\n            self.x = left\n        }\n    }\n    \n    public var top: CGFloat {\n        get {\n            return self.y\n        }\n        set(top) {\n            self.y = top\n        }\n    }\n    \n    public var centerX: CGFloat {\n        get {\n            return self.center.x\n        }\n        set(centerX) {\n            self.center = CGPoint.init(\n                x: getPixintegral(pointValue: centerX),\n                y: self.center.y\n            )\n        }\n    }\n    \n    public var centerY: CGFloat {\n        get {\n            return self.center.y\n        }\n        set (centerY) {\n            self.center = CGPoint.init(x: self.center.x, y: getPixintegral(pointValue: centerY))\n        }\n    }\n    \n}\n\nextension UIView {\n    func insertRoundingCorners() {\n        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 8.0, height: 8.0))\n        let pathMaskLayer = CAShapeLayer()\n        pathMaskLayer.frame = bounds\n        pathMaskLayer.path = path.cgPath\n        layer.mask = pathMaskLayer\n    }\n\n}\n"
  },
  {
    "path": "liGame/liGame/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "liGame/liGame/View/Bottom/LiBottomCollectionView.swift",
    "content": "//\n//  LiBottomCollectionView.swift\n//  liGame\n//\n//  Created by pjhubs on 2019/9/8.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nclass LiBottomCollectionView: UICollectionView {\n\n    var longTapBegan: ((Puzzle, CGPoint) -> ())?\n    var longTapChange: ((CGPoint) -> ())?\n    var longTapEnded: (() -> ())?\n    \n\n    let cellIdentifier = \"PJLineCollectionViewCell\"\n    var viewModels = [Puzzle]()\n\n    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {\n        super.init(frame: frame, collectionViewLayout: layout)\n        initView()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n    \n    private func initView() {\n        backgroundColor = .clear\n        showsHorizontalScrollIndicator = false\n        isPagingEnabled = true\n//        isUserInteractionEnabled = true\n        dataSource = self\n        \n        register(LiBottomCollectionViewCell.self, forCellWithReuseIdentifier: \"LiBottomCollectionViewCell\")\n    }\n}\n\nextension LiBottomCollectionView: UICollectionViewDataSource {\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return viewModels.count\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: \"LiBottomCollectionViewCell\", for: indexPath) as! LiBottomCollectionViewCell\n        cell.cellIndex = indexPath.row\n        cell.gameIndex = viewModels[indexPath.row].tag\n        cell.viewModel = viewModels[indexPath.row]\n        cell.longTapBegan = { [weak self] index in\n            guard let self = self else { return }\n            guard self.viewModels.count != 0 else { return }\n            self.longTapBegan?(self.viewModels[index], cell.center)\n        }\n        cell.longTapChange = {\n            self.longTapChange?($0)\n        }\n        cell.longTapEnded = {\n            self.viewModels.remove(at: $0)\n            self.reloadData()\n            \n            self.longTapEnded?()\n        }\n        \n        return cell\n    }\n}\n"
  },
  {
    "path": "liGame/liGame/View/Bottom/LiBottomCollectionViewCell.swift",
    "content": "//\n//  LiBottomCollectionViewCell.swift\n//  liGame\n//\n//  Created by pjhubs on 2019/9/8.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nclass LiBottomCollectionViewCell: UICollectionViewCell {\n    var longTapBegan: ((Int) -> ())?\n    var longTapChange: ((CGPoint) -> ())?\n    var longTapEnded: ((Int) -> ())?\n    \n    var cellIndex: Int?\n    var gameIndex: Int?\n    \n    private var img = UIImageView()\n    private var tipLabel = UILabel()\n    \n    \n    var viewModel: Puzzle? {\n        didSet { setViewModel() }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        layer.borderWidth = 1\n        layer.borderColor = UIColor.darkGray.cgColor\n        layer.shadowColor = UIColor.black.cgColor\n        layer.shadowRadius = 10\n        layer.shadowOffset = CGSize.zero\n        layer.shadowOpacity = 1\n        \n        img.contentMode = .scaleAspectFit\n        img.frame = CGRect(x: 0, y: 0, width: width, height: height)\n        addSubview(img)\n\n        \n        tipLabel = UILabel(frame: CGRect(x: width - 10, y: top - 10, width: 17, height: 17))\n        tipLabel.font = UIFont.systemFont(ofSize: 11)\n        tipLabel.backgroundColor = UIColor.rgb(80, 80, 80)\n        tipLabel.textColor = .white\n        tipLabel.textAlignment = .center\n        tipLabel.layer.cornerRadius = tipLabel.width / 2\n        tipLabel.layer.masksToBounds = true\n        addSubview(tipLabel)\n\n        \n        let longTapGesture = UILongPressGestureRecognizer(target: self, action: .longTap)\n        addGestureRecognizer(longTapGesture)\n    }\n    \n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setViewModel() {\n        img.image = viewModel?.image\n        tipLabel.text = \"\\(gameIndex!)\"\n    }\n}\n\nextension LiBottomCollectionViewCell {\n    @objc\n    fileprivate func longTap(_ longTapGesture: UILongPressGestureRecognizer) {\n        guard let cellIndex = cellIndex else { return }\n        \n        switch longTapGesture.state {\n        case .began:\n            longTapBegan?(cellIndex)\n        case .changed:\n            var translation = longTapGesture.location(in: superview)\n            \n            let itemCount = 5\n            if cellIndex > itemCount {\n                translation.x = translation.x - CGFloat(cellIndex / itemCount * Int(screenWidth))\n            }\n            \n            let point = CGPoint(x: translation.x, y: translation.y)\n            longTapChange?(point)\n        case .ended:\n            longTapEnded?(cellIndex)\n        default: break\n        }\n    }\n}\n\nprivate extension Selector {\n    static let longTap = #selector(LiBottomCollectionViewCell.longTap(_:))\n}\n"
  },
  {
    "path": "liGame/liGame/View/Bottom/LiBottomView.swift",
    "content": "//\n//  LiBottomView.swift\n//  liGame\n//\n//  Created by pjhubs on 2019/9/8.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nclass LiBottomView: UIView {\n    var viewModels = [Puzzle]() {\n        didSet { collectionView!.viewModels = viewModels }\n    }\n\n    var moveBegin: ((Puzzle) -> Void)?\n    var moveChanged: ((CGPoint) -> Void)?\n    var moveEnd: ((Puzzle) -> Void)?\n    \n    var tempPuzzle: Puzzle?\n    var collectionView: LiBottomCollectionView?\n    var longPressView: UIView?\n    \n    private var rightPoint: CGFloat = 0\n    private var leftaPoint: CGFloat = 0\n    private var topPoint: CGFloat = 0\n    private var bottomPoint: CGFloat = 0\n    \n    public override init(frame: CGRect) {\n        super.init(frame: frame)\n    }\n    \n    convenience init(frame: CGRect, longPressView: UIView?) {\n        self.init(frame: frame)\n        self.longPressView = self\n        initView()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n    \n    private func initView() {\n        backgroundColor = .clear\n        \n        topPoint = topSafeAreaHeight\n        bottomPoint = screenHeight - bottomSafeAreaHeight\n        rightPoint = screenWidth / 2\n        leftaPoint = 0\n        \n        let effect = UIBlurEffect(style: .extraLight)\n        let effectView = UIVisualEffectView(effect: effect)\n        effectView.frame = CGRect(x: 0, y: 0, width: width, height: height)\n        addSubview(effectView)\n        \n        insertRoundingCorners()\n        \n        let collectionViewLayout = UICollectionViewFlowLayout()\n        let itemW = 50\n        let innerW = (screenWidth - 5 * 50) / 5\n        collectionViewLayout.itemSize = CGSize(width: itemW , height: itemW)\n        collectionViewLayout.minimumLineSpacing = innerW\n        collectionViewLayout.minimumInteritemSpacing = 10\n        collectionViewLayout.scrollDirection = .horizontal\n        collectionViewLayout.sectionInset = UIEdgeInsets.init(top: 0, left: innerW / 2, bottom: 0, right: innerW / 2)\n        \n        \n        collectionView = LiBottomCollectionView(frame: CGRect(x: 0, y: 0, width: width, height: height), collectionViewLayout: collectionViewLayout)\n        addSubview(collectionView!)\n        collectionView!.longTapBegan = {\n            let center = $1\n            let tempPuzzle = Puzzle(size: $0.frame.size, isCopy: false)\n            // 补上游戏索引 tag\n            tempPuzzle.tag = $0.tag\n            tempPuzzle.image = $0.image\n            tempPuzzle.center = center\n            tempPuzzle.y += self.top\n            self.tempPuzzle = tempPuzzle\n            \n            self.moveBegin?(tempPuzzle)\n        }\n        collectionView!.longTapChange = {\n            guard let tempPuzzle = self.tempPuzzle else { return }\n            tempPuzzle.center = CGPoint(x: $0.x, y: $0.y + self.top)\n\n            if tempPuzzle.right > self.rightPoint {\n                tempPuzzle.right = self.rightPoint\n            }\n            if tempPuzzle.left < self.leftaPoint {\n                tempPuzzle.left = self.leftaPoint\n            }\n            if tempPuzzle.top < self.topPoint {\n                tempPuzzle.top = self.topPoint\n            }\n            if tempPuzzle.bottom > self.bottomPoint {\n                tempPuzzle.bottom = self.bottomPoint\n            }\n            \n            self.moveChanged?(tempPuzzle.center)\n        }\n        collectionView!.longTapEnded = {\n            guard let tempPuzzle = self.tempPuzzle else { return }\n            self.moveEnd?(tempPuzzle)\n        }\n    }\n}\n\nextension LiBottomView {\n    @objc\n    fileprivate func pan(_ panGesture: UIPanGestureRecognizer) {\n        let translation = panGesture.translation(in: superview)\n        panGesture.view!.center = CGPoint(x: panGesture.view!.center.x + translation.x,\n                                          y: panGesture.view!.center.y + translation.y)\n        panGesture.setTranslation(.zero, in: superview)\n    }\n}\n\nprivate extension Selector {\n    static let pan = #selector(LiBottomView.pan(_:))\n}\n"
  },
  {
    "path": "liGame/liGame/View/Puzzle.swift",
    "content": "//\n//  Puzzle.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/6.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nclass Puzzle: UIImageView {\n\n    var panChange: ((CGPoint) -> ())?\n    var panEnded: (() -> ())?\n    var beginMovedPoint = CGPoint()\n    // 当前在 X 轴上的位置\n    var Xindex: Int?\n    // 当前在 Y 轴上的位置\n    var Yindex: Int?\n    \n    /// 是否为「拷贝」拼图元素\n    private var isCopy = false\n    private var rightPoint: CGFloat = 0\n    private var leftaPoint: CGFloat = 0\n    private var topPoint: CGFloat = 0\n    private var bottomPoint: CGFloat = 0\n    \n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n    }\n    \n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    convenience init(size: CGSize, isCopy: Bool) {\n        self.init(frame: CGRect(x: -1000, y: -1000, width: size.width, height: size.height))\n        self.isCopy = isCopy\n        \n        initView()\n    }\n    \n    \n    // MARK: Init\n    \n    private func initView() {\n        // 全部靠左，copyPuzzle 镜像对称\n        contentMode = .left\n        \n        if !isCopy {\n            isUserInteractionEnabled = true\n            \n            let panGesture = UIPanGestureRecognizer(target: self, action: .pan)\n            self.addGestureRecognizer(panGesture)\n        } else {\n            transform = CGAffineTransform(scaleX: -1, y: 1)\n        }\n    }\n    \n    /// 更新边界\n    func updateEdge() {\n        if superview != nil {\n            if !isCopy {\n                topPoint = topSafeAreaHeight\n                bottomPoint = superview!.bottom - bottomSafeAreaHeight\n                rightPoint = superview!.width / 2\n                leftaPoint = 0\n            }\n        } else {\n            if superview != nil {\n                topPoint = superview!.top\n                bottomPoint = superview!.bottom\n                rightPoint = superview!.width\n                leftaPoint = superview!.width / 2\n            }\n        }\n    }\n    \n    /// 移动 `rightPuzzle`\n    func copyPuzzleCenterChange(centerPoint: CGPoint) {\n        if !isCopy { return }\n        center = CGPoint(x: screenWidth - centerPoint.x, y: centerPoint.y)\n    }\n    \n}\n\n\nextension Puzzle {\n    @objc\n    fileprivate func pan(_ panGesture: UIPanGestureRecognizer) {\n        let translation = panGesture.translation(in: superview)\n        \n        switch panGesture.state {\n        case .began:\n            beginMovedPoint = center\n            layer.borderColor = UIColor.white.cgColor\n            layer.borderWidth = 1\n        case .changed:\n            if right > rightPoint {\n                right = rightPoint\n            }\n            if left < leftaPoint {\n                left = leftaPoint\n            }\n            if top < topPoint {\n                top = topPoint\n            }\n            if bottom > bottomPoint {\n                bottom = bottomPoint\n            }\n            \n        case .ended:\n            layer.borderWidth = 0\n            self.panEnded?()\n        default: break\n        }\n        \n        center = CGPoint(x: center.x + translation.x, y: center.y + translation.y)\n        panGesture.setTranslation(.zero, in: superview)\n        \n        panChange?(center)\n    }\n}\n\nprivate extension Selector {\n    static let pan = #selector(Puzzle.pan(_:))\n}\n"
  },
  {
    "path": "liGame/liGame/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  liGame\n//\n//  Created by 翁培钧 on 2019/9/4.\n//  Copyright © 2019 翁培钧. All rights reserved.\n//\n\nimport UIKit\n\nclass ViewController: UIViewController, PJParticleAnimationable {\n\n    private var lineImageView = UIImageView()\n    private var bottomView = LiBottomView()\n    \n    private var puzzles = [Puzzle]()\n    private var defaultPuzzles = [Puzzle]()\n    private var finalPuzzleTags = [[Int]]()\n    private var leftPuzzles = [Puzzle]()\n    private var rightPuzzles = [Puzzle]()\n    \n    private var tempCopyPuzzle: Puzzle?\n    \n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = .bgColor\n        self.winLabel.isHidden = true\n\n        \n        // 底图适配\n        let contentImage = UIImage(named: \"01\")!\n        let contentImageScale = view.width / contentImage.size.width\n        let contentImageViewHeight = contentImage.size.height * contentImageScale\n        \n        let contentImageView = UIImageView(frame: CGRect(x: 0, y: topSafeAreaHeight, width: view.width, height: contentImageViewHeight))\n        contentImageView.image = contentImage\n        \n        let imgView = UIImageView(frame: CGRect(x: view.width / 2, y: topSafeAreaHeight, width: 5, height: view.height - bottomSafeAreaHeight))\n        view.addSubview(imgView)\n        UIGraphicsBeginImageContext(imgView.frame.size) // 位图上下文绘制区域\n        imgView.image?.draw(in: imgView.bounds)\n        lineImageView = imgView\n        \n        let context:CGContext = UIGraphicsGetCurrentContext()!\n        context.setLineCap(CGLineCap.square)\n        context.setStrokeColor(UIColor.white.cgColor)\n        context.setLineWidth(3)\n        context.setLineDash(phase: 0, lengths: [10,20])\n        context.move(to: CGPoint(x: 0, y: 0))\n        context.addLine(to: CGPoint(x: 0, y: view.height))\n        context.strokePath()\n        \n        imgView.image = UIGraphicsGetImageFromCurrentImageContext()\n        \n        // 一行六个\n        let itemHCount = 3\n        let itemW = Int(view.width / CGFloat(itemHCount * 2))\n        let itemH = itemW\n        let itemVCount = Int(contentImageView.height / CGFloat(itemW))\n        \n        finalPuzzleTags = Array(repeating: Array(repeating: -1, count: itemHCount), count: itemVCount)\n        \n        for itemY in 0..<itemVCount {\n            for itemX in 0..<itemHCount {\n                let x = itemW * itemX\n                let y = itemW * itemY\n                \n                var finalItemW = itemW\n                var finalItemH = itemH\n            \n                //\n                if itemX == itemHCount - 1 {\n                    finalItemW = itemW / 3 * 2 + 2\n                }\n                \n                let img = contentImageView.image!.image(with: CGRect(x: x, y: y, width: finalItemW, height: finalItemH))\n                let puzzle = Puzzle(size: CGSize(width: itemW, height: itemW), isCopy: false)\n                puzzle.image = img\n                puzzle.tag = (itemY * itemHCount) + itemX\n                puzzles.append(puzzle)\n                defaultPuzzles.append(puzzle)\n            }\n        }\n        \n        for i in 1..<puzzles.count {\n            let index = Int(arc4random()) % i\n            if index != i {\n                puzzles.swapAt(i, index)\n            }\n        }\n        \n        \n        let bottomView = LiBottomView(frame: CGRect(x: 0, y: view.height, width: view.width, height: 64 + bottomSafeAreaHeight), longPressView: view)\n        view.addSubview(bottomView)\n        bottomView.viewModels = puzzles\n        self.bottomView = bottomView\n        \n        bottomView.moveBegin = { puzzle in\n            self.view.addSubview(puzzle)\n            self.leftPuzzles.append(puzzle)\n            puzzle.updateEdge()\n            \n            puzzle.panChange = {\n                for copyPuzzle in self.rightPuzzles {\n                    if copyPuzzle.tag == puzzle.tag {\n                        copyPuzzle.copyPuzzleCenterChange(centerPoint: $0)\n                    }\n                }\n            }\n            \n            puzzle.panEnded = {\n                for copyPuzzle in self.rightPuzzles {\n                    if copyPuzzle.tag == puzzle.tag {\n                        self.adsorb(puzzle)\n                        copyPuzzle.copyPuzzleCenterChange(centerPoint: puzzle.center)\n                        if self.isWin() { self.winAnimate() }\n                    }\n                }\n            }\n            \n            self.tempCopyPuzzle = Puzzle(size: puzzle.frame.size, isCopy: true)\n            self.tempCopyPuzzle?.image = puzzle.image\n            self.tempCopyPuzzle?.tag = puzzle.tag\n            self.view.addSubview(self.tempCopyPuzzle!)\n        }\n        \n        bottomView.moveChanged = {\n            guard let tempPuzzle = self.tempCopyPuzzle else { return }\n            \n            // 超出底部功能栏位置后才显示\n            if $0.y < self.bottomView.top {\n                tempPuzzle.copyPuzzleCenterChange(centerPoint: $0)\n            }\n            \n        }\n        \n        bottomView.moveEnd = {\n            guard let tempPuzzle = self.tempCopyPuzzle else { return }\n            tempPuzzle.removeFromSuperview()\n            \n            let copyPuzzle = Puzzle(size: $0.frame.size, isCopy: true)\n            copyPuzzle.image = tempPuzzle.image\n            copyPuzzle.tag = tempPuzzle.tag\n            self.view.addSubview(copyPuzzle)\n            self.rightPuzzles.append(copyPuzzle)\n            \n            self.adsorb(self.leftPuzzles.last!)\n            copyPuzzle.copyPuzzleCenterChange(centerPoint: self.leftPuzzles.last!.center)\n        \n            if self.isWin() { self.winAnimate() }\n        }\n        \n        \n        UIView.animate(withDuration: 0.25, delay: 0.5, options: .curveEaseIn, animations: {\n            bottomView.bottom = self.view.height\n        })\n        \n    }\n    \n    \n    /// 启动磁吸\n    private func adsorb(_ tempPuzzle: Puzzle) {\n        var tempPuzzleCenterPoint = tempPuzzle.center\n        \n        var tempPuzzleXIndex = CGFloat(Int(tempPuzzleCenterPoint.x / tempPuzzle.width))\n        if Int(tempPuzzleCenterPoint.x) % Int(tempPuzzle.width) > 0 {\n            tempPuzzleXIndex += 1\n        }\n        \n        var tempPuzzleYIndex = CGFloat(Int(tempPuzzleCenterPoint.y / tempPuzzle.height))\n        if Int(tempPuzzleCenterPoint.y) % Int(tempPuzzle.height) > 0 {\n            tempPuzzleYIndex += 1\n        }\n        \n        \n        let Xedge = tempPuzzleXIndex * tempPuzzle.width\n        let Yedge = tempPuzzleYIndex * tempPuzzle.height\n        \n        if tempPuzzleCenterPoint.x < Xedge {\n            tempPuzzleCenterPoint.x = Xedge - tempPuzzle.width / 2\n        }\n        \n        if tempPuzzleCenterPoint.y < Yedge {\n            // 当为最后一列时，往上移 20\n            if (Int(tempPuzzleYIndex) == finalPuzzleTags.count) {\n                tempPuzzleCenterPoint.y = Yedge  - tempPuzzle.height / 2 - 20\n            } else {\n                tempPuzzleCenterPoint.y = Yedge  - tempPuzzle.height / 2\n            }\n        }\n        \n        // 超出最下边\n        if (Int(tempPuzzleYIndex) > self.finalPuzzleTags.count) {\n            tempPuzzle.center = tempPuzzle.beginMovedPoint\n        }\n        \n        // 已经有的不能占据\n        if (self.finalPuzzleTags[Int(tempPuzzleYIndex - 1)][Int(tempPuzzleXIndex - 1)] == -1) {\n            self.finalPuzzleTags[Int(tempPuzzleYIndex - 1)][Int(tempPuzzleXIndex - 1)] = tempPuzzle.tag\n            \n            \n            if ((tempPuzzle.Xindex != nil) && (tempPuzzle.Yindex != nil)) {\n                self.finalPuzzleTags[tempPuzzle.Xindex!][tempPuzzle.Yindex!] = -1\n            }\n            \n            tempPuzzle.Xindex = Int(tempPuzzleYIndex - 1)\n            tempPuzzle.Yindex = Int(tempPuzzleXIndex - 1)\n            \n            tempPuzzle.center = tempPuzzleCenterPoint\n        } else {\n            tempPuzzle.center = tempPuzzle.beginMovedPoint\n        }\n    }\n    \n    /// 判赢算法\n    private func isWin() -> Bool {\n        \n        var winCount = 0\n        for (Vindex, HTags) in self.finalPuzzleTags.enumerated() {\n            for (Hindex, tag) in HTags.enumerated() {\n                let currentIndex = Vindex * 3 + Hindex\n                if defaultPuzzles.count - 1 >= currentIndex {\n                    if defaultPuzzles[currentIndex].tag == tag {\n                        winCount += 1\n                        continue\n                    }\n                }\n                \n                return false\n            }\n        }\n        \n        if winCount == defaultPuzzles.count {\n            return true\n        }\n        return false\n    }\n\n        \n    private func winAnimate() {\n        startParticleAnimation(CGPoint(x: screenWidth / 2, y: screenHeight - 10))\n        \n        UIView.animate(withDuration: 0.25, animations: {\n            self.bottomView.top = screenHeight\n        })\n        \n        for sv in self.view.subviews {\n            sv.removeFromSuperview()\n        }\n        \n        self.winLabel.isHidden = false\n        let finalManContentView = UIImageView(frame: CGRect(x: 0, y: 0,\n                                                            width: screenWidth,\n                                                            height: screenHeight - 64))\n        finalManContentView.image = UIImage(named: \"finalManContent\")\n        self.view.addSubview(finalManContentView)\n        \n        let finalMan = UIImageView(frame: CGRect(x: 0, y: 0,\n                                                 width: finalManContentView.width * 0.85,\n                                                 height: finalManContentView.width * 0.8 * 0.85))\n        finalMan.center = self.view.center\n        finalMan.image = UIImage(named: \"finalMan\")\n        self.view.addSubview(finalMan)\n        \n        \n        UIView.animate(withDuration: 0.5, animations: {\n            finalMan.transform = CGAffineTransform(rotationAngle: 0.25)\n        }) { (finished) in\n            UIView.animate(withDuration: 0.5, animations: {\n                finalMan.transform = CGAffineTransform(rotationAngle: -0.25)\n            }, completion: { (finished) in\n                UIView.animate(withDuration: 0.5, animations: {\n                    finalMan.transform = CGAffineTransform(rotationAngle: 0)\n                })\n            })\n        }\n    }\n    \n    \n    // MARK: - Lazy\n    lazy var winLabel: UILabel = {\n        let label = UILabel(frame: CGRect(x: 0, y: screenHeight - 64,\n                                          width: screenWidth, height: 64))\n        label.centerX = view.centerX\n        label.font = UIFont.systemFont(ofSize: 40,\n                                       weight: UIFont.Weight.light)\n        label.text = \"Dàlì shén\"\n        label.textAlignment = .center\n        label.textColor = .white\n        view.addSubview(label)\n        return label\n    }()\n}\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0C7ACB9C2322A97000AA4FA4 /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C7ACB9B2322A97000AA4FA4 /* UIImage+Extension.swift */; };\n\t\t0C99777123200DE600EA0130 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C99777023200DE600EA0130 /* AppDelegate.swift */; };\n\t\t0C99777323200DE600EA0130 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C99777223200DE600EA0130 /* ViewController.swift */; };\n\t\t0C99777623200DE600EA0130 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0C99777423200DE600EA0130 /* Main.storyboard */; };\n\t\t0C99777823200DE700EA0130 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0C99777723200DE700EA0130 /* Assets.xcassets */; };\n\t\t0C99777B23200DE700EA0130 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0C99777923200DE700EA0130 /* LaunchScreen.storyboard */; };\n\t\t0C9977832320135200EA0130 /* UIView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9977822320135200EA0130 /* UIView+Extension.swift */; };\n\t\t0C997785232013C300EA0130 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C997784232013C300EA0130 /* UIColor+Extension.swift */; };\n\t\t0C997788232014A500EA0130 /* Define.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C997787232014A500EA0130 /* Define.swift */; };\n\t\t0CAE10A62321E76900CFECA5 /* Puzzle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CAE10A52321E76900CFECA5 /* Puzzle.swift */; };\n\t\t0CE27C0A2371C4950032CF94 /* Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE27C092371C4950032CF94 /* Animation.swift */; };\n\t\tA64F18812325121900F531F4 /* LiBottomCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64F18802325121900F531F4 /* LiBottomCollectionView.swift */; };\n\t\tA64F18832325126800F531F4 /* LiBottomCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64F18822325126800F531F4 /* LiBottomCollectionViewCell.swift */; };\n\t\tA64F18852325133E00F531F4 /* LiBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64F18842325133E00F531F4 /* LiBottomView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t0C7ACB9B2322A97000AA4FA4 /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIImage+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t0C99776D23200DE600EA0130 /* liGame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = liGame.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0C99777023200DE600EA0130 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t0C99777223200DE600EA0130 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t0C99777523200DE600EA0130 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t0C99777723200DE700EA0130 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t0C99777A23200DE700EA0130 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t0C99777C23200DE700EA0130 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t0C9977822320135200EA0130 /* UIView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIView+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t0C997784232013C300EA0130 /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIColor+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t0C997787232014A500EA0130 /* Define.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Define.swift; sourceTree = \"<group>\"; };\n\t\t0CAE10A52321E76900CFECA5 /* Puzzle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Puzzle.swift; sourceTree = \"<group>\"; };\n\t\t0CE27C092371C4950032CF94 /* Animation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animation.swift; sourceTree = \"<group>\"; };\n\t\tA64F18802325121900F531F4 /* LiBottomCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiBottomCollectionView.swift; sourceTree = \"<group>\"; };\n\t\tA64F18822325126800F531F4 /* LiBottomCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiBottomCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\tA64F18842325133E00F531F4 /* LiBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiBottomView.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0C99776A23200DE600EA0130 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0C99776423200DE600EA0130 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C99776F23200DE600EA0130 /* liGame */,\n\t\t\t\t0C99776E23200DE600EA0130 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C99776E23200DE600EA0130 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C99776D23200DE600EA0130 /* liGame.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C99776F23200DE600EA0130 /* liGame */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C99777023200DE600EA0130 /* AppDelegate.swift */,\n\t\t\t\t0C99777223200DE600EA0130 /* ViewController.swift */,\n\t\t\t\t0C9977892321E70900EA0130 /* View */,\n\t\t\t\t0C9977862320149900EA0130 /* Extension */,\n\t\t\t\t0C99777423200DE600EA0130 /* Main.storyboard */,\n\t\t\t\t0C99777723200DE700EA0130 /* Assets.xcassets */,\n\t\t\t\t0C99777923200DE700EA0130 /* LaunchScreen.storyboard */,\n\t\t\t\t0C99777C23200DE700EA0130 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = liGame;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C9977862320149900EA0130 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CE27C092371C4950032CF94 /* Animation.swift */,\n\t\t\t\t0C9977822320135200EA0130 /* UIView+Extension.swift */,\n\t\t\t\t0C997784232013C300EA0130 /* UIColor+Extension.swift */,\n\t\t\t\t0C997787232014A500EA0130 /* Define.swift */,\n\t\t\t\t0C7ACB9B2322A97000AA4FA4 /* UIImage+Extension.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C9977892321E70900EA0130 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA64F187F232511F500F531F4 /* Bottom */,\n\t\t\t\t0CAE10A52321E76900CFECA5 /* Puzzle.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA64F187F232511F500F531F4 /* Bottom */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA64F18802325121900F531F4 /* LiBottomCollectionView.swift */,\n\t\t\t\tA64F18822325126800F531F4 /* LiBottomCollectionViewCell.swift */,\n\t\t\t\tA64F18842325133E00F531F4 /* LiBottomView.swift */,\n\t\t\t);\n\t\t\tpath = Bottom;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t0C99776C23200DE600EA0130 /* liGame */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0C99777F23200DE700EA0130 /* Build configuration list for PBXNativeTarget \"liGame\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0C99776923200DE600EA0130 /* Sources */,\n\t\t\t\t0C99776A23200DE600EA0130 /* Frameworks */,\n\t\t\t\t0C99776B23200DE600EA0130 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = liGame;\n\t\t\tproductName = liGame;\n\t\t\tproductReference = 0C99776D23200DE600EA0130 /* liGame.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0C99776523200DE600EA0130 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1020;\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = \"翁培钧\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t0C99776C23200DE600EA0130 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.2.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 0C99776823200DE600EA0130 /* Build configuration list for PBXProject \"liGame\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 0C99776423200DE600EA0130;\n\t\t\tproductRefGroup = 0C99776E23200DE600EA0130 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t0C99776C23200DE600EA0130 /* liGame */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t0C99776B23200DE600EA0130 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C99777B23200DE700EA0130 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t0C99777823200DE700EA0130 /* Assets.xcassets in Resources */,\n\t\t\t\t0C99777623200DE600EA0130 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t0C99776923200DE600EA0130 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0CE27C0A2371C4950032CF94 /* Animation.swift in Sources */,\n\t\t\t\tA64F18812325121900F531F4 /* LiBottomCollectionView.swift in Sources */,\n\t\t\t\t0C9977832320135200EA0130 /* UIView+Extension.swift in Sources */,\n\t\t\t\t0C7ACB9C2322A97000AA4FA4 /* UIImage+Extension.swift in Sources */,\n\t\t\t\t0C99777323200DE600EA0130 /* ViewController.swift in Sources */,\n\t\t\t\tA64F18832325126800F531F4 /* LiBottomCollectionViewCell.swift in Sources */,\n\t\t\t\t0C99777123200DE600EA0130 /* AppDelegate.swift in Sources */,\n\t\t\t\t0CAE10A62321E76900CFECA5 /* Puzzle.swift in Sources */,\n\t\t\t\t0C997788232014A500EA0130 /* Define.swift in Sources */,\n\t\t\t\tA64F18852325133E00F531F4 /* LiBottomView.swift in Sources */,\n\t\t\t\t0C997785232013C300EA0130 /* UIColor+Extension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t0C99777423200DE600EA0130 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t0C99777523200DE600EA0130 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C99777923200DE700EA0130 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t0C99777A23200DE700EA0130 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0C99777D23200DE700EA0130 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0C99777E23200DE700EA0130 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0C99778023200DE700EA0130 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tINFOPLIST_FILE = liGame/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.pjhubs.liGame;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0C99778123200DE700EA0130 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tINFOPLIST_FILE = liGame/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.pjhubs.liGame;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0C99776823200DE600EA0130 /* Build configuration list for PBXProject \"liGame\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0C99777D23200DE700EA0130 /* Debug */,\n\t\t\t\t0C99777E23200DE700EA0130 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0C99777F23200DE700EA0130 /* Build configuration list for PBXNativeTarget \"liGame\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0C99778023200DE700EA0130 /* Debug */,\n\t\t\t\t0C99778123200DE700EA0130 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0C99776523200DE600EA0130 /* Project object */;\n}\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:liGame.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"C53C8EF3-EAAB-4A91-9ADC-B60CB1951A02\"\n   type = \"1\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"A5B13F0E-35B7-4822-9716-FBC061A7B51E\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/ViewController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"185\"\n            endingLineNumber = \"185\"\n            landmarkName = \"adsorb(_:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"7952585F-5F4C-4FF5-8CF8-A906DBFE5810\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/ViewController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"183\"\n            endingLineNumber = \"183\"\n            landmarkName = \"adsorb(_:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>liGame.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/xcuserdata/wengpeijun.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"A059B4AD-2C70-4238-AA7A-BE509499A88D\"\n   type = \"1\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"1177E8F8-EC69-44AA-84D5-D17FAD901AB7\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/View/Bottom/LiBottomView.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"86\"\n            endingLineNumber = \"86\"\n            landmarkName = \"initView()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"55E4E40E-0AFA-4A18-85CE-B52307385F98\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/View/Bottom/LiBottomView.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"89\"\n            endingLineNumber = \"89\"\n            landmarkName = \"initView()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"78B3E6D1-98F2-44CA-B0FD-3C22CA604D29\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/View/Bottom/LiBottomView.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"92\"\n            endingLineNumber = \"92\"\n            landmarkName = \"initView()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"40D5F9E4-9A58-4E3E-801D-C6C3ACED9611\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"liGame/View/Bottom/LiBottomView.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"95\"\n            endingLineNumber = \"95\"\n            landmarkName = \"initView()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "liGame/liGame.xcodeproj/xcuserdata/wengpeijun.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>liGame.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/light-game/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  light-game\n//\n//  Created by pjhubs on 2019/8/29.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    // MARK: UISceneSession Lifecycle\n\n    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {\n        // Called when a new scene session is being created.\n        // Use this method to select a configuration to create the new scene with.\n        return UISceneConfiguration(name: \"Default Configuration\", sessionRole: connectingSceneSession.role)\n    }\n\n    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {\n        // Called when the user discards a scene session.\n        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.\n        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.\n    }\n\n\n}\n\n"
  },
  {
    "path": "lightGame/light-game/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/light-game/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/light-game/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "lightGame/light-game/ContentView.swift",
    "content": "//\n//  ContentView.swift\n//  light-game\n//\n//  Created by pjhubs on 2019/8/29.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport SwiftUI\n\nstruct ContentView: View {    \n    @ObservedObject var gameManager = GameManager(size: 5, lightSequence: [1, 2, 3])\n    \n    @State var isShowHistory = false\n    \n    var body: some View {\n        VStack {\n            HStack {\n                Text(\"\\(gameManager.timeString)\")\n                    .font(.system(size: 45))\n                    \n                Spacer()\n                \n                Text(\"\\(gameManager.clickTimes)步\")\n                    .font(.system(size: 45))\n                    \n            }\n                .padding(20)\n                        \n            ForEach(0..<gameManager.lights.count) { row in\n                HStack(spacing: 20) {\n                    ForEach(0..<self.gameManager.lights[row].count) { column in\n                        Circle()\n                            .foregroundColor(self.gameManager.lights[row][column].status ? .yellow : .gray)\n                            .opacity(self.gameManager.lights[row][column].status ? 0.8 : 0.5)\n                            .frame(width: self.gameManager.circleWidth(),\n                                   height: self.gameManager.circleWidth())\n                            .shadow(color: .yellow, radius: self.gameManager.lights[row][column].status ? 10 : 0)\n                            .overlay(RoundedRectangle(cornerRadius: self.gameManager.lights[row][column].selected ? self.gameManager.circleWidth() : 0 ).stroke(Color.black, lineWidth: self.gameManager.lights[row][column].selected ? 5 : 0 ))\n                            .onTapGesture {\n                                self.gameManager.clickTimes += 1\n                                self.gameManager.updateLightStatus(column: column, row: row, userTouch: true)\n                        }\n                    }\n                }\n                    .padding(EdgeInsets(top: 0, leading: 0, bottom: 20, trailing: 0))\n            }\n        }\n            .alert(isPresented: $gameManager.isWin) {\n                Alert(title: Text(\"黑灯瞎火，摸鱼成功！\"), dismissButton: .default(Text(\"继续摸鱼\"), action: {\n                    self.gameManager.start([3, 2, 1])\n                    self.gameManager.timerRestart()\n                }))\n        }\n    }\n}\n"
  },
  {
    "path": "lightGame/light-game/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/light-game/Model/GameController.swift",
    "content": "//\n//  GameController.swift\n//  light-game\n//\n//  Created by 翁培钧 on 2019/11/30.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport GameController\n\nclass GameController {\n    \n    var movingX = false\n    var movingY = false\n    \n    var isSelectX: ((Bool) -> ())?\n    var isSelectY: ((Bool) -> ())?\n    var isTapButtonA: (() -> ())?\n    var isTapButtonB: (() -> ())?\n    \n    init() {\n        NotificationCenter.default.addObserver(self, selector: .didConnect, name: .GCControllerDidConnect, object: nil)\n        NotificationCenter.default.addObserver(self, selector: .didConnect, name: .GCControllerDidDisconnect, object: nil)\n    }\n}\n\n\nextension GameController {\n    @objc fileprivate func gameControllerDidConnect() {\n        for controller in GCController.controllers() {\n            if controller.extendedGamepad != nil {\n                setupControllerControls(controller: controller)\n            }\n        }\n    }\n    \n    @objc fileprivate func gameControllerDidDisconnect() {\n        \n    }\n    \n    func setupControllerControls(controller: GCController) {\n        controller.extendedGamepad?.valueChangedHandler = {\n            (gamepad: GCExtendedGamepad, element: GCControllerElement) in\n            self.controllerInput(gamePad: gamepad, element: element)\n        }\n    }\n    \n    private func controllerInput(gamePad: GCExtendedGamepad, element: GCControllerElement) {\n        // gamePad 为支持的类型，element 为当前手柄的输入\n        // 不能 return，因为单次出发会带入多个按键的值\n        \n        if (gamePad.leftThumbstick == element) {\n            if (gamePad.leftThumbstick.yAxis.value != 0 && !movingY && !movingX) {\n                movingY = true\n                isSelectY?(gamePad.leftThumbstick.yAxis.value > 0)\n            } else if (gamePad.leftThumbstick.yAxis.value == 0) {\n                movingY = false\n            }\n            \n            if (gamePad.leftThumbstick.xAxis.value != 0 && !movingX && !movingY) {\n                isSelectX?(gamePad.leftThumbstick.xAxis.value > 0)\n                movingX = true\n            } else if (gamePad.leftThumbstick.xAxis.value == 0) {\n                movingX = false\n            }\n        } else if (gamePad.rightThumbstick == element) {\n            if (gamePad.rightThumbstick.xAxis.value != 0) {\n                print(\"rightThumbstickXAxis: \\(gamePad.rightThumbstick.xAxis)\")\n            }\n        } else if (gamePad.dpad == element) {\n            if (gamePad.dpad.xAxis.value != 0) {\n                isSelectX?(gamePad.dpad.xAxis.value > 0)\n            } else if (gamePad.dpad.xAxis.value == 0) {\n                \n            }\n            \n            if (gamePad.dpad.yAxis.value != 0) {\n                isSelectY?(gamePad.dpad.yAxis.value > 0)\n            } else if (gamePad.dpad.yAxis.value == 0) {\n                \n            }\n        } else if (gamePad.buttonA == element) {\n            if (gamePad.buttonA.value != 0) {\n                isTapButtonA?()\n            }\n        } else if (gamePad.buttonB == element) {\n            if (gamePad.buttonB.value != 0) {\n                isTapButtonB?()\n            }\n        } else if (gamePad.buttonY == element) {\n            if (gamePad.buttonY.value != 0) {\n//                print(\"Y-Button Pressed!\")\n//                buttonYTap = true\n            }\n        } else if (gamePad.buttonX == element) {\n            if (gamePad.buttonX.value != 0) {\n//                print(\"X-Button Pressed!\")\n//                buttonXTap = true\n            }\n        }\n    }\n}\n\nprivate extension Selector {\n    static let didConnect = #selector(GameController.gameControllerDidConnect)\n    static let didDisConnect = #selector(GameController.gameControllerDidDisconnect)\n}\n"
  },
  {
    "path": "lightGame/light-game/Model/GameManager.swift",
    "content": "//\n//  GameManager.swift\n//  light-game\n//\n//  Created by pjhubs on 2019/8/30.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport SwiftUI\nimport Combine\n\nclass GameManager: ObservableObject {\n    /// 对外发布的格式化计时器字符串\n    @Published var timeString = \"00:00\"\n    /// 点击次数\n    @Published var clickTimes = 0\n    /// 灯状态\n    @Published var lights = [[Light]]()\n    @Published var isWin = false\n    /// 当前游戏状态\n    private var currentStatus: GameStatus = .during {\n        didSet {\n            switch currentStatus {\n            case .win: isWin = true\n            case .lose: isWin = false\n            case .during: break\n            }\n        }\n    }\n    \n    /// 游戏尺寸大小\n    private(set) var size: Int?\n    /// 游戏计时器\n    private var timer: Timer?\n    /// 游戏持续时间\n    private var durations = 1\n    private var gameController = GameController()\n    private var row = 0\n    private var column = 0\n    private var pRow = 0\n    private var pColumn = 0\n    \n    /// 游戏控制器暂停\n    private var isPause = false\n    \n    // MARK: - Init\n    \n    /// 便捷构造方法\n    /// - Parameters:\n    ///   - size: 游戏布局尺寸，默认值 5x5\n    ///   - lightSequence: 亮灯序列，默认全灭\n    convenience init(size: Int = 5,\n                     lightSequence: [Int] = [Int]()) {\n        \n        self.init()\n        \n        var size = size\n        // 太大了不好玩\n        if size > 8 {\n            size = 7\n        }\n        // 太小了没意思\n        if size < 2 {\n            size = 2\n        }\n        self.size = size\n        lights = Array(repeating: Array(repeating: Light(), count: size), count: size)\n        \n        initGameController()\n        start(lightSequence)\n    }\n    \n    // MARK: Public\n    \n    /// 游戏配置\n    /// - Parameter lightSequence： 亮灯序列\n    func start(_ lightSequence: [Int]) {\n        currentStatus = .during\n        clickTimes = 0\n        updateLightStatus(lightSequence)\n        \n        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in\n            let min = self.durations >= 60 ? self.durations / 60 : 0\n            let seconds = self.durations - min * 60\n            \n            \n            let minString = min >= 10 ? \"\\(min)\" : \"0\\(min)\"\n            let secondString = self.durations - min * 60 >= 10 ? \"\\(seconds)\" : \"0\\(seconds)\"\n            self.timeString = minString + \":\" + secondString\n            \n            self.durations += 1\n        })\n    }\n    \n    /// 停止\n    func timerStop() {\n        timer?.fireDate = Date.distantFuture\n    }\n    \n    /// 重新创建\n    func timerRestart() {\n        isPause = false\n        durations = 0\n        timeString = \"00:00\"\n        timer?.fireDate = Date()\n    }\n    \n    /// 获取灯的尺寸\n    func circleWidth() -> CGFloat {\n        guard let size = size else { return 0 }\n        \n        /// 距离屏幕左右两边的间距\n        let padding: CGFloat = 20\n        /// 左右两灯之间的间距\n        let innerSpacing: CGFloat = 20\n        \n        var circleWidth = (UIScreen.main.bounds.width - padding - (CGFloat(size) * innerSpacing)) / CGFloat(size)\n        \n        // 太大了会很丑，过滤下\n        if circleWidth > UIScreen.main.bounds.width / 5 {\n            circleWidth = UIScreen.main.bounds.width / 5\n        }\n    \n        return circleWidth\n    }\n    \n    /// 通过坐标索引修改灯状态\n    /// - Parameters:\n    ///   - column: 灯-列索引\n    ///   - size: 灯-行索引\n    func updateLightStatus(column: Int, row: Int, userTouch: Bool) {\n        lights[row][column].status.toggle()\n        self.column = row\n        self.row = column\n        \n        // 上\n        let top = row - 1\n        if !(top < 0) {\n            lights[top][column].status.toggle()\n        }\n        // 下\n        let bottom = row + 1\n        if !(bottom > lights.count - 1) {\n            lights[bottom][column].status.toggle()\n        }\n        // 左\n        let left = column - 1\n        if !(left < 0) {\n            lights[row][left].status.toggle()\n        }\n        // 右\n        let right = column + 1\n        if !(right > lights.count - 1) {\n            lights[row][right].status.toggle()\n        }\n        \n        updateGameStatus()\n        \n        if (userTouch) {\n            disSelectedGameControllerStatus()\n        }\n    }\n    \n    // MARK: Private\n    \n    /// 通过亮灯序列修改灯状态\n    /// - Parameter lightSequence: 亮灯序列\n    private func updateLightStatus(_ lightSequence: [Int]) {\n        guard let size = size else { return }\n        for lightIndex in lightSequence {\n            var index = lightIndex\n            // 防止数组越出最大边界处\n            if index >= size * size {\n                index = size * size - 1\n            }\n            let row = lightIndex / size\n            let column = lightIndex % size\n            // column 不为 0，说明非最后一个\n            // row 为 0，说明为第一行\n            updateLightStatus(column: column, row: row, userTouch: true)\n        }\n    }\n    \n    private func updateLightSelected() {\n        lights[pColumn][pRow].selected = false\n        lights[column][row].selected = true\n        \n        pRow = row\n        pColumn = column\n    }\n    \n    private func disSelectedGameControllerStatus() {\n        lights[pColumn][pRow].selected = false\n    }\n    \n    /// 判赢\n    private func updateGameStatus() {\n        guard let size = size else { return }\n        \n        var lightingCount = 0\n        \n        \n        for lightArr in lights {\n            for light in lightArr {\n                if light.status { lightingCount += 1 }\n            }\n        }\n        \n        if lightingCount == size * size {\n            timerStop()\n            currentStatus = .lose\n            return\n        }\n        \n        if lightingCount == 0 {\n            timerStop()\n            currentStatus = .win\n            isPause = true\n            return\n        }\n    }\n    \n    private func initGameController() {\n        gameController.isSelectX = {\n            guard !self.isPause else { return }\n            \n            if $0 {\n                if (self.row < self.lights.count - 1) {\n                    self.row += 1\n                }\n            } else {\n                if self.row > 0 {\n                    self.row -= 1\n                }\n            }\n            \n            self.updateLightSelected()\n        }\n        \n        gameController.isSelectY = {\n            guard !self.isPause else { return }\n            \n            if $0 {\n                if (self.column > 0) {\n                    self.column -= 1\n                }\n            } else {\n                if (self.column < self.lights.count - 1) {\n                    self.column += 1\n                }\n            }\n            \n            self.updateLightSelected()\n        }\n        \n        gameController.isTapButtonA = {\n            self.clickTimes += 1\n            self.updateLightStatus(column: self.row, row: self.column, userTouch: false)\n        }\n    }\n}\n\nextension GameManager {\n    enum GameStatus {\n        /// 赢\n        case win\n        /// 输\n        case lose\n        /// 进行中\n        case during\n    }\n}\n"
  },
  {
    "path": "lightGame/light-game/Model/Light.swift",
    "content": "//\n//  Light.swift\n//  light-game\n//\n//  Created by pjhubs on 2019/8/29.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport Foundation\n\nstruct Light {\n    /// 开关状态\n    var status = false\n    \n    /// 选中状态\n    var selected = false\n}\n"
  },
  {
    "path": "lightGame/light-game/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/light-game/SceneDelegate.swift",
    "content": "//\n//  SceneDelegate.swift\n//  light-game\n//\n//  Created by pjhubs on 2019/8/29.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport UIKit\nimport SwiftUI\n\nclass SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n    var window: UIWindow?\n\n\n    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.\n        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.\n        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).\n\n        // Create the SwiftUI view that provides the window contents.\n        #if !os(watchOS)\n            let contentView = ContentView()\n        #else\n            let contentView = WatchContentView()\n        #endif\n\n        // Use a UIHostingController as window root view controller.\n        if let windowScene = scene as? UIWindowScene {\n            let window = UIWindow(windowScene: windowScene)\n            window.rootViewController = UIHostingController(rootView: contentView)\n            self.window = window\n            window.makeKeyAndVisible()\n        }\n    }\n\n    func sceneDidDisconnect(_ scene: UIScene) {\n        // Called as the scene is being released by the system.\n        // This occurs shortly after the scene enters the background, or when its session is discarded.\n        // Release any resources associated with this scene that can be re-created the next time the scene connects.\n        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).\n    }\n\n    func sceneDidBecomeActive(_ scene: UIScene) {\n        // Called when the scene has moved from an inactive state to an active state.\n        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.\n    }\n\n    func sceneWillResignActive(_ scene: UIScene) {\n        // Called when the scene will move from an active state to an inactive state.\n        // This may occur due to temporary interruptions (ex. an incoming phone call).\n    }\n\n    func sceneWillEnterForeground(_ scene: UIScene) {\n        // Called as the scene transitions from the background to the foreground.\n        // Use this method to undo the changes made on entering the background.\n    }\n\n    func sceneDidEnterBackground(_ scene: UIScene) {\n        // Called as the scene transitions from the foreground to the background.\n        // Use this method to save data, release shared resources, and store enough scene-specific state information\n        // to restore the scene back to its current state.\n    }\n\n\n}\n\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0C39CB06239BEF1100444729 /* Light.swift in Sources */ = {isa = PBXBuildFile; fileRef = A601DB2A2317775100327867 /* Light.swift */; };\n\t\t0C39CB0B239BF2EE00444729 /* WatchGameManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C39CB0A239BF2EE00444729 /* WatchGameManager.swift */; };\n\t\t0C39CB0D239C020000444729 /* WatchContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C39CB0C239C020000444729 /* WatchContentView.swift */; };\n\t\t0C3DCCE42392A5CC00C762A9 /* GameController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C3DCCE32392A5CC00C762A9 /* GameController.swift */; };\n\t\t0C751029239BEAA500E85E20 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0C751027239BEAA500E85E20 /* Interface.storyboard */; };\n\t\t0C75102B239BEAA800E85E20 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0C75102A239BEAA800E85E20 /* Assets.xcassets */; };\n\t\t0C751032239BEAA900E85E20 /* watchapp Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0C751031239BEAA900E85E20 /* watchapp Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t0C751039239BEAA900E85E20 /* HostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C751038239BEAA900E85E20 /* HostingController.swift */; };\n\t\t0C75103B239BEAA900E85E20 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C75103A239BEAA900E85E20 /* ExtensionDelegate.swift */; };\n\t\t0C75103D239BEAA900E85E20 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0C75103C239BEAA900E85E20 /* Assets.xcassets */; };\n\t\t0C751040239BEAA900E85E20 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0C75103F239BEAA900E85E20 /* Preview Assets.xcassets */; };\n\t\t0C751044239BEAA900E85E20 /* watchapp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 0C751025239BEAA500E85E20 /* watchapp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\tA601DB2B2317775100327867 /* Light.swift in Sources */ = {isa = PBXBuildFile; fileRef = A601DB2A2317775100327867 /* Light.swift */; };\n\t\tA62D002F231904F80062A70E /* GameManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62D002E231904F80062A70E /* GameManager.swift */; };\n\t\tA676EA93231771D3002074BF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A676EA92231771D3002074BF /* AppDelegate.swift */; };\n\t\tA676EA95231771D3002074BF /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A676EA94231771D3002074BF /* SceneDelegate.swift */; };\n\t\tA676EA97231771D3002074BF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A676EA96231771D3002074BF /* ContentView.swift */; };\n\t\tA676EA99231771D5002074BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A676EA98231771D5002074BF /* Assets.xcassets */; };\n\t\tA676EA9C231771D5002074BF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A676EA9B231771D5002074BF /* Preview Assets.xcassets */; };\n\t\tA676EA9F231771D5002074BF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A676EA9D231771D5002074BF /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t0C751033239BEAA900E85E20 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = A676EA87231771D2002074BF /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 0C751030239BEAA900E85E20;\n\t\t\tremoteInfo = \"watchapp Extension\";\n\t\t};\n\t\t0C751042239BEAA900E85E20 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = A676EA87231771D2002074BF /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 0C751024239BEAA500E85E20;\n\t\t\tremoteInfo = watchapp;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t0C751045239BEAA900E85E20 /* Embed Watch Content */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"$(CONTENTS_FOLDER_PATH)/Watch\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t\t0C751044239BEAA900E85E20 /* watchapp.app in Embed Watch Content */,\n\t\t\t);\n\t\t\tname = \"Embed Watch Content\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t0C751048239BEAA900E85E20 /* Embed App Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t0C751032239BEAA900E85E20 /* watchapp Extension.appex in Embed App Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed App Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t0C39CB0A239BF2EE00444729 /* WatchGameManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchGameManager.swift; sourceTree = \"<group>\"; };\n\t\t0C39CB0C239C020000444729 /* WatchContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchContentView.swift; sourceTree = \"<group>\"; };\n\t\t0C3DCCE32392A5CC00C762A9 /* GameController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameController.swift; sourceTree = \"<group>\"; };\n\t\t0C751025239BEAA500E85E20 /* watchapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = watchapp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0C751028239BEAA500E85E20 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = \"<group>\"; };\n\t\t0C75102A239BEAA800E85E20 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t0C75102C239BEAA800E85E20 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t0C751031239BEAA900E85E20 /* watchapp Extension.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = \"watchapp Extension.appex\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0C751038239BEAA900E85E20 /* HostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostingController.swift; sourceTree = \"<group>\"; };\n\t\t0C75103A239BEAA900E85E20 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = \"<group>\"; };\n\t\t0C75103C239BEAA900E85E20 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t0C75103F239BEAA900E85E20 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\t0C751041239BEAA900E85E20 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tA601DB2A2317775100327867 /* Light.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Light.swift; sourceTree = \"<group>\"; };\n\t\tA62D002E231904F80062A70E /* GameManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameManager.swift; sourceTree = \"<group>\"; };\n\t\tA676EA8F231771D3002074BF /* light-game.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"light-game.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA676EA92231771D3002074BF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tA676EA94231771D3002074BF /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\tA676EA96231771D3002074BF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\tA676EA98231771D5002074BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tA676EA9B231771D5002074BF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\tA676EA9E231771D5002074BF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\tA676EAA0231771D5002074BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0C75102E239BEAA900E85E20 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA676EA8C231771D2002074BF /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0C751026239BEAA500E85E20 /* watchapp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C751027239BEAA500E85E20 /* Interface.storyboard */,\n\t\t\t\t0C75102A239BEAA800E85E20 /* Assets.xcassets */,\n\t\t\t\t0C75102C239BEAA800E85E20 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = watchapp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C751035239BEAA900E85E20 /* watchapp Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C751038239BEAA900E85E20 /* HostingController.swift */,\n\t\t\t\t0C39CB0C239C020000444729 /* WatchContentView.swift */,\n\t\t\t\t0C39CB0A239BF2EE00444729 /* WatchGameManager.swift */,\n\t\t\t\t0C75103A239BEAA900E85E20 /* ExtensionDelegate.swift */,\n\t\t\t\t0C75103C239BEAA900E85E20 /* Assets.xcassets */,\n\t\t\t\t0C751041239BEAA900E85E20 /* Info.plist */,\n\t\t\t\t0C75103E239BEAA900E85E20 /* Preview Content */,\n\t\t\t);\n\t\t\tpath = \"watchapp Extension\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0C75103E239BEAA900E85E20 /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0C75103F239BEAA900E85E20 /* Preview Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA601DB292317774600327867 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA601DB2A2317775100327867 /* Light.swift */,\n\t\t\t\tA62D002E231904F80062A70E /* GameManager.swift */,\n\t\t\t\t0C3DCCE32392A5CC00C762A9 /* GameController.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA676EA86231771D2002074BF = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA676EA91231771D3002074BF /* light-game */,\n\t\t\t\t0C751026239BEAA500E85E20 /* watchapp */,\n\t\t\t\t0C751035239BEAA900E85E20 /* watchapp Extension */,\n\t\t\t\tA676EA90231771D3002074BF /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA676EA90231771D3002074BF /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA676EA8F231771D3002074BF /* light-game.app */,\n\t\t\t\t0C751025239BEAA500E85E20 /* watchapp.app */,\n\t\t\t\t0C751031239BEAA900E85E20 /* watchapp Extension.appex */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA676EA91231771D3002074BF /* light-game */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA676EA92231771D3002074BF /* AppDelegate.swift */,\n\t\t\t\tA676EA94231771D3002074BF /* SceneDelegate.swift */,\n\t\t\t\tA676EA96231771D3002074BF /* ContentView.swift */,\n\t\t\t\tA601DB292317774600327867 /* Model */,\n\t\t\t\tA676EA98231771D5002074BF /* Assets.xcassets */,\n\t\t\t\tA676EA9D231771D5002074BF /* LaunchScreen.storyboard */,\n\t\t\t\tA676EAA0231771D5002074BF /* Info.plist */,\n\t\t\t\tA676EA9A231771D5002074BF /* Preview Content */,\n\t\t\t);\n\t\t\tpath = \"light-game\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA676EA9A231771D5002074BF /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA676EA9B231771D5002074BF /* Preview Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t0C751024239BEAA500E85E20 /* watchapp */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0C75104C239BEAA900E85E20 /* Build configuration list for PBXNativeTarget \"watchapp\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0C751023239BEAA500E85E20 /* Resources */,\n\t\t\t\t0C751048239BEAA900E85E20 /* Embed App Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t0C751034239BEAA900E85E20 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = watchapp;\n\t\t\tproductName = watchapp;\n\t\t\tproductReference = 0C751025239BEAA500E85E20 /* watchapp.app */;\n\t\t\tproductType = \"com.apple.product-type.application.watchapp2\";\n\t\t};\n\t\t0C751030239BEAA900E85E20 /* watchapp Extension */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0C75104B239BEAA900E85E20 /* Build configuration list for PBXNativeTarget \"watchapp Extension\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0C75102D239BEAA900E85E20 /* Sources */,\n\t\t\t\t0C75102E239BEAA900E85E20 /* Frameworks */,\n\t\t\t\t0C75102F239BEAA900E85E20 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"watchapp Extension\";\n\t\t\tproductName = \"watchapp Extension\";\n\t\t\tproductReference = 0C751031239BEAA900E85E20 /* watchapp Extension.appex */;\n\t\t\tproductType = \"com.apple.product-type.watchkit2-extension\";\n\t\t};\n\t\tA676EA8E231771D2002074BF /* light-game */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A676EAA3231771D5002074BF /* Build configuration list for PBXNativeTarget \"light-game\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA676EA8B231771D2002074BF /* Sources */,\n\t\t\t\tA676EA8C231771D2002074BF /* Frameworks */,\n\t\t\t\tA676EA8D231771D2002074BF /* Resources */,\n\t\t\t\t0C751045239BEAA900E85E20 /* Embed Watch Content */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t0C751043239BEAA900E85E20 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"light-game\";\n\t\t\tproductName = \"light-game\";\n\t\t\tproductReference = A676EA8F231771D3002074BF /* light-game.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tA676EA87231771D2002074BF /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1120;\n\t\t\t\tLastUpgradeCheck = 1100;\n\t\t\t\tORGANIZATIONNAME = PJHubs;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t0C751024239BEAA500E85E20 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.2.1;\n\t\t\t\t\t};\n\t\t\t\t\t0C751030239BEAA900E85E20 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.2.1;\n\t\t\t\t\t};\n\t\t\t\t\tA676EA8E231771D2002074BF = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = A676EA8A231771D2002074BF /* Build configuration list for PBXProject \"light-game\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = A676EA86231771D2002074BF;\n\t\t\tproductRefGroup = A676EA90231771D3002074BF /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tA676EA8E231771D2002074BF /* light-game */,\n\t\t\t\t0C751024239BEAA500E85E20 /* watchapp */,\n\t\t\t\t0C751030239BEAA900E85E20 /* watchapp Extension */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t0C751023239BEAA500E85E20 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C75102B239BEAA800E85E20 /* Assets.xcassets in Resources */,\n\t\t\t\t0C751029239BEAA500E85E20 /* Interface.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t0C75102F239BEAA900E85E20 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C751040239BEAA900E85E20 /* Preview Assets.xcassets in Resources */,\n\t\t\t\t0C75103D239BEAA900E85E20 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA676EA8D231771D2002074BF /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA676EA9F231771D5002074BF /* LaunchScreen.storyboard in Resources */,\n\t\t\t\tA676EA9C231771D5002074BF /* Preview Assets.xcassets in Resources */,\n\t\t\t\tA676EA99231771D5002074BF /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t0C75102D239BEAA900E85E20 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C751039239BEAA900E85E20 /* HostingController.swift in Sources */,\n\t\t\t\t0C39CB0B239BF2EE00444729 /* WatchGameManager.swift in Sources */,\n\t\t\t\t0C39CB0D239C020000444729 /* WatchContentView.swift in Sources */,\n\t\t\t\t0C39CB06239BEF1100444729 /* Light.swift in Sources */,\n\t\t\t\t0C75103B239BEAA900E85E20 /* ExtensionDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA676EA8B231771D2002074BF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA676EA93231771D3002074BF /* AppDelegate.swift in Sources */,\n\t\t\t\t0C3DCCE42392A5CC00C762A9 /* GameController.swift in Sources */,\n\t\t\t\tA676EA95231771D3002074BF /* SceneDelegate.swift in Sources */,\n\t\t\t\tA601DB2B2317775100327867 /* Light.swift in Sources */,\n\t\t\t\tA676EA97231771D3002074BF /* ContentView.swift in Sources */,\n\t\t\t\tA62D002F231904F80062A70E /* GameManager.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t0C751034239BEAA900E85E20 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 0C751030239BEAA900E85E20 /* watchapp Extension */;\n\t\t\ttargetProxy = 0C751033239BEAA900E85E20 /* PBXContainerItemProxy */;\n\t\t};\n\t\t0C751043239BEAA900E85E20 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 0C751024239BEAA500E85E20 /* watchapp */;\n\t\t\ttargetProxy = 0C751042239BEAA900E85E20 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t0C751027239BEAA500E85E20 /* Interface.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t0C751028239BEAA500E85E20 /* Base */,\n\t\t\t);\n\t\t\tname = Interface.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA676EA9D231771D5002074BF /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tA676EA9E231771D5002074BF /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0C751046239BEAA900E85E20 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tIBSC_MODULE = watchapp_Extension;\n\t\t\t\tINFOPLIST_FILE = watchapp/Info.plist;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game.watchkitapp\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0C751047239BEAA900E85E20 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tIBSC_MODULE = watchapp_Extension;\n\t\t\t\tINFOPLIST_FILE = watchapp/Info.plist;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game.watchkitapp\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0C751049239BEAA900E85E20 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"watchapp Extension/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = \"watchapp Extension/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game.watchkitapp.watchkitextension\";\n\t\t\t\tPRODUCT_NAME = \"${TARGET_NAME}\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0C75104A239BEAA900E85E20 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"watchapp Extension/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = \"watchapp Extension/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game.watchkitapp.watchkitextension\";\n\t\t\t\tPRODUCT_NAME = \"${TARGET_NAME}\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA676EAA1231771D5002074BF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA676EAA2231771D5002074BF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA676EAA4231771D5002074BF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"light-game/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = \"light-game/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA676EAA5231771D5002074BF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"light-game/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = U6J5965DZK;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = \"light-game/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pjhubs.light-game\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0C75104B239BEAA900E85E20 /* Build configuration list for PBXNativeTarget \"watchapp Extension\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0C751049239BEAA900E85E20 /* Debug */,\n\t\t\t\t0C75104A239BEAA900E85E20 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0C75104C239BEAA900E85E20 /* Build configuration list for PBXNativeTarget \"watchapp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0C751046239BEAA900E85E20 /* Debug */,\n\t\t\t\t0C751047239BEAA900E85E20 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA676EA8A231771D2002074BF /* Build configuration list for PBXProject \"light-game\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA676EAA1231771D5002074BF /* Debug */,\n\t\t\t\tA676EAA2231771D5002074BF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA676EAA3231771D5002074BF /* Build configuration list for PBXNativeTarget \"light-game\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA676EAA4231771D5002074BF /* Debug */,\n\t\t\t\tA676EAA5231771D5002074BF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = A676EA87231771D2002074BF /* Project object */;\n}\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:light-game.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"1E1C8DCA-4FD3-4651-B05E-8AE053F638C6\"\n   type = \"1\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"610E61EB-F981-4607-9600-C4AD0106CE62\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"light-game/Model/GameManager.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"193\"\n            endingLineNumber = \"193\"\n            landmarkName = \"disSelectedGameControllerStatus()\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"2B2D5D59-5599-4E4F-A239-57736FACA039\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"light-game/Model/GameController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"71\"\n            endingLineNumber = \"71\"\n            landmarkName = \"controllerInput(gamePad:element:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"1D26BA74-F3FE-48DE-A097-4C9C3CCC5024\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"light-game/Model/GameController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"52\"\n            endingLineNumber = \"52\"\n            landmarkName = \"controllerInput(gamePad:element:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"8F94D89E-687E-4D1E-ABCC-FFFFB815A3F3\"\n            shouldBeEnabled = \"No\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"light-game/Model/GameController.swift\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"67\"\n            endingLineNumber = \"67\"\n            landmarkName = \"controllerInput(gamePad:element:)\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/xcuserdata/pjhubs.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>light-game.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<key>watchapp.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/xcuserdata/wengpeijun.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"9170105D-1022-4B15-93E6-44F08E915BF2\"\n   type = \"1\"\n   version = \"2.0\">\n</Bucket>\n"
  },
  {
    "path": "lightGame/light-game.xcodeproj/xcuserdata/wengpeijun.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>light-game.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/watchapp/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"24x24\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"notificationCenter\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"size\" : \"27.5x27.5\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"notificationCenter\",\n      \"subtype\" : \"42mm\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"watch\",\n      \"role\" : \"companionSettings\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"watch\",\n      \"role\" : \"companionSettings\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"appLauncher\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"size\" : \"44x44\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"appLauncher\",\n      \"subtype\" : \"40mm\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"appLauncher\",\n      \"subtype\" : \"44mm\"\n    },\n    {\n      \"size\" : \"86x86\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"quickLook\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"size\" : \"98x98\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"quickLook\",\n      \"subtype\" : \"42mm\"\n    },\n    {\n      \"size\" : \"108x108\",\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"role\" : \"quickLook\",\n      \"subtype\" : \"44mm\"\n    },\n    {\n      \"idiom\" : \"watch-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp/Base.lproj/Interface.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder.WatchKit.Storyboard\" version=\"3.0\" toolsVersion=\"15505\" targetRuntime=\"watchKit\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"3mp-fW-waa\">\n    <device id=\"watch38\"/>\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"15510\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBWatchKitPlugin\" version=\"15501\"/>\n    </dependencies>\n    <scenes>\n        <!--Hosting Controller-->\n        <scene sceneID=\"aou-V4-d1y\">\n            <objects>\n                <hostingController id=\"3mp-fW-waa\" customClass=\"HostingController\" customModule=\"watchapp\" customModuleProvider=\"target\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"34\" y=\"31\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "lightGame/watchapp/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>light-game</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>WKCompanionAppBundleIdentifier</key>\n\t<string>com.pjhubs.light-game</string>\n\t<key>WKWatchKitApp</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Contents.json",
    "content": "{\n  \"assets\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Circular.imageset\",\n      \"role\" : \"circular\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Extra Large.imageset\",\n      \"role\" : \"extra-large\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Graphic Bezel.imageset\",\n      \"role\" : \"graphic-bezel\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Graphic Circular.imageset\",\n      \"role\" : \"graphic-circular\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Graphic Corner.imageset\",\n      \"role\" : \"graphic-corner\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Graphic Large Rectangular.imageset\",\n      \"role\" : \"graphic-large-rectangular\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Modular.imageset\",\n      \"role\" : \"modular\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"filename\" : \"Utilitarian.imageset\",\n      \"role\" : \"utilitarian\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \"<=145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">161\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">145\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"scale\" : \"2x\",\n      \"screen-width\" : \">183\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/ExtensionDelegate.swift",
    "content": "//\n//  ExtensionDelegate.swift\n//  watchapp Extension\n//\n//  Created by 翁培钧 on 2019/12/7.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport WatchKit\n\nclass ExtensionDelegate: NSObject, WKExtensionDelegate {\n\n    func applicationDidFinishLaunching() {\n        // Perform any final initialization of your application.\n    }\n\n    func applicationDidBecomeActive() {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillResignActive() {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, etc.\n    }\n\n    func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {\n        // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.\n        for task in backgroundTasks {\n            // Use a switch statement to check the task type\n            switch task {\n            case let backgroundTask as WKApplicationRefreshBackgroundTask:\n                // Be sure to complete the background task once you’re done.\n                backgroundTask.setTaskCompletedWithSnapshot(false)\n            case let snapshotTask as WKSnapshotRefreshBackgroundTask:\n                // Snapshot tasks have a unique completion call, make sure to set your expiration date\n                snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil)\n            case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask:\n                // Be sure to complete the connectivity task once you’re done.\n                connectivityTask.setTaskCompletedWithSnapshot(false)\n            case let urlSessionTask as WKURLSessionRefreshBackgroundTask:\n                // Be sure to complete the URL session task once you’re done.\n                urlSessionTask.setTaskCompletedWithSnapshot(false)\n            case let relevantShortcutTask as WKRelevantShortcutRefreshBackgroundTask:\n                // Be sure to complete the relevant-shortcut task once you're done.\n                relevantShortcutTask.setTaskCompletedWithSnapshot(false)\n            case let intentDidRunTask as WKIntentDidRunRefreshBackgroundTask:\n                // Be sure to complete the intent-did-run task once you're done.\n                intentDidRunTask.setTaskCompletedWithSnapshot(false)\n            default:\n                // make sure to complete unhandled task types\n                task.setTaskCompletedWithSnapshot(false)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "lightGame/watchapp Extension/HostingController.swift",
    "content": "//\n//  HostingController.swift\n//  watchapp Extension\n//\n//  Created by 翁培钧 on 2019/12/7.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport WatchKit\nimport Foundation\nimport SwiftUI\n\nclass HostingController: WKHostingController<ContentView> {\n    override var body: ContentView {\n        return ContentView()\n    }\n}\n"
  },
  {
    "path": "lightGame/watchapp Extension/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>watchapp Extension</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionAttributes</key>\n\t\t<dict>\n\t\t\t<key>WKAppBundleIdentifier</key>\n\t\t\t<string>com.pjhubs.light-game.watchkitapp</string>\n\t\t</dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.watchkit</string>\n\t</dict>\n\t<key>WKExtensionDelegateClassName</key>\n\t<string>$(PRODUCT_MODULE_NAME).ExtensionDelegate</string>\n\t<key>WKRunsIndependentlyOfCompanionApp</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lightGame/watchapp Extension/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "lightGame/watchapp Extension/WatchContentView.swift",
    "content": "//\n//  WatchContentView.swift\n//  watchapp Extension\n//\n//  Created by 翁培钧 on 2019/12/7.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport SwiftUI\n\nstruct ContentView: View {\n    @ObservedObject var gameManager = WatchGameManager(size: 3, lightSequence: [1, 2, 3])\n    \n    @State var isShowHistory = false\n    \n    var body: some View {\n        VStack {\n            ForEach(0..<gameManager.lights.count) { row in\n                HStack {\n                    ForEach(0..<self.gameManager.lights[row].count) { column in\n                        Circle()\n                            .foregroundColor(self.gameManager.lights[row][column].status ? .yellow : .gray)\n                            .opacity(self.gameManager.lights[row][column].status ? 0.8 : 0.5)\n                            .frame(width: self.gameManager.circleWidth(),\n                                   height: self.gameManager.circleWidth())\n                            .shadow(color: .yellow, radius: self.gameManager.lights[row][column].status ? 10 : 0)\n                            .padding(10)\n                            .overlay(RoundedRectangle(cornerRadius: self.gameManager.lights[row][column].selected ? self.gameManager.circleWidth() : 0 ).stroke(Color.black, lineWidth: self.gameManager.lights[row][column].selected ? 5 : 0 ))\n                            .onTapGesture {\n                                self.gameManager.clickTimes += 1\n                                self.gameManager.updateLightStatus(column: column, row: row, userTouch: true)\n                        }\n                    }\n                }\n            }\n        }\n            .alert(isPresented: $gameManager.isWin) {\n                Alert(title: Text(\"黑灯瞎火，摸鱼成功！\"), dismissButton: .default(Text(\"继续摸鱼\"), action: {\n                    self.gameManager.start([3, 2, 1])\n                    self.gameManager.timerRestart()\n                }))\n        }\n    }\n}\n\n\nstruct SwiftUIView_Previews: PreviewProvider {\n    static var previews: some View {\n        ContentView()\n    }\n}\n"
  },
  {
    "path": "lightGame/watchapp Extension/WatchGameManager.swift",
    "content": "//\n//  WatchGameManager.swift\n//  watchapp Extension\n//\n//  Created by 翁培钧 on 2019/12/7.\n//  Copyright © 2019 PJHubs. All rights reserved.\n//\n\nimport SwiftUI\nimport Combine\n\nclass WatchGameManager: ObservableObject {\n    /// 对外发布的格式化计时器字符串\n    @Published var timeString = \"00:00\"\n    /// 点击次数\n    @Published var clickTimes = 0\n    /// 灯状态\n    @Published var lights = [[Light]]()\n    @Published var isWin = false\n    /// 当前游戏状态\n    private var currentStatus: WatchGameStatus = .during {\n        didSet {\n            switch currentStatus {\n            case .win: isWin = true\n            case .lose: isWin = false\n            case .during: break\n            }\n        }\n    }\n    \n    /// 游戏尺寸大小\n    private(set) var size: Int?\n    /// 游戏计时器\n    private var timer: Timer?\n    /// 游戏持续时间\n    private var durations = 1\n    private var row = 0\n    private var column = 0\n    private var pRow = 0\n    private var pColumn = 0\n    \n    /// 游戏控制器暂停\n    private var isPause = false\n    \n    // MARK: - Init\n    \n    /// 便捷构造方法\n    /// - Parameters:\n    ///   - size: 游戏布局尺寸，默认值 5x5\n    ///   - lightSequence: 亮灯序列，默认全灭\n    convenience init(size: Int = 5,\n                     lightSequence: [Int] = [Int]()) {\n        \n        self.init()\n        \n        var size = size\n        // 太大了不好玩\n        if size > 8 {\n            size = 7\n        }\n        // 太小了没意思\n        if size < 2 {\n            size = 2\n        }\n        self.size = size\n        lights = Array(repeating: Array(repeating: Light(), count: size), count: size)\n        \n//        initGameController()\n        start(lightSequence)\n    }\n    \n    // MARK: Public\n    \n    /// 游戏配置\n    /// - Parameter lightSequence： 亮灯序列\n    func start(_ lightSequence: [Int]) {\n        currentStatus = .during\n        clickTimes = 0\n        updateLightStatus(lightSequence)\n        \n        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in\n            let min = self.durations >= 60 ? self.durations / 60 : 0\n            let seconds = self.durations - min * 60\n            \n            \n            let minString = min >= 10 ? \"\\(min)\" : \"0\\(min)\"\n            let secondString = self.durations - min * 60 >= 10 ? \"\\(seconds)\" : \"0\\(seconds)\"\n            self.timeString = minString + \":\" + secondString\n            \n            self.durations += 1\n        })\n    }\n    \n    /// 停止\n    func timerStop() {\n        timer?.fireDate = Date.distantFuture\n    }\n    \n    /// 重新创建\n    func timerRestart() {\n        isPause = false\n        durations = 0\n        timeString = \"00:00\"\n        timer?.fireDate = Date()\n    }\n    \n    /// 获取灯的尺寸\n    func circleWidth() -> CGFloat {\n        guard let size = size else { return 0 }\n        \n        /// 距离屏幕左右两边的间距\n        let padding: CGFloat = 20\n        /// 左右两灯之间的间距\n        let innerSpacing: CGFloat = 20\n        \n        let screenBounds = WKInterfaceDevice.current().screenBounds\n        var circleWidth = (screenBounds.width - padding - (CGFloat(size) * innerSpacing)) / CGFloat(size)\n        \n        // 太大了会很丑，过滤下\n        if circleWidth > screenBounds.width / 5 {\n            circleWidth = screenBounds.width / 5\n        }\n    \n        return circleWidth\n    }\n    \n    /// 通过坐标索引修改灯状态\n    /// - Parameters:\n    ///   - column: 灯-列索引\n    ///   - size: 灯-行索引\n    func updateLightStatus(column: Int, row: Int, userTouch: Bool) {\n        lights[row][column].status.toggle()\n        self.column = row\n        self.row = column\n        \n        // 上\n        let top = row - 1\n        if !(top < 0) {\n            lights[top][column].status.toggle()\n        }\n        // 下\n        let bottom = row + 1\n        if !(bottom > lights.count - 1) {\n            lights[bottom][column].status.toggle()\n        }\n        // 左\n        let left = column - 1\n        if !(left < 0) {\n            lights[row][left].status.toggle()\n        }\n        // 右\n        let right = column + 1\n        if !(right > lights.count - 1) {\n            lights[row][right].status.toggle()\n        }\n        \n        updateGameStatus()\n        \n//        if (userTouch) {\n//            disSelectedGameControllerStatus()\n//        }\n    }\n    \n    // MARK: Private\n    \n    /// 通过亮灯序列修改灯状态\n    /// - Parameter lightSequence: 亮灯序列\n    private func updateLightStatus(_ lightSequence: [Int]) {\n        guard let size = size else { return }\n        for lightIndex in lightSequence {\n            var index = lightIndex\n            // 防止数组越出最大边界处\n            if index >= size * size {\n                index = size * size - 1\n            }\n            let row = lightIndex / size\n            let column = lightIndex % size\n            // column 不为 0，说明非最后一个\n            // row 为 0，说明为第一行\n            updateLightStatus(column: column, row: row, userTouch: true)\n        }\n    }\n    \n    private func updateLightSelected() {\n        lights[pColumn][pRow].selected = false\n        lights[column][row].selected = true\n        \n        pRow = row\n        pColumn = column\n    }\n    \n//    private func disSelectedGameControllerStatus() {\n//        lights[pColumn][pRow].selected = false\n//    }\n    \n    /// 判赢\n    private func updateGameStatus() {\n        guard let size = size else { return }\n        \n        var lightingCount = 0\n        \n        \n        for lightArr in lights {\n            for light in lightArr {\n                if light.status { lightingCount += 1 }\n            }\n        }\n        \n        if lightingCount == size * size {\n            timerStop()\n            currentStatus = .lose\n            return\n        }\n        \n        if lightingCount == 0 {\n            timerStop()\n            currentStatus = .win\n            isPause = true\n            return\n        }\n    }\n    \n//    private func initGameController() {\n//        gameController.isSelectX = {\n//            guard !self.isPause else { return }\n//\n//            if $0 {\n//                if (self.row < self.lights.count - 1) {\n//                    self.row += 1\n//                }\n//            } else {\n//                if self.row > 0 {\n//                    self.row -= 1\n//                }\n//            }\n//\n//            self.updateLightSelected()\n//        }\n//\n//        gameController.isSelectY = {\n//            guard !self.isPause else { return }\n//\n//            if $0 {\n//                if (self.column > 0) {\n//                    self.column -= 1\n//                }\n//            } else {\n//                if (self.column < self.lights.count - 1) {\n//                    self.column += 1\n//                }\n//            }\n//\n//            self.updateLightSelected()\n//        }\n//\n//        gameController.isTapButtonA = {\n//            self.clickTimes += 1\n//            self.updateLightStatus(column: self.row, row: self.column, userTouch: false)\n//        }\n//    }\n}\n\nextension WatchGameManager {\n    enum WatchGameStatus {\n        /// 赢\n        case win\n        /// 输\n        case lose\n        /// 进行中\n        case during\n    }\n}\n\n"
  }
]