2016-06-30 6 views
0

Meine "Board" -Variable führt dazu, dass mein Compiler verrückt wird, und ich habe keine Ahnung warum. Diese Klasse referenziert keine andere Klasse in meinem Projekt und ich bin verwirrt darüber, warum es das tut. Mein Hauptziel ist es, ein 2D-Array von Zeichen mit den oben definierten Zeilen- und Spaltenvariablen als Dimensionen meines Boards zu erstellen. Ich habe alles versucht und es wird immer noch nicht funktionieren. Der Kommentarcode war mein letzter Versuch.SourceKit stürzt beim Erstellen von 2D-Array von Zeichen ab

import Foundation 

class Board: NSObject { 

let rows: Int = 6 
let columns: Int = 7 
var boardRow: [Character] = [Character].init(count: 6, repeatedValue: " ") 
var boardColumn: [Character] = [Character].init(count: 7, repeatedValue: " ") 
//var board: [[Character]] = [boardRow][boardColumn] 

// evaluation table for checking state of board ~~ not my code 
var evaluationTable = [[3, 4, 5, 7, 5, 4, 3], [4, 6, 8, 10, 8, 6, 4], [5, 8, 11, 13, 11, 8, 5], [5, 8, 11, 13, 11, 8, 5], [4, 6, 8, 10, 8, 6, 4], [3, 4, 5, 7, 5, 4, 3]] 

func Board() { 
    createBoard() 
    displayContent() 
} 

func createBoard() { 

    for i in 0..<rows { 
     for j in 0..<columns { 
      board[i][j] = " " 
     } 
    } 
} 

func displayContent() { 
    print(" 1 2 3 4 5 6 7") 
    for j in 0..<rows { 
     for k in 0..<columns { 
      print("[" + board[j][k] + "]") 
     } 
     print() 
    } 

    print("---------------------------------------------------") 
} 

func insert(column: Int, protagonist: Character) -> Bool { 
    if (column > 6 || column < 0 || board[0][column] != " ") { 
     return false 
    } 

    else { 
     for (var i = rows-1; i >= 0; i -= 1) { 
      if (board[i][column] == " ") { 
       board[i][column] = protagonist; 
       break 
      } 
     } 
     return true 
    } 
} 

func remove(column: Int) { 
    for i in 0..<rows { 
     if (board[i][column] != " ") { 
      board[i][column] = " " 
      break 
     } 
    } 
} 

func areWeDone() -> Character { 
    //check for win horizontally 
    for (var row = 0; row < rows; row += 1) { 
     for (var col=0; col<columns-3; col += 1) { 
      if (board[row][col] != " " && board[row][col] == board[row][col+1] && board[row][col] == board[row][col+2] && board[row][col] == board[row][col+3]) { 
       return board[row][col] 
      } 
     } 
    } 

    // My up and down checker 
    for (var row = 0; row < rows-3; row++) { 
     for (var col = 0; col < columns; col++) { 
      if (board[row][col] != " " && 
       board[row][col] == board[row+1][col] && 
       board[row][col] == board[row+2][col] && 
       board[row][col] == board[row+3][col]) { 
       return Character(board[row][col]) 
       //return board[row][col] 
      } 
     } 
    } 

    // My diagonal checker 
    for (var row = 0; row < rows-3; row += 1) { 
     for (var col = 0; col < columns-3; col++) { 
      if (board[row][col] != " " && 
       board[row][col] == board[row+1][col+1] && 
       board[row][col] == board[row+2][col+2] && 
       board[row][col] == board[row+3][col+3]) { 
       return board[row][col] 
       //return board[row][col] 
      } 
     } 
    } 

    // My diagonal checker 
    for (var row = 3; row < rows; row++) { 
     for (var col = 0; col < columns-3; col += 1) { 
      if (board[row][col] != " " && 
       board[row][col] == board[row-1][col+1] && 
       board[row][col] == board[row-2][col+2] && 
       board[row][col] == board[row-3][col+3]) { 
       return board[row][col] 
       //return Character(board[row][col]) 
      } 
     } 
    } 

    return " "; 
} 

func isTiePresent() -> Bool { 
    for j in 0..<columns { 
     if (board[0][j] == " ") { 
      return false 
     } 
    } 
    return true 
} 

func isMoveAllowed(column: Int) -> Bool { 
    if (column > 6 || column < 0 || board[0][column] != " ") { 
     return false 
    } else { 
     return true 
    } 
} 

func analyze() -> Int { 
    let utility = 128 
    var sum = 0 
    for i in 0..<rows { 
     for j in 0..<columns { 
      if (board[i][j] == "O") { 
       sum += evaluationTable[i][j] 
      } else if (board[i][j] == "X"){ 
       sum -= evaluationTable[i][j] 
      } 
     } 
    } 

    return utility + sum 
} 

} 
+0

Mit welchem ​​Problem haben Sie eigentlich konfrontiert? – Eiko

+0

@ Lagos341: Auf einer Randnotiz sollte 'areWeDone()' ein 'Zeichen?' Zurückgeben (Zeichen [optional] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics .html # // Apple_ref/doc/uid/TP40014097-CH5-ID330)), anstatt nur 'Zeichen'. Dies erlaubt Ihnen, 'nil' anstelle eines beliebigen [sentinel value] (https://en.wikipedia.org/wiki/Sentinel_value) wie' "" 'zurückzugeben. – Alexander

+0

@Eiko SourceKit stürzt ab. Mit dem Code, den ich geschrieben habe, kann ich kein 2D-Array von Zeichen erstellen, ohne Probleme zu haben. – Lagos341

Antwort

0

// var Board: [[Zeichen]] = [boardRow] [boardColumn]

Wie ich bin sicher, dass Sie bemerkt haben, [boardRow][boardColumn] ist nicht gültig Syntax. Dieser Ansatz erzeugt letztendlich nur 2 Arrays.

2D-Arrays werden tatsächlich als ein Array von Arrays implementiert. Sie können sehen, dass in der Art [[Character]] bedeutet Array<Array<Character>>.

Angenommen, Sie haben 6 Zeilen und 7 Zeilen. Sie müssten zuerst ein Array erstellen, das Unterarrays (Zeilen) enthält. Jedes Array (Zeile) sollte auf die Werte

var board = [[Character]](count: 6, repeatedValue: [Character](count: 7, repeatedValue: " ")) 

Hinweis initialisiert werden: es ist sehr wahrscheinlich, ich habe verwechselt „Zeile“ und „Spalte“. Du kannst damit herumspielen.

+0

Ich bin mir bewusst, es ist nicht gültig, es war nur meine verloren für alle Hoffnung lol, und ich habe bereits das letzte Stück Code ausprobiert ^. Der Compiler stürzt immer noch ab. – Lagos341

+0

Nun, was ist der Fehler? – Alexander

+0

Befehl fehlgeschlagen wegen Signal: Segmentierungsfehler: 11 – Lagos341

0

Ich habe die Freiheit genommen, Ihren gesamten Code zu refaktorisieren (das ist kein Standard auf SO), bitte nehmen Sie den Rat in den Kommentaren. Es gab das Problem mit board und eine Instanz, wo Sie + verwendet, um eine String mit einer Character zu verketten, die nicht funktioniert.

// Removed NSObject superclass as there's no use for it 
class Board { 

    let rows: Int = 6 
    let columns: Int = 7 

// var boardRow: [Character] = [Character].init(count: 6, repeatedValue: " ") // rowArray, just 6 characters 
// var boardColumn: [Character] = [Character].init(count: 7, repeatedValue: " ") // columnArray, just 7 characters 

    var board = [[Character]](count: 6, repeatedValue: [Character](count: 7, repeatedValue: " ")) // You need 6 * 7 characters 

    var evaluationTable = [[3, 4, 5, 7, 5, 4, 3], [4, 6, 8, 10, 8, 6, 4], [5, 8, 11, 13, 11, 8, 5], [5, 8, 11, 13, 11, 8, 5], [4, 6, 8, 10, 8, 6, 4], [3, 4, 5, 7, 5, 4, 3]] 


    init() { 
     displayContent() 
    } 

    // Using init instead of function for initialization 
// func Board() { 
//  createBoard() 
//  displayContent() 
// } 

    // Not needed, board is already initialized to all " " 
// func createBoard() { 
//  for i in 0..<rows { 
//   for j in 0..<columns { 
//    board[i][j] = " " 
//   } 
//  } 
// } 

    func displayContent() { 
     print(" 1 2 3 4 5 6 7") 
     for j in 0..<rows { 
      for k in 0..<columns { 
       print("[\(board[j][k])]") 
//    print("[" + board[j][k] + "]") // Doesn't work, "+" operates on strings, not char + string 
      } 
      print() 
     } 

     print("---------------------------------------------------") 
    } 

    func insert(column: Int, protagonist: Character) -> Bool { 
     if (column > 6 || column < 0 || board[0][column] != " ") { 
      return false 
     } else { 
//   for (var i = rows-1; i >= 0; i -= 1) { // For loops will be removed from future versions 
      for i in (0..<rows).reverse() { 
       if (board[i][column] == " ") { 
        board[i][column] = protagonist 
        break 
       } 
      } 
      // What happens if no character in this column is " "? Should still true be returned? 

      return true 
     } 
    } 

    func remove(column: Int) { 
     for i in 0..<rows { 
      if (board[i][column] != " ") { 
       board[i][column] = " " 
       break // This only removes the first row in the column where char isn't " ", you sure about that? 
      } 
     } 
    } 

    // Returning nil when no winner 
    func areWeDone() -> Character? { 
     //check for win horizontally 
     for row in 0..<rows { 
      for col in 0..<columns-3 { 
       if (board[row][col] != " " && 
        board[row][col] == board[row][col+1] && 
        board[row][col] == board[row][col+2] && 
        board[row][col] == board[row][col+3]) { 
         return board[row][col] 
       } 
      } 
     } 

     // My up and down checker 
     for row in 0..<rows-3 { 
      for col in 0..<columns { 
       if (board[row][col] != " " && 
        board[row][col] == board[row+1][col] && 
        board[row][col] == board[row+2][col] && 
        board[row][col] == board[row+3][col]) { 
         return board[row][col] 
       } 
      } 
     } 

     // My diagonal checker 
     for row in 0..<rows-3 { 
      for col in 0..<columns-3 { 
       if (board[row][col] != " " && 
        board[row][col] == board[row+1][col+1] && 
        board[row][col] == board[row+2][col+2] && 
        board[row][col] == board[row+3][col+3]) { 
         return board[row][col] 
       } 
      } 
     } 

     // My diagonal checker 
     for row in 3..<rows { 
      for col in 0..<columns-3 { 
       if (board[row][col] != " " && 
        board[row][col] == board[row-1][col+1] && 
        board[row][col] == board[row-2][col+2] && 
        board[row][col] == board[row-3][col+3]) { 
         return board[row][col] 
       } 
      } 
     } 

     return nil 
    } 

    func isTiePresent() -> Bool { 
     for j in 0..<columns { 
      if (board[0][j] == " ") { 
       return false 
      } 
     } 
     return true 
    } 

    func isMoveAllowed(column: Int) -> Bool { 
     return !(column > 6 || column < 0 || board[0][column] != " ") 

     // Same as this 
//  if (column > 6 || column < 0 || board[0][column] != " ") { 
//   return false 
//  } else { 
//   return true 
//  } 
    } 

    func analyze() -> Int { 
     let utility = 128 
     var sum = 0 
     for i in 0..<rows { 
      for j in 0..<columns { 
       if (board[i][j] == "O") { 
        sum += evaluationTable[i][j] 
       } else if (board[i][j] == "X"){ 
        sum -= evaluationTable[i][j] 
       } 
      } 
     } 

     return utility + sum 
    } 

} 
Verwandte Themen