     return .Invalid
 }
 
+public func strFromMove(move: Move) -> String {
+    switch move {
+    case let .Move(col, row):
+        var first = ""
+        switch col {
+        case 0:
+            first = "A"
+        case 1:
+            first = "B"
+        case 2:
+            first = "C"
+        case 3:
+            first = "D"
+        case 4:
+            first = "E"
+        case 5:
+            first = "F"
+        case 6:
+            first = "G"
+        case 7:
+            first = "H"
+        default:
+            first = "X"
+        }
+        let last = String.init(row + 1)
+        return first + last
+    case .Pass:
+        return "PS"
+    case .Invalid:
+        return "Invalid"
+    }
+}
+
 public enum Move {
     case Move(Int, Int)     // col, row
     case Pass

    if edaxStr.uppercased() == "PS" {
        return .Pass
    } else {
        return handFromStr(str: edaxStr)
    }
}

public func handFromStr(str: String) -> Move {
    let b = str.uppercased()
    if let first = b.characters.first, let last = b.characters.last {
        var row = -1;

            print("")
        }
    case "go":
        print("\n")
        let boardRep = BoardBuilder.build(board)
        if (boardRep.isAnyPuttable(color)) {
            let hand = think.think(color, board: boardRep, info: info)
            if board.canPut(color, x: hand.col, y: hand.row) {
                _ = board.put(color, x: hand.col, y: hand.row, guides: false, returnChanges: false)
                let handStr = strFromMove(move: .Move(hand.col, hand.row))
                print(">\(playerName) plays \(handStr)")
                return .Moved(board)
            } else {
                // Treat invalid put by think as pass
                print(">\(playerName) plays PS")
                return .Moved(board)
            }
        } else {
            // Treat invalid put by think as pass
            print(">\(playerName) plays PS")
            return .Moved(board)
        }
    default:
