拥有“ Circle The Dot”游戏-怪异的行为

问题描述

首先,这可能不是一个快速回答问题的方法:(

如果您有足够的时间-请继续阅读。

我的小项目

我想用少于500行的代码重新创建Ketchapp的 The Dot 游戏。您可以在线here尝试使用副本。我使用2D UIButtons数组实现了这一点。在这里,您可以快速了解外观(标签用于调试) Screenshot of the game scene。我使用this GitHub项目进行定向(其Java代码)。

完整代码

您可以下载整个项目:DOWNLOAD PROJECT

或复制代码: (只是在Main.storyboard中添加一个名为dotView的视图,其度量标准为:X = 20,Y = 296,宽度= 394,高度390。)全部:

    import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var dotView: UIView!
    
    var rowBtnArr: [UIButton] = [] // Simple 1D-Array of ALL Buttons
    var btnArr: [[UIButton]] = [] // 2D-Array with ALL Buttons
    let defaultColor = UIColor.lightGray
    let playerColor = UIColor.systemBlue
    let objColor = UIColor.orange
    var button: UIButton = UIButton()
    var playerX = 4
    var playerY = 4
    
    override func viewDidLoad() {
        super.viewDidLoad()
        buildBoard()
        btnArr = Utils.arrayToArrays(arr: rowBtnArr,size: 9)
          for btnline in btnArr{
            for btn in btnline{
                dotView.addSubview(btn)
            }
        }
        btnArr[playerX][playerY].backgroundColor = playerColor
        updateTitleColors()
    }

    @objc func buttonAction(sender: UIButton!) {
    
        print("Button " + sender.title(for: .normal)! + " tapped")
        if(sender.backgroundColor == defaultColor){
            btnArr[getX(btn: sender)][getY(btn: sender)].backgroundColor = objColor
            btnArr[playerX][playerY].backgroundColor = defaultColor
            onestep()
        }
        //btnArr[playerX][playerY].backgroundColor = defaultColor
        //btnArr[playerX][playerY].backgroundColor = playerColor
        updateTitleColors()
    }
    
    func setupBtn( x: Int,y: Int)->UIButton{
        let btnSize = 40
        if(y%2==0){ //Gerade Zeilen normal
            button = UIButton(frame: CGRect(x: x*btnSize,y: y*btnSize,width: btnSize-3,height: btnSize-3))
        }else{ // Ungerade Zeilen versetzt
            button = UIButton(frame: CGRect(x: x*btnSize+20,height: btnSize-3))
        }
        button.layer.cornerRadius = 0.5 * button.bounds.size.width
        button.clipsToBounds = true
        button.backgroundColor = defaultColor
        button.setTitle(String(x) + " " + String(y),for: .normal)
        button.addTarget(self,action: #selector(buttonAction),for: .touchUpInside)
        //button.setTitleColor(button.backgroundColor,for: .normal)
        return button
    }
    
    func buildBoard(){
        for i in 0...8{
            for j in 0...8{
                rowBtnArr.append(setupBtn(x: i,y: j))
            }
        }
    }
    func getXFromString(string: String) -> Int{ //"2 4"
        let separator = " "
        let newstr = string
        guard let x = newstr.components(separatedBy: separator).first else { return 99 }
        return Int(x)!
    }
    func getYFromString(string: String) -> Int{ //"2 4"
        let separator = " "
        let newstr = string
        guard let x = newstr.components(separatedBy: separator).last else { return 99 }
        return Int(x)!
    }
    func getX(btn: UIButton) -> Int{
        let separator = " "
        let newstr = btn.title(for: .normal)
        guard let x = newstr?.components(separatedBy: separator).first else { return 99 }
        return Int(x)!
    }
    func getY(btn: UIButton) -> Int{
        let separator = " "
        let newstr = btn.title(for: .normal)
        guard let y = newstr?.components(separatedBy: separator).last else { return 99 }
        return Int(y)!
    }
    
    func updateTitleColors(){
//        for btnline in btnArr{
//            for btn in btnline{
//                btn.setTitleColor(btn.backgroundColor,for: .normal)
//            }
//        }
    }
    
    
    func onestep(){
        let point = String(playerX) + " " + String(playerY)
        if(isOnBorder(point: point)){
            playerX = -1
            playerY = -1
            // YOU LOST ENDSCREEN
            print("YOU LOST")
            reset()
            
        }else{
            let direction = findDirection()
            if(getXFromString(string: direction) == -1){
               // YOU WON
                print("YOU WON")
                reset()
            }else{
                playerX = getXFromString(string: direction)
                playerY = getYFromString(string: direction)
                btnArr[playerX][playerY].backgroundColor = playerColor
            }
        }
    }
    
    func findDirection()->String{
        var blocked: [String] = [] //Array enthält z.B. "3 5","5 5"
        let myQueue = LinkedQueue<Pair>()
        let pair = Pair()
        var possibleNeighbours = findPossibleNeighbours(btn: btnArr[playerX][playerY],blockedArr: blocked)
        print(String(possibleNeighbours.description) + " possibeNeighs beginning" )
       possibleNeighbours.shuffle()
        
        for neighbour in possibleNeighbours{
            if(isOnBorder(point: neighbour)){
                print("Is on border")
                return neighbour
            }
            pair.setPair(firstValue: neighbour,secondValue: neighbour)
            myQueue.enqueue(value: pair)
            blocked.append(neighbour)
        }
        
        while(!myQueue.isEmpty){
            print("SCHLEIFE")
            print((myQueue.tail?.value.first)! + " " + (myQueue.tail?.value.second)!)
            let pointPair = myQueue.dequeue()
            possibleNeighbours = findPossibleNeighbours(btn: btnArr[getXFromString(string: (pointPair?.value.first)!)][getYFromString(string: (pointPair?.value.first)!)],blockedArr: blocked)
            for neighbour in possibleNeighbours{
                
                if isOnBorder(point: neighbour){
                    return (pointPair?.value.getSecond())!
                }
                pair.setPair(firstValue: neighbour,secondValue: (pointPair?.value.getSecond())!)
                myQueue.enqueue(value: pair)
                blocked.append(neighbour)
            }
        }
        return "-1 -1"
    }
    
    func isOnBorder(point: String)->Bool{
        return (getXFromString(string: point) == 0 || getXFromString(string: point) == 8 || getYFromString(string: point) == 0 || getYFromString(string: point) == 8)
    }
    
    func findPossibleNeighbours(btn: UIButton,blockedArr: [String])->[String]{
        var neighbours: [String] = []
        let x = getX(btn: btn)
        let y = getY(btn: btn)
        if(y%2==1){
            if(isFree(btn: btnArr[x][y-1])){ //OBEN
                let a = String(x) + " " + String(y-1)
                if(!blockedArr.contains(a)){
                    neighbours.append(a)
                }
            }
            if(isFree(btn: btnArr[x+1][y-1])){ //OBENRECHTS
                let b = String(x+1) + " " + String(y-1)
                if(!blockedArr.contains(b)){
                    neighbours.append(b)
                }
            }
            if(isFree(btn: btnArr[x+1][y])){ //RECHTS
                let c = String(x+1) + " " + String(y)
                if(!blockedArr.contains(c)){
                    neighbours.append(c)
                }
            }
            if(isFree(btn: btnArr[x+1][y+1])){ //UNTENRECHTS
                let d = String(x+1) + " " + String(y+1)
                if(!blockedArr.contains(d)){
                    neighbours.append(d)
                }
            }
            if(isFree(btn: btnArr[x][y+1])){ //UNTEN
                let e = String(x) + " " + String(y+1)
                if(!blockedArr.contains(e)){
                    neighbours.append(e)
                }
            }
            if(isFree(btn: btnArr[x-1][y])){ //LINKS
                let f = String(x-1) + " " + String(y)
                if(!blockedArr.contains(f)){
                    neighbours.append(f)
                }
            }
        }else{
            if(isFree(btn: btnArr[x][y-1])){ //OBEN
                let aa = String(x) + " " + String(y-1)
                if(!blockedArr.contains(aa)){
                    neighbours.append(aa)
                }
            }
            if(isFree(btn: btnArr[x+1][y])){ //RECHTS
                let bb = String(x+1) + " " + String(y)
                if(!blockedArr.contains(bb)){
                    neighbours.append(bb)
                }
            }
            if(isFree(btn: btnArr[x][y+1])){ //UNTEN
                let cc = String(x) + " " + String(y+1)
                if(!blockedArr.contains(cc)){
                    neighbours.append(cc)
                }
            }
            if(isFree(btn: btnArr[x-1][y+1])){ //UNTENLINKS
                let dd = String(x-1) + " " + String(y+1)
                if(!blockedArr.contains(dd)){
                    neighbours.append(dd)
                }
            }
            if(isFree(btn: btnArr[x-1][y])){ //LINKS
                let ee = String(x-1) + " " + String(y)
                if(!blockedArr.contains(ee)){
                    neighbours.append(ee)
                }
            }
            if(isFree(btn: btnArr[x-1][y-1])){ //OBENLINKS
                let ff = String(x-1) + " " + String(y-1)
                if(!blockedArr.contains(ff)){
                    neighbours.append(ff)
                }
            }
        }
        return neighbours
    }
    
    func isFree(btn: UIButton)->Bool{
        if(btn.backgroundColor == defaultColor){
            return true
        }
        return false
    }
    
    func reset(){
        playerX = 4
        playerY = 4
        for btnline in btnArr{
          for btn in btnline{
            btn.backgroundColor = defaultColor
          }
      }
        btnArr[4][4].backgroundColor = playerColor
    }
    
}

// (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (6,0) (7,0) (8,0)

// (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (6,1) (7,1) (8,1)

// (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (6,2) (7,2) (8,2)

// (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (6,3) (7,3) (8,3)

// (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) (6,4) (7,4) (8,4)

// (0,5) (1,5) (2,5) (3,5) (4,5) (5,5) (6,5) (7,5) (8,5)

// (0,6) (1,6) (2,6) (3,6) (4,6) (5,6) (6,6) (7,6) (8,6)

// (0,7) (1,7) (2,7) (3,7) (4,7) (5,7) (6,7) (7,7) (8,7)

// (0,8) (1,8) (2,8) (3,8) (4,8) (5,8) (6,8) (7,8) (8,8)
// _____________________________________________________
// row1  row2  row3  row4  row5  row6  row7  row8  row9




//        for btnline in btnArr{
//            print("-----------")
//            for btn in btnline{
//            print(btn.title(for: .normal)!)
//            }
//        }
//____________________________________________________
class Node<T> {
  var value:T
  var next:Node?
  init(value:T) {
    self.value = value
  }
}
class LinkedQueue<T> {
  var tail:Node<T>?
  var head:Node<T>?
  var count:Int = 0
    var isEmpty: Bool{
        return (count == 0)
    }
  func dequeue () -> Node<T>? {
    if let node = head {
      head = head?.next
      count -= 1
        return node
    }
    return nil
  }
  func enqueue(value:T) {
    let newNode = Node(value:value)
    if let tailNode = tail {
      tailNode.next = newNode
      newNode.next = nil
      tail = newNode
    } else {
      head = newNode
      tail = newNode
    }
    count += 1
  }
}

        import Foundation
    class Utils{
    
        static func arrayToArrays<T>(arr: Array<T>,size: Int)->Array<Array<T>>{
            
            var result : Array<Array<T>> = Array<Array<T>>(repeating: Array<T>(),count: size);
    
            var set = -1;
            let expectedSize = (arr.count / size) + (arr.count % size);
    
            for i in 0..<arr.count {
                if i % expectedSize == 0{
                    set+=1;
                }
    
                result[set].append(arr[i]);
            }
    
            return result;
        }
    }
import Foundation

class Pair{
    var first: String = ""
    var second: String = ""
    
    func setPair(firstValue: String,secondValue: String){
        first = firstValue
        second = secondValue
    }
    func getFirst() -> String{
        return first
    }
    func getSecond() -> String{
        return second
    }
}

我的问题 当我在不删除轨迹的情况下播放它时(访问时按钮保持橙色),它的ALMOST效果很好,您可以通过取消注释第41行来进行测试。但是在删除轨迹时(就像原始的圆点一样),这非常令人困惑。我试图在多个小时内找到问题,这就是为什么我在这里发布所有内容的原因:/

当我一开始单击按钮(2,3)时,它停止工作-找不到边界,但是我只阻止了一个按钮...将它与findDirection方法进行比较时,我没有任何意义,其中包括广度优先搜索算法。其他按钮也一样。 取消注释第135行时会稍微好一点,这会增加游戏的随机性。

如果有人可以帮助我或加入该项目,那就太棒了。它只是出于娱乐目的,我想学习新事物。

问候

SwiftHobby

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)