2016-06-30 12 views
0

私の "board"変数が私のコンパイラを狂わせさせてしまい、どうしてわからないのですか?このクラスは私のプロジェクトの他のクラスを参照していないので、なぜそれがこれをしているのか混乱しています。私の主な目的は、上記の行と列の変数をボードの寸法として定義したCharactersの2D配列を作成することです。私はすべてを試しましたが、それはまだ動作しません。コメントアウトコードは私の最新の試みでした。 // VARボード2次元配列の文字を作成するとSourceKitがクラッシュする

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

あなたは実際にどのような問題に直面していますか? – Eiko

+0

@ Lagos341:サイドノートでは、 'areWeDone()'は 'Character?'(文字[オプション](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics)を返します。 .html#// apple_ref/doc/uid/TP40014097-CH5-ID330))を使用してください。これにより '' "のような任意の[センチネル値](https://en.wikipedia.org/wiki/Sentinel_value)ではなく' nil'を返すことができます。 – Alexander

+0

@Eiko SourceKitはクラッシュし続けます。私が書いたコードでは、問題のない文字の2D配列を作成できないようです。 – Lagos341

答えて

0

:[[文字]] = [boardRow] [boardColumn]

私はあなたが気づいたと確信しているとして、[boardRow][boardColumn]は有効な構文ではありません。とにかく、このアプローチは最終的に2つの配列しか作成しません。

2次元配列は、実際には配列の配列として実装されます。タイプ[[Character]]の意味はArray<Array<Character>>です。

6行7行あるとします。最初に、サブ配列(行)を保持する配列を作成する必要があります。各配列(行)の値に

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

注意を初期化する必要があります。それは私が「行」と「列」を混同してきた可能性が高いです。あなたはそれで遊ぶことができます。

+0

私はそれが正当ではないことを知っています。それは、すべての希望のために失われたばかりだったので、私はすでにコードの最後の部分を試しました^。コンパイラはまだクラッシュし続けます。 – Lagos341

+0

さて、エラーは何ですか? – Alexander

+0

シグナルによってコマンドが失敗しました:セグメンテーションフォールト:11 – Lagos341

0

私はすべてのコードをリファクタリングすることができました(これはSOの標準ではありません)。コメントのアドバイスを受けてください。 boardに問題があり、+を使用してStringCharacterを連結して使用できない場合がありました。

// 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 
    } 

} 
関連する問題