Skip to content

Instantly share code, notes, and snippets.

@mikecbone
Last active August 24, 2018 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikecbone/3a6d61fa29f45dfabfd76feebba0a15e to your computer and use it in GitHub Desktop.
Save mikecbone/3a6d61fa29f45dfabfd76feebba0a15e to your computer and use it in GitHub Desktop.
//
// 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