Last active
August 24, 2018 14:25
-
-
Save mikecbone/3a6d61fa29f45dfabfd76feebba0a15e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ChessBoard.swift | |
// ChessoR | |
// | |
// Created by Michael Bone on 23/02/2018. | |
// Copyright © 2018 id200949660. All rights reserved. | |
// | |
import UIKit | |
class ChessBoard: NSObject { | |
//Properties | |
var board: [[Piece]]! | |
var vc: ChessBoardVC! | |
var whiteKing: King! | |
var blackKing: King! | |
let COLUMNS = 8 | |
let ROWS = 8 | |
init(viewController: ChessBoardVC) { | |
super.init() | |
vc = viewController | |
if isNewGame == true { | |
print("Loading new game") | |
setupNewGame() | |
} | |
else { | |
print("Loading saved game") | |
loadSavedGame() | |
} | |
} | |
func setupNewGame() { | |
//Init the board matrix with the dummy pieces | |
let oneRow = Array(repeating: Dummy(), count: COLUMNS) | |
board = Array(repeating: oneRow, count: ROWS) | |
for row in 0..<ROWS { | |
for column in 0..<COLUMNS { | |
switch row { | |
//Top Row - Black | |
case 0: | |
switch column { | |
case 0: | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 1: | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 2: | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 3: | |
board[row][column] = Queen(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 4: | |
blackKing = King(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
board[row][column] = blackKing | |
break | |
case 5: | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 6: | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case 7: | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
default: | |
break | |
} | |
break | |
//Second to Top Row - Black | |
case 1: | |
board[row][column] = Pawn(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
//Second to Bottom Row - White | |
case 6: | |
board[row][column] = Pawn(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
//Bottom Row - White | |
case 7: | |
switch column { | |
case 0: | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 1: | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 2: | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 3: | |
board[row][column] = Queen(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 4: | |
whiteKing = King(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
board[row][column] = whiteKing | |
break | |
case 5: | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 6: | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case 7: | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
default: | |
break | |
} | |
break | |
default: | |
board[row][column] = Dummy(frame: ChessBoard.getFrame(forRow: row, forColumn: column)) | |
break | |
} | |
} | |
} | |
} | |
func loadSavedGame() { | |
//Get saved chess board | |
guard let getConvertedChessBoard = UserDefaults.standard.object(forKey: "convertedChessBoard") as? [[String]] else { | |
return | |
} | |
//Init the board matrix with the dummy pieces | |
let oneRow = Array(repeating: Dummy(), count: ROWS) | |
board = Array(repeating: oneRow, count: COLUMNS) | |
//Setup the board with the positions from the saved chess board | |
for row in 0..<ROWS { | |
for column in 0..<COLUMNS { | |
//Capital letter == white, lowercase == black. King is X. | |
let piece = getConvertedChessBoard[row][column] | |
switch piece { | |
case "P": | |
board[row][column] = Pawn(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case "p": | |
board[row][column] = Pawn(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case "R": | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case "r": | |
board[row][column] = Rook(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case "K": | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case "k": | |
board[row][column] = Knight(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case "B": | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case "b": | |
board[row][column] = Bishop(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case "Q": | |
board[row][column] = Queen(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
break | |
case "q": | |
board[row][column] = Queen(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
break | |
case "X": | |
whiteKing = King(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0.9999960065, green: 1, blue: 1, alpha: 1), vc: vc) | |
board[row][column] = whiteKing | |
break | |
case "x": | |
blackKing = King(frame: ChessBoard.getFrame(forRow: row, forColumn: column), color: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), vc: vc) | |
board[row][column] = blackKing | |
break | |
case "D": | |
board[row][column] = Dummy(frame: ChessBoard.getFrame(forRow: row, forColumn: column)) | |
break | |
default: | |
board[row][column] = Dummy(frame: ChessBoard.getFrame(forRow: row, forColumn: column)) | |
break | |
} | |
} | |
} | |
} | |
//Remove a chess piece | |
func remove(piece: Piece) { | |
if let chessPiece = piece as? UIChessPiece { | |
//Remove from board matrix | |
let indexOnBoard = ChessBoard.indexOf(origin: chessPiece.frame.origin) | |
board[indexOnBoard.row][indexOnBoard.column] = Dummy(frame: chessPiece.frame) | |
//Remove from the array of chess pieces | |
if let indexInChessPiecesArray = vc.chessPieces.index(of: chessPiece) { | |
vc.chessPieces.remove(at: indexInChessPiecesArray) | |
} | |
//Remove from the screen | |
chessPiece.removeFromSuperview() | |
} | |
} | |
//Place a chess piece | |
func place(chessPiece: UIChessPiece, toIndex destinationIndex: ChessBoardIndex, toOrigin destinationOrigin: CGPoint) { | |
chessPiece.frame.origin = destinationOrigin | |
board[destinationIndex.row][destinationIndex.column] = chessPiece | |
} | |
//Get index of specific chess piece | |
func getIndex(chessPieceToFind: UIChessPiece) -> ChessBoardIndex? { | |
for row in 0..<ROWS { | |
for column in 0..<COLUMNS { | |
let aChessPiece = board[row][column] as? UIChessPiece | |
if chessPieceToFind == aChessPiece { | |
return ChessBoardIndex(row: row, column: column) | |
} | |
} | |
} | |
return nil | |
} | |
//Get frame of specific chess piece | |
static func getFrame(forRow row: Int, forColumn column: Int) -> CGRect { | |
let x = CGFloat(ChessBoardVC.spaceFromLeftEdgeGlobal + Double((CGFloat(column) * ChessBoardVC.chessSqaureSizeGlobal))) | |
let y = CGFloat(ChessBoardVC.spaceFromTopEdgeGlobal + Double((CGFloat(row) * ChessBoardVC.chessSqaureSizeGlobal))) | |
return CGRect(origin: CGPoint(x: x, y: y), size: CGSize(width: ChessBoardVC.chessSqaureSizeGlobal, height: ChessBoardVC.chessSqaureSizeGlobal)) | |
} | |
//Get index of specific chess piece | |
static func indexOf(origin: CGPoint) -> ChessBoardIndex { | |
let row = (Int(origin.y) - Int(ChessBoardVC.spaceFromTopEdgeGlobal)) / Int(ChessBoardVC.chessSqaureSizeGlobal) | |
let column = (Int(origin.x) - Int(ChessBoardVC.spaceFromLeftEdgeGlobal)) / Int(ChessBoardVC.chessSqaureSizeGlobal) | |
return ChessBoardIndex(row: row, column: column) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment