Artifact [a5ebfe3b45]

Artifact a5ebfe3b45eaa4f2a27c982cb8ea003f16f6f491:



    ######
    #DECLARATIONS - DICTIONARIES
    ######

    global pieceValTenjiku = Dict{String, Int64}("_" => 0, "bishop" => 10, "bishop general" => 21, "blind tiger" => 3, "copper general" => 2, "chariot soldier" => 18, "dog" => 1, "drunk elephant" => 3, "dragon horse" => 12, "dragon king" => 14, "ferocious leopard" => 3, "flying ox" => 16, "flying stag" => 9, "fire demon" => 83, "free boar" => 16, "free eagle" => 22, "gold general" => 3, "great general" => 45, "heavenly tetrarch" => 12, "horned falcon" => 19, "iron general" => 2, "king" => 500, "kirin" => 3, "lance" => 6, "lion hawk" => 25, "lion" => 18, "multi general" => 6, "knight" => 1, "pawn" => 1, "phoenix" => 3, "queen" => 22, "rook" => 12, "reverse chariot" => 6, "rook general" => 23, "silver general" => 2, "soaring eagle" => 18, "side mover" => 7, "side soldier" => 7, "vice general" => 39, "vertical mover" => 7, "vertical soldier" => 8, "water buffalo" => 17, "whale" => 10, "white horse" => 14)

    global rangeJumpPriority = Dict{String, Int64}("_" => 0, "bishop" => 0, "bishop general" => 1, "blind tiger" => 0, "copper general" => 0, "chariot soldier" => 0, "dog" => 0, "drunk elephant" => 0, "dragon horse" => 0, "dragon king" => 0, "ferocious leopard" => 0, "flying ox" => 0, "flying stag" => 0, "fire demon" => 0, "free boar" => 0, "free eagle" => 0, "gold general" => 0, "great general" => 3, "heavenly tetrarch" => 0, "horned falcon" => 0, "iron general" => 0, "king" => 4, "kirin" => 0, "lance" => 0, "lion hawk" => 0, "lion" => 0, "multi general" => 0, "knight" => 0, "pawn" => 0, "phoenix" => 0, "queen" => 0, "rook" => 0, "reverse chariot" => 0, "rook general" => 1, "silver general" => 0, "soaring eagle" => 0, "side mover" => 0, "side soldier" => 0, "vice general" => 2, "vertical mover" => 0, "vertical soldier" => 0, "water buffalo" => 0, "whale" => 0, "white horse" => 0)

    global pieceValChu = Dict{String, Int64}("_" => 0, "lion" => 20, "queen" => 12, "dragon king" => 8, "soaring eagle" => 11, "dragon horse" => 7, "horned falcon" => 10, "rook" => 6, "bishop" => 5, "vertical mover" => 4, "flying ox" => 8, "side mover" => 4, "free boar" => 8, "king" => 50, "phoenix" => 3, "kirin" => 3, "reverse chariot" => 3, "whale" => 5 , "lance" => 3, "white horse" => 7, "drunk elephant" => 3, "gold general" => 3, "ferocious leopard" => 3, "blind tiger" => 3, "flying stag" => 6, "silver general" => 2, "copper general" => 2, "go between" => 1, "pawn" => 1)

    global pieceVal = Dict{String,Int64}("_" => 0, "pawn"=>1, "pawn promoted" =>2, "lance" =>4, "lance promomted" =>5, "knight" =>6,
    "knight promoted" =>7, "silver general" =>7,"silver general promoted" =>8, "gold general" =>8, "bishop" =>11, "rook" =>13, "bishop promoted" =>15, "rook promoted" =>17, "king"=>50)

    global prStandard = Dict{String, String}("rook promoted" => "dragon king","bishop promoted" => "dragon horse","silver general promoted" => "gold general",
     	"knight promoted" => "gold general", "lance promoted" => "gold general", "pawn promoted" => "gold general")
    global prTenjiku = Dict{String,String}("bishop promoted" => "dragon horse", "bishop general promoted" => "vice general",
     	"blind tiger promoted" => "flying stag", "chariot soldier promoted" => "heavenly tetrarch", "copper general promoted" => "side mover", "dog promoted" => "multi general",
      "dragon horse promoted" => "horned falcon", "dragon king promoted" => "soaring eagle", "drunk elephant promoted" => "king", "ferocious leopard promoted" => "bishop", 
      "go between promomted" => "drunk elephant", "gold general promoted" => "rook", "horned falcon promoted" => "bishop general", "iron general promoted" => "vertical soldier", "kirin promoted" => "lion",
      "knight promoted" => "side soldier", "lance promoted" => "white horse", "lion promoted" => "lion hawk", "pawn promoted" => "gold general", "phoenix promoted" => "queen", "queen promoted" => "free eagle",
      "reverse chariot promoted" => "whale", "rook promoted" => "dragon king", "rook general promoted" => "great general", "side mover promoted" => "free boar",
      "side soldier promoted" => "water buffalo", "silver general promoted" => "vertical mover", "soaring eagle promoted" => "rook general", "vertical mover promoted" => "flying ox",
      "vertical soldier promoted" => "chariot soldier", "water buffalo promoted" => "fire demon"  )

    ######
    #DECLARATIONS - GLOBAL VARIABLES
    ######

    global defEmpty = "_"
    global defBishop = "bishop"
    global defBishopGeneral = "bishop general"
    global defBlindTiger = "blind tiger"
    global defCopperGeneral = "copper general"
    global defChariotSoldier = "chariot soldier"
    global defDog = "dog"
    global defDrunkElephant = "drunk elephant"
    global defDragonHorse = "dragon horse"
    global defDragonKing = "dragon king"
    global defFerociousLeopard = "ferocious leopard"
    global defFlyingOx = "flying ox"
    global defFlyingStag = "flying stag"
    global defFireDemon = "fire demon"
    global defFreeBoar = "free boar"
    global defFreeEagle = "free eagle"
    global defGoBetween = "go between"
    global defGoldGeneral = "gold general"
    global defGreatGeneral = "great general"
    global defHeavenlyTetrarch = "heavenly tetrarch"
    global defHornedFalcon = "horned falcon"
    global defIronGeneral = "iron general"
    global defKing = "king"
    global defKirin = "kirin"
    global defLance = "lance"
    global defLionHawk = "lion hawk"
    global defLion = "lion"
    global defMultiGeneral = "multi general"
    global defKnight = "knight"
    global defPawn = "pawn"
    global defPhoenix = "phoenix"
    global defQueen = "queen"
    global defRook = "rook"
    global defReverseChariot = "reverse chariot"
    global defRookGeneral = "rook general"
    global defSilverGeneral = "silver general"
    global defSoaringEagle = "soaring eagle"
    global defSideMover = "side mover"
    global defSideSoldier = "side soldier"
    global defViceGeneral = "vice general"
    global defVerticalMover = "vertical mover"
    global defVerticalSoldier = "vertical soldier"
    global defWaterBuffalo = "water buffalo"
    global defWhale = "whale"
    global defWhiteHorse = "white horse"


    global defDummy = "D"
    global defWhite = "Wh"
    global defBlack = "Bl"

    global tDim = 16
    global cDim = 12
    global sDim = 9
    global mDim = 5
    global dim = 16 # NEED TO BE CHANGED CURRENTLY FOR TESTING

    global moveChoice = Array{Int64}(8)
    global validateMoveChoice = Array{Int64}(8)
    global strength = -1
    global whitePrison = []
    global blackPrison = []
    global chessboard
    global tempChessboard

    global currTurn

    ######
    #DECLARATIONS - MOVE CHOICES
    ######

    type moveOffset
    	row::Int64
    	col::Int64
    end

    moveOption = Array{moveOffset}(17)

    moveOption[1] = moveOffset(-1, -1)
    moveOption[2] = moveOffset(-1, 0)
    moveOption[3] = moveOffset(-1, 1)
    moveOption[4] = moveOffset(0, -1)
    moveOption[5] = moveOffset(0, 0)
    moveOption[6] = moveOffset(0, 1)
    moveOption[7] = moveOffset(1, -1)
    moveOption[8] = moveOffset(1, 0)
    moveOption[9] = moveOffset(1, 1)
    moveOption[10] = moveOffset(-2, -1)
    moveOption[11] = moveOffset(-2, 1)
    moveOption[12] = moveOffset(2, -1)
    moveOption[13] = moveOffset(2, 1)
    moveOption[14] = moveOffset(-1, -2)
    moveOption[15] = moveOffset(-1, 2)
    moveOption[16] = moveOffset(1, -2)
    moveOption[17] = moveOffset(1, 2)

    type piece
    	display::String # FOR TESTING
    	name::String
    	side::AbstractString
    	BAttack::Int
    	WAttack::Int
    	promote::Bool
    end

    ######
    # MAIN FUNCTION
    ######

    function moveFunctions(option::String)
    	global chessboard
    	if option == "update"
    		for i in 1:dim
    			for j in 1:dim
    				chessboard[i, j].WAttack = 0
    				chessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	if option != "check"
    		for i in 1:dim
    			for j in 1:dim
    				if chessboard[i, j].side == currTurn
    					if chessboard[i, j].name == defBishop
    						defBishopMove(i, j, option)
    					elseif chessboard[i, j].name == defBishopGeneral
    						defBishopGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defBlindTiger
    						defBlindTigerMove(i, j, option)
    					elseif chessboard[i, j].name == defCopperGeneral
    						defCopperGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defChariotSoldier
    						defChariotSoldierMove(i, j, option)
    					elseif chessboard[i, j].name == defDog
    						defDogMove(i, j, option)
    					elseif chessboard[i, j].name == defDrunkElephant
    						defDrunkElephantrMove(i, j, option)
    					elseif chessboard[i, j].name == defDragonHorse
    						defDragonHorseMove(i, j, option)
    					elseif chessboard[i, j].name == defDragonKing
    						defDragonKingMove(i, j, option)
    					elseif chessboard[i, j].name == defFerociousLeopard
    						defFerociousLeopardMove(i, j, option)
    					elseif chessboard[i, j].name == defFireDemon
    						defFireDemonMove(i, j, option)
    					elseif chessboard[i, j].name == defFlyingOx
    						defFlyingOxMove(i, j, option)
    					elseif chessboard[i, j].name == defFlyingStag
    						defFlyingStagMove(i, j, option)
    					elseif chessboard[i, j].name == defFreeBoar
    						defFreeBoarMove(i, j, option)
    					elseif chessboard[i, j].name == defFreeEagle
    						defFreeEagleMove(i, j, option)
    					elseif chessboard[i, j].name == defGoldGeneral
    						defGoldGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defGreatGeneral
    						defGreatGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defHeavenlyTetrarch
    						defHeavenlyTetrarchMove(i, j, option)
    					elseif chessboard[i, j].name == defHornedFalcon
    						defHornedFalconMove(i, j, option)
    					elseif chessboard[i, j].name == defIronGeneral
    						defIronGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defKing
    						defKingMove(i, j, option)
    					elseif chessboard[i, j].name == defKirin
    						defKirinMove(i, j, option)
    					elseif chessboard[i, j].name == defLance
    						defLanceMove(i, j, option)
    					elseif chessboard[i, j].name == defLionHawk
    						defLionHawkMove(i, j, option)
    					elseif chessboard[i, j].name == defLion
    						defLionMove(i, j, option)
    					elseif chessboard[i, j].name == defMultiGeneral
    						defMultiGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defKnight
    						defKnightMove(i, j, option)
    					elseif chessboard[i, j].name == defPawn
    						defPawnMove(i, j, option)
    					elseif chessboard[i, j].name == defPhoenix
    						defPhoenixMove(i, j, option)
    					elseif chessboard[i, j].name == defQueen
    						defQueenMove(i, j, option)
    					elseif chessboard[i, j].name == defRook
    						defRookMove(i, j, option)
    					elseif chessboard[i, j].name == defReverseChariot
    						defReverseChariotMove(i, j, option)
    					elseif chessboard[i, j].name == defRookGeneral
    						defRookGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defSilverGeneral
    						defGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defSoaringEagle
    						defSoaringEagleMove(i, j, option)
    					elseif chessboard[i, j].name == defSideMover
    						defSideMoverMove(i, j, option)
    					elseif chessboard[i, j].name == defSideSoldier
    						defSideSoldierMove(i, j, option)
    					elseif chessboard[i, j].name == defViceGeneral
    						defViceGeneralMove(i, j, option)
    					elseif chessboard[i, j].name == defVerticalMover
    						defVerticalMoverMove(i, j, option)
    					elseif chessboard[i, j].name == defVerticalSoldier
    						defVerticalSoldierMove(i, j, option)
    					elseif chessboard[i, j].name == defWaterBuffalo
    						defWaterBuffaloMove(i, j, option)
    					elseif chessboard[i, j].name == defWhale
    						defWhaleMove(i, j, option)
    					elseif chessboard[i, j].name == defWhiteHorse
    						defWhiteHorseMove(i, j, option)
    					end
    				end
    			end
    		end
    	end

    	#=elseif option == "check"
    		option = "update"
    		saveChessboard = deepcopy(chessboard)
    		if chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defBishop
    			defBishopMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defBishopGeneral
    			defBishopGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defBlindTiger
    			defBlindTigerMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defCopperGeneral
    			defCopperGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defChariotSoldier
    			defChariotSoldierMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defDog
    			defDogMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defDrunkElephant
    			defDrunkElephantrMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defDragonHorse
    			defDragonHorseMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defDragonKing
    			defDragonKingMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFerociousLeopard
    			defFerociousLeopardMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFireDemon
    			defFireDemonMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFlyingOx
    			defFlyingOxMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFlyingStag
    			defFlyingStagMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFreeBoar
    			defFreeBoarMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defFreeEagle
    			defFreeEagleMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defGoldGeneral
    			defGoldGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defGreatGeneral
    			defGreatGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defHeavenlyTetrarch
    			defHeavenlyTetrarchMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defHornedFalcon
    			defHornedFalconMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defIronGeneral
    			defIronGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defKing
    			defKingMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defKirin
    			defKirinMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defLance
    			defLanceMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defLionHawk
    			defLionHawkMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defLion
    			defLionMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defMultiGeneral
    			defMultiGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defKnight
    			defKnightMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defPawn
    			defPawnMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defPhoenix
    			defPhoenixMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defQueen
    			defQueenMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defRook
    			defRookMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defReverseChariot
    			defReverseChariotMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defRookGeneral
    			defRookGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defSilverGeneral
    			defGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defSoaringEagle
    			defSoaringEagleMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defSideMover
    			defSideMoverMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defSideSoldier
    			defSideSoldierMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defViceGeneral
    			defViceGeneralMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defVerticalMover
    			defVerticalMoverMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defVerticalSoldier
    			defVerticalSoldierMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defWaterBuffalo
    			defWaterBuffaloMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defWhale
    			defWhaleMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].name == defWhiteHorse
    			defWhiteHorseMove(validateMoveChoice[1], validateMoveChoice[2], option)
    		end
    		i = 3
    		while validateMoveChoice[i] != 0 && validateMoveChoice[i + 1] != 0
    			if validateMoveChoice[5] != 0 && validateMoveChoice[6] != 0 # double capture exceptions
    				if chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHornedFalcon
    				|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defSoaringEagle
    				|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHeavenlyTetrarch
    				|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defFreeEagle
    				|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defLionHawk
    				|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defLion
    					if validateMoveChoice[5] == validateMoveChoice[1] && validateMoveChoice[6] == validateMoveChoice[2] # Check igui. Returns to same spot
    						if chessboard[validateMoveChoice[1], validateMoveChoice[2].side != chessboard[validateMoveChoice[3], validateMoveChoice[4].side
    							tempRow = validateMoveChoice[3] - validateMoveChoice[1]
    							tempCol = validateMoveChoice[4] - validateMoveChoice[2]
    							if chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defLionHawk
    							|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defLion
    							|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHeavenlyTetrarch
    								if (tempRow <= 1 && tempRow >= -1) && (tempCol <= 1 && tempRow >= -1)
    									return true
    								end
    							elseif chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHornedFalcon
    							|| chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defSoaringEagle
    								if chessboard[validateMoveChoice[1], validateMoveChoice[2]].side == defWhite && tempRow == -1
    									if chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHornedFalcon && tempCol == 0
    										return true
    									elseif chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defSoaringEagle && (tempCol == 1 || tempCol == -1)
    										return true
    									end
    								elseif chessboard[validateMoveChoice[1], validateMoveChoice[2]].side == defBlack && tempRow == 1
    									if chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defHornedFalcon && tempCol == 0
    										return true
    									elseif chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defSoaringEagle && (tempCol == 1 || tempCol == -1)
    										return true
    									end
    								end
    							elseif chessboard[validateMoveChoice[1], validateMoveChoice[2].name == defFreeEagle
    								if (tempRow == 1 || tempRow == -1) && (tempCol == 1 || tempRow == -1)
    									return true
    								end
    							end
    						end
    					end
    				end
    			end
    			if chessboard[validateMoveChoice[1], validateMoveChoice[2].side == defBlack
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].BAttack == 0
    					return false
    				end
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].side == chessboard[validateMoveChoice[1], validateMoveChoice[2]].side
    					return false
    				end
    			end
    								
    	
    						
    			if chessboard[validateMoveChoice[1], validateMoveChoice[2].side == defWhite
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].WAttack == 0
    					return false
    				end
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].side == chessboard[validateMoveChoice[1], validateMoveChoice[2]].side
    					return false
    				end
    			if chessboard[validateMoveChoice[1], validateMoveChoice[2].side == defBlack
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].BAttack == 0
    					return false
    				end
    				if chessboard[validateMoveChoice[i], validateMoveChoice[i + 1]].side == chessboard[validateMoveChoice[1], validateMoveChoice[2]].side
    					return false
    				end
    			end
    		end
    		chessboard = saveChessboard
    		return true =#	
    end

    ######
    # FUNCTIONS TO MODIFY BOARD
    ######

    function update(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64, option::String)
    	global tempChessboard
    	global chessboard
    	if option == "special update"
    		if chessboard[srcRow, srcCol].side == defWhite
    			tempChessboard[destRow, destCol].WAttack += 1
    		elseif chessboard[srcRow, srcCol].side == defBlack
    			tempChessboard[destRow, destCol].BAttack += 1
    		end
    	elseif option == "update"
    		if chessboard[srcRow, srcCol].side == defWhite
    			chessboard[destRow, destCol].WAttack += 1
    		elseif chessboard[srcRow, srcCol].side == defBlack
    			chessboard[destRow, destCol].BAttack += 1
    		end
    	end
    end

    function movePiece(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64)
    	pieceToMove = chessboard[srcRow, srcCol].name
    	pieceToMoveSide = chessboard[srcRow, srcCol].side
    	pieceAttacked = chessboard[destRow, destCol].name
    	if pieceAttacked != pieceToMove || pieceAttack != defDummy
    		gamewin = capturePiece(destRow, destCol)
    	end
    	add(destRow, destCol, pieceToMove, pieceToMoveSide)
    	delete(srcRow, srcCol)
    	return gamewin
    end

    function capturePiece(destRow::Int64, destCol::Int64)
    	captured = chessboard[destRow, destCol]
    	if captured.side == defBlack
    		capturedArray = whitePrison # Record which side the piece is on being captured, prison is the colour of where drop can check from
    	elseif captured.side == defWhite # Use splice!(array, object) splice returns the object that is removed
    		capturedArray = blackPrison
    	end
    	if captured.name == defKing # gamewin
    		push!(capturedArray, captured.name)
    		return true
    	elseif captured.name == defGGen # Does not promote
    		push!(capturedArray, captured.name)
    		return false
    	#elseif 65 <= UInt32(captured.name) <= 90
    	#	captured.name += 32 # Demote captured piece.
    	#	push!(capturedArray, captured.name)
    	#	return false
    	end
    	return false
    end

    # tempMoveChoice[1] is going to store the type of attack, 1 = single capture, 2 = double capture, 3 = vice general/fire demon
    # Have not coded changing capturing chessboard
    function capture(tempMoveChoice, demonBurnVal::Int64)
    	a = 0
    	b = 0
    	global strength
    	global moveChoice
    	global chessboard
    	local tempChessboard
    	temp = -1
    	if demonBurnVal != 0
    		temp = demonBurnVal
    	end
    	#println(demonBurnVal)
    	if tempMoveChoice[1] == 1 || tempMoveChoice[1] == 4
    		a = 4
    		b = 5
    	elseif tempMoveChoice[1] == 3 || tempMoveChoice[1] == 5
    		a = 8
    		b = 9
    		while tempMoveChoice[a] == 0 && tempMoveChoice[b] == 0
    			a -= 2
    			b -= 2
    		end
    	end
    	if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defFireDemon
    		tempChessboard = deepcopy(chessboard)
    	end
    	if tempMoveChoice[1] == 1 || tempMoveChoice[1] == 3
    		if dim == tDim
    			temp = pieceValTenjiku[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]		
    		elseif dim == cDim
    			temp = pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
    		else
    			temp = pieceVal[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
    		end
    		if chessboard[tempMoveChoice[2], tempMoveChoice[3]].side == defWhite # check if attack is safe
    			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
    				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
    					temp += 600
    				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
    					temp += 91
    				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
    					temp += 68
    				elseif dim == tDim
    					temp += 500
    				else
    					temp += 50
    				end
    			end
    		elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].side == defBlack
    			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
    				if chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == tDim
    					temp += 600
    				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing && dim == cDim
    					temp += 91
    				elseif chessboard[tempMoveChoice[2], tempMoveChoice[3]].name == defKing
    					temp += 68
    				elseif dim == tDim
    					temp += 500
    				else
    					temp += 50
    				end
    			end
    		end
    	elseif tempMoveChoice[1] == 2
    		a = 4
    		b = 5
    		tempChessboard = deepcopy(chessboard)
    		while tempMoveChoice[a] != 0 && tempMoveChoice[b] != 0
    			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side != defDummy && chessboard[tempMoveChoice[2], tempMoveChoice[3]].side != chessboard[tempMoveChoice[a], tempMoveChoice[b]].side
    				if dim == tDim
    					if temp == -1
    						temp = pieceValTenjiku[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
    					else
    						temp += pieceValTenjiku[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name]	
    					end
    				elseif dim == cDim
    					if temp == -1
    						temp = pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
    					else
    						temp += pieceValChu[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name]
    					end
    				end
    			end
    			testMove(tempMoveChoice[a-2], tempMoveChoice[b-2], tempMoveChoice[a], tempMoveChoice[b])
    			if tempMoveChoice[a + 2] == 0 && tempMoveChoice[b + 2] == 0
    				if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defWhite # check if attack is safe
    					if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
    						if dim == tDim
    							temp += 500
    						else
    							temp += 50
    						end
    					end
    				elseif chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defBlack
    					if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
    						if dim == tDim
    							temp += 500
    						else
    							temp += 50
    						end
    					end
    				end
    			end
    			a += 2
    			b += 2
    		end
    		chessboard = tempChessboard # restore
    	elseif tempMoveChoice[1] == 4 || tempMoveChoice[1] == 5
    		if temp == -1
    			temp = 0
    		end
    		temp = temp + pieceValTenjiku[chessboard[tempMoveChoice[a], tempMoveChoice[b]].name] - pieceValTenjiku[chessboard[tempMoveChoice[2], tempMoveChoice[3]].name]
    		testMove(tempMoveChoice[2], tempMoveChoice[3], tempMoveChoice[a], tempMoveChoice[b])		
    		if chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defWhite # check if attack is safe
    			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].BAttack == 0
    				temp += 500
    			end
    		elseif chessboard[tempMoveChoice[a], tempMoveChoice[b]].side == defBlack
    			if chessboard[tempMoveChoice[a], tempMoveChoice[b]].WAttack == 0
    				temp += 500
    			end
    		end
    		chessboard = tempChessboard # restore
    	end
    	if temp > strength
    		storeMoveChoice = [tempMoveChoice[2], tempMoveChoice[3], tempMoveChoice[4], tempMoveChoice[5], tempMoveChoice[6], tempMoveChoice[7], tempMoveChoice[8], tempMoveChoice[9]]
    		strength = temp
    		moveChoice = deepcopy(storeMoveChoice)
    		println(strength)
    		println(moveChoice)
    	end
    end

    function createBoard()
    	global chessboard
    	grid = [piece("_", defEmpty, defDummy, false, false, false)]
    	temp = deepcopy(grid)
    	for i in 1:dim - 1
    		temp = vcat(temp, deepcopy(grid))
    	end
    	chessboard = deepcopy(temp)
    	for i in 1:dim -1
    		chessboard = hcat(chessboard, deepcopy(temp))
    	end
    end

    function add(srcRow::Int64, srcCol::Int64, piecetype::String, colour::String)
    	chessboard[srcRow, srcCol].display = "X"
    	chessboard[srcRow, srcCol].name = piecetype
    	chessboard[srcRow, srcCol].side = colour
    end

    function delete(srcRow::Int64, srcCol::Int64)
    	chessboard[srcRow, srcCol].display = "_"
    	chessboard[srcRow,srcCol].name = defEmpty
    	chessboard[srcRow,srcCol].side = defDummy
    end

    function testMove(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64) # copies move, runs update, modifies global chessboard
    	global chessboard
    	add(destRow, destCol, chessboard[srcRow, srcCol].name, chessboard[srcRow, srcCol].side)
    	if chessboard[destRow, destCol].name == defFireDemon
    		demonBurn(srcRow, srcCol, destRow, destCol, 0, "burn")
    	end
    	delete(srcRow, srcCol)
    	moveFunctions("update")
    end

    ######
    # FIRE DEMON ONLY
    ######

    function demonBurn(srcRow::Int64, srcCol::Int64, destRow::Int64, destCol::Int64, temp::Int64, option::String)
    	global chessboard
    	global tempChessboard
    	for i in 1:9
    		if i != 5
    			tempRow = destRow + moveOption[i].row
    			tempCol = destCol + moveOption[i].col
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if option == "demon update"
    					update(srcRow, srcCol, tempRow, tempCol, "special update")
    				end
    				if option == "burn"
    					if chessboard[tempRow, tempCol].side != chessboard[destRow, destCol].side && chessboard[tempRow, tempCol].side != defDummy
    						delete(tempRow, tempCol)
    					end
    				end
    				if option == "calculate"
    					if chessboard[tempRow, tempCol].side != defDummy && chessboard[srcRow, srcCol].side != chessboard[tempRow, tempCol].side
    						temp += pieceValTenjiku[chessboard[tempRow, tempCol].name]
    					end
    				end
    			end
    		end
    	end
    	if option == "calculate"
    		return temp
    	end
    end

    ######
    # MOVE TYPES
    ######

    function step(srcRow::Int64, srcCol::Int64, option::String, destRow::Int64, destCol::Int64)
    	if destRow <= dim && destRow >= 1 && destCol <= dim && destCol >= 1
    		if option == "update" || option == "special update"
    			update(srcRow, srcCol, destRow, destCol, option)
    		end
    		if option == "capture"
    			if chessboard[srcRow, srcCol].side != chessboard[destRow, destCol].side && chessboard[destRow, destCol].side != defDummy
    				tempMoveChoice = [1, srcRow, srcCol, destRow, destCol, 0, 0, 0, 0]
    				capture(tempMoveChoice, 0)
    			end
    		end
    	end
    end

    function stepMultiple(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, jumps::Int64, tempMoveChoice)
    	global tempChessboard
    	a = 0
    	b = 0
    	if jumps == 0
    		return
    	end
    	saveMoveChoice = deepcopy(tempMoveChoice)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].name == defFreeEagle && (i == 1 || i == 3 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].name != defFreeEagle && i != 5)
    			tempMoveChoice = deepcopy(saveMoveChoice)
    			newTempRow = tempRow + moveOption[i].row
    			newTempCol = tempCol + moveOption[i].col
    			if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
    				if option == "special update"
    					update(srcRow, srcCol, newTempRow, newTempCol, option)
    				elseif option == "demon update"
    					demonBurn(srcRow, srcCol, newTempRow, newTempCol, 0, option)
    				end
    				a = 4
    				b = 5
    				while tempMoveChoice[a] != 0 && tempMoveChoice[b] != 0
    					a += 2
    					b += 2
    				end
    				tempMoveChoice[a] = newTempRow
    				tempMoveChoice[b] = newTempCol
    				if option == "capture"
    					if tempMoveChoice[1] == 2
    						if (a == 4 && b == 5 && chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy)
    							capture(tempMoveChoice, 0)
    						elseif a == 6 && b == 7 && (chessboard[srcRow, srcCol].side != chessboard[tempMoveChoice[4], tempMoveChoice[5]].side && chessboard[tempMoveChoice[4], tempMoveChoice[5]].side != defDummy) || (chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy)
    							capture(tempMoveChoice, 0)
    						end
    					end
    					if tempMoveChoice[1] == 3 || tempMoveChoice[1] == 4 || tempMoveChoice[1] == 5
    						temp = 0
    						if chessboard[srcRow, srcCol].name == defFireDemon
    							temp = demonBurn(srcRow, srcCol, newTempRow, newTempCol, temp, "calculate")
    						end
    						if (chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy) || temp != 0
    							capture(tempMoveChoice, temp)
    						end
    					end
    				end
    				if (chessboard[srcRow, srcCol].name == defLion || chessboard[srcRow, srcCol].name == defLionHawk) && chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side
    					stepMultiple(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, tempMoveChoice)
    				elseif chessboard[newTempRow, newTempCol].side == defDummy
    					stepMultiple(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, tempMoveChoice)
    				end
    			end
    		end
    	end
    end

    function stepMultipleLinear(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, jumps::Int64, index::Int64, tempMoveChoice)
    	global tempChessboard
    	a = 0
    	b = 0
    	if jumps == 0
    		return
    	end
    	saveMoveChoice = deepcopy(tempMoveChoice)
    	if jumps == 2
    		tempMoveChoice = deepcopy(saveMoveChoice)
    		newTempRow = tempRow + moveOption[index].row
    		newTempCol = tempCol + moveOption[index].col
    		if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
    			if option == "special update" || option == "update"
    				update(srcRow, srcCol, newTempRow, newTempCol, option)
    			end
    			tempMoveChoice[4] = newTempRow
    			tempMoveChoice[5] = newTempCol
    			if option == "capture"
    				if chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy	
    					capture(tempMoveChoice, 0)
    				end
    			end
    			stepMultipleLinear(srcRow, srcCol, option, newTempRow, newTempCol, jumps - 1, index, tempMoveChoice)
    		end
    	elseif jumps == 1
    		newTempRow = tempRow - moveOption[index].row # igui
    		newTempCol = tempCol - moveOption[index].col
    			tempMoveChoice[6] = newTempRow
    			tempMoveChoice[7] = newTempCol
    			if option == "capture"
    				if (chessboard[srcRow, srcCol].side != chessboard[tempMoveChoice[4], tempMoveChoice[5]].side && chessboard[tempMoveChoice[4], tempMoveChoice[5]].side != defDummy) # Check if either has occupied piece.
    					capture(tempMoveChoice, 0)
    				end
    			end
    		if chessboard[srcRow, srcCol].name != defHeavenlyTetrarch
    			newTempRow = tempRow + moveOption[index].row
    			newTempCol = tempCol + moveOption[index].col
    			if newTempRow <= dim && newTempRow >= 1 && newTempCol <= dim && newTempCol >= 1
    				if option == "update"
    					update(srcRow, srcCol, newTempRow, newTempCol, option)
    				end
    				if option == "capture"
    					if (chessboard[srcRow, srcCol].side != chessboard[tempMoveChoice[4], tempMoveChoice[5]].side && chessboard[tempMoveChoice[4], tempMoveChoice[5]].side != defDummy) || (chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy)
    						tempMoveChoice[6] = newTempRow
    						tempMoveChoice[7] = newTempCol
    						capture(tempMoveChoice, 0)	
    					end
    				end
    			end
    		end
    	end
    end
    	
    function rangeJump(srcRow::Int64, srcCol::Int64, option::String, index::Int64)
    	tempRow = srcRow
    	tempCol = srcCol
    	while true
    		tempRow = tempRow + moveOption[index].row
    		tempCol = tempCol + moveOption[index].col
    		if tempRow > dim || tempRow < 1 || tempCol > dim || tempCol < 1
    			break
    		end
    		if option == "update" || option == "special update"
    			update(srcRow, srcCol, tempRow, tempCol, option)
    		end
    		if chessboard[srcRow, srcCol].side != chessboard[tempRow, tempCol].side && chessboard[tempRow, tempCol].side != defDummy
    			if option == "capture"
    				tempMoveChoice = [1, srcRow, srcCol, tempRow, tempCol, 0, 0, 0, 0]
    				capture(tempMoveChoice, 0)
    			end
    		end	
    		if rangeJumpPriority[chessboard[srcRow, srcCol].name] < rangeJumpPriority[chessboard[tempRow, tempCol].name] # Not jumpable
    			break
    		end	
    	end
    end

    function range(srcRow::Int64, srcCol::Int64, option::String, tempRow::Int64, tempCol::Int64, index::Int64)
    	local tempMoveChoice	
    	newTempRow = tempRow
    	newTempCol = tempCol
    	while true
    		newTempRow = newTempRow + moveOption[index].row
    		newTempCol = newTempCol + moveOption[index].col
    		if newTempRow > dim || newTempRow < 1 || newTempCol > dim || newTempCol < 1
    			break
    		end
    		if option == "update" || option == "special update"
    			update(srcRow, srcCol, newTempRow, newTempCol, option)
    		elseif option == "demon update"
    			demonBurn(srcRow, srcCol, newTempRow, newTempCol, 0, option)
    		end
    		temp = 0
    		if option == "capture"
    			if chessboard[srcRow, srcCol].name == defFireDemon
    				temp = demonBurn(srcRow, srcCol, newTempRow, newTempCol, temp, "calculate")
    			end
    			if (chessboard[srcRow, srcCol].side != chessboard[newTempRow, newTempCol].side && chessboard[newTempRow, newTempCol].side != defDummy) || temp != 0
    				if chessboard[srcRow, srcCol].name == defFireDemon
    					tempMoveChoice = [4, srcRow, srcCol, newTempRow, newTempCol, 0, 0, 0, 0]
    				else
    					tempMoveChoice = [1, srcRow, srcCol, newTempRow, newTempCol, 0, 0, 0, 0]
    				end
    				capture(tempMoveChoice, temp)
    			end
    		end
    		if chessboard[newTempRow, newTempCol].side != defDummy
    			break
    		end
    	end
    end

    ######
    # PROMOTiONS
    ######

    function prPromote(destRow::Int64, destCol::Int64)
      targetPie = chessboard[destRow,destCol]
      if !targetPie.promote #not promoted
        if dim == tDim && targetPie.name != defFireDemon && targetPie.name != defFreeEagle &&
          targetPie.name != defGreatGeneral && targetPie.name != defKing && targetPie.name != defLionHawk &&
          targetPie.name != defViceGeneral
          if targetPie.side == defWhite
            if destRow <= 5
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          elseif targetPie.side == defBlack
            if destRow >= 12
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          else
            return false
          end
        elseif dim == cDim && targetPie.name != defKing && targetPie.name != defQueen && targetPie.name != defLion
          if targetPie.side == defWhite
            if destRow <= 4
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          elseif targetPie.side == defBlack
            if destRow >= 9
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          else
            return false
          end
        elseif dim == sDim && get(prStandard,targetPie.name,"none") != "none"
          if targetPie.side == defWhite
            if destRow <= 3
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          elseif targetPie.side == defBlack
            if destRow >= 7
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          else
            return false
          end
        elseif dim == mDim && get(prStandard,targetPie.name,"none") != "none"
          if targetPie.side == defWhite
            if destRow <= 1
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          elseif targetPie.side == defBlack
            if destRow >= 5
              chessboard[destRow,destCol].name = chessboard[destRow,destCol].name *" promoted"
              chessboard[destRow,destCol].promote = true
              return true
            end
          else
            return false
          end
        end
      end
    	return false
    end

    #

    function autoPromote(destRow::Int64, destCol::Int64)  # Run function after pawn, lance or knight move. Check if auto promote.
    	if chessboard[destRow, destCol].name == defPawn || chessboard[destRow, destCol].name == defLance
    		if chessboard[destRow, destCol].side == defWhite
    			if destRow == 1
    			  prPromote(destRow, destCol)
    				return true
    			end
    		elseif chessboard[destRow, destCol].side == defBlack
    			if destRow == dim
    				prPromote(destRow, destCol)
    				return true
    			end
    		else
    			return false
    		end
    	elseif dim != cDim && chessboard[destRow, destCol].name == defKnight
    		if chessboard[destRow, destCol].side == defWhite
    			if destRow <= 2
    				prPromote(destRow, destCol)
    				return true
    			end
    		elseif chessboard[destRow, destCol].side == defBlack
    			if destRow >= dim - 1
    				prPromote(destRow, destCol)
    				return true
    			end
    		else
    			return false
    		end
    	else
    		return false
    	end
    	return false
    end

    ######
    # PIECE MOVES
    ######

    function defKingMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 5
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defDrunkElephantMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if chessboard[srcRow, srcCol].side == defWhite && (i != 5 && i != 8) || chessboard[srcRow, srcCol].side == defBlack && (i != 2 && i != 5)
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defViceGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	for i in 1:9
    		if i == 1 || i == 3 || i == 7 || i == 9
    			rangeJump(srcRow, srcCol, option, i)
    		end
    	end
    	tempMoveChoice = [3, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 3, tempMoveChoice)
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end
    	
    function defGreatGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 5
    			rangeJump(srcRow, srcCol, option, i)
    		end
    	end
    end

    function defBishopGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 1 || i == 3 || i == 7 || i == 9
    			rangeJump(srcRow, srcCol, option, i)
    		end
    	end
    end

    function defRookGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 4 || i == 6 || i == 8
    			rangeJump(srcRow, srcCol, option, i)
    		end
    	end
    end

    function defHornedFalconMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	for i in 1:9
    		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 2) || (chessboard[srcRow, srcCol].side == defBlack && i != 8))
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
    			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		end
    	end
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end

    function defSoaringEagleMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	for i in 1:9
    		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 1 && i != 3) || (chessboard[srcRow, srcCol].side == defBlack && i != 7 && i != 9))
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
    			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		end
    	end
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end

    function defDragonHorseMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 1 || i == 3 || i == 7 || i == 9
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 2 || i == 4 || i == 6 || i == 8
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defDragonKingMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 4 || i == 6 || i == 8 
    			range(srcRow, srcCol, srcRow, srcCol, option, i)
    		elseif i == 1 || i == 3 || i == 7 || i == 9
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end
    		
    function defBishopMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 1 || i == 3 || i == 7 || i == 9
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defRookMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 4 || i == 6 || i == 8 
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defFerociousLeopardMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 4 && i != 5 && i != 6
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defGoldGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && (i != 5 && i != 7 && i != 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i != 1 && i != 3 && i != 5))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defPawnMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defGoBetweenMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defFireDemonMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update" || option == "capture"
    		if option == "update"
    			option = "demon update"
    		end
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	for i in 1:9
    		if i != 2 && i != 5 && i != 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    	tempMoveChoice = [5, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 3, tempMoveChoice)
    	if option == "demon update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end

    function defHeavenlyTetrarchMove(srcRow::Int64, srcCol::Int64, option::String) # Need Exceptions
    	for i in 1:9
    		if i != 5
    			tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    			stepMultipleLinear(srcRow, srcCol, option, srcRow, srcCol, 2, i, tempMoveChoice)
    		end
    		if i != 4 && i != 5 && i != 6
    			range(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col, i)
    		elseif i == 4 || i == 6
    			tempRow = srcRow + 2*moveOption[i].row
    			tempCol = srcCol + 2*moveOption[i].col
    			step(srcRow, srcCol, option, tempRow, tempCol)
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if chessboard[tempRow, tempCol].side == defDummy
    					step(srcRow, srcCol, option, srcRow + 3*moveOption[i].row, srcCol + 3*moveOption[i].col)
    				end
    			end
    		end
    	end
    end
    			
    function defWaterBuffaloMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 2 && i != 5 && i != 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 2 || i == 8
    			tempRow = srcRow + moveOption[i].row
    			tempCol = srcCol + moveOption[i].col
    			step(srcRow, srcCol, option, tempRow, tempCol)
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if chessboard[tempRow, tempCol].side == defDummy
    					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    				end
    			end
    		end
    	end
    end

    function defChariotSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 4 && i != 5 && i != 6
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 4 || i == 6
    			tempRow = srcRow + moveOption[i].row
    			tempCol = srcCol + moveOption[i].col
    			step(srcRow, srcCol, option, tempRow, tempCol)
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if chessboard[tempRow, tempCol].side == defDummy
    					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    				end
    			end
    		end
    	end
    end

    function defSideSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 4 || i == 6
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 2 || i == 8
    			tempRow = srcRow + moveOption[i].row
    			tempCol = srcCol + moveOption[i].col
    			step(srcRow, srcCol, option, tempRow, tempCol)
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if chessboard[tempRow, tempCol].side == defDummy && ((chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8))
    					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    				end
    			end
    		end
    	end
    end
    			
    function defVerticalSoldierMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 4 || i == 6 || i == 8
    			tempRow = srcRow + moveOption[i].row
    			tempCol = srcCol + moveOption[i].col
    			step(srcRow, srcCol, option, tempRow, tempCol)
    			if tempRow <= dim && tempRow >= 1 && tempCol <= dim && tempCol >= 1
    				if chessboard[tempRow, tempCol].side == defDummy && (i == 4 || i == 6)
    					step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    				end
    			end
    		end
    	end
    end

    function defKnightMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 10:13
    		if (chessboard[srcRow, srcCol].side == defWhite && (i == 10 || i == 11)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 12 || i == 13))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defIronGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 2 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 8 || i == 9))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defFreeEagleMove(srcRow::Int64, srcCol::Int64, option::String) # Need Exceptions
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
    	for i in 1:9
    		if i != 5
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    			range(srcRow, srcCol, option, srcRow, srcCol, i)		
    		end
    	end
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end

    	

    function defLionHawkMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
    	for i in 1:17
    		if i >= 1 && i <= 9 && i != 5
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		elseif i >= 10 && i <= 17
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    		if i == 1 || i == 3 || i == 7 || i == 9
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end


    function defQueenMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 5
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defLionMove(srcRow::Int64, srcCol::Int64, option::String)
    	global tempChessboard
    	if option == "update"
    		option = "special update"
    		tempChessboard = deepcopy(chessboard)
    		for i in 1:dim
    			for j in 1:dim
    				tempChessboard[i, j].WAttack = 0
    				tempChessboard[i, j].BAttack = 0
    			end
    		end
    	end
    	tempMoveChoice = [2, srcRow, srcCol, 0, 0, 0, 0, 0, 0]
    	stepMultiple(srcRow, srcCol, option, srcRow, srcCol, 2, tempMoveChoice)
    	for i in 1:17
    		if i >= 1 && i <= 9 && i != 5
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		elseif i >= 10 && i <= 17
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    	if option == "special update"
    		for i in 1:dim
    			for j in 1:dim
    				if i == srcRow && j == srcCol
    				elseif chessboard[srcRow, srcCol].side == defWhite && tempChessboard[i, j].WAttack >= 1
    					chessboard[i, j].WAttack += 1
    				elseif chessboard[srcRow, srcCol].side == defBlack && tempChessboard[i, j].BAttack >= 1
    					chessboard[i, j].BAttack += 1
    				end
    			end
    		end
    	end
    end

    function defPhoenixMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 4 || i == 6 || i == 8
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		elseif i == 1 || i == 3 || i == 7 || i == 9
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		end
    	end
    end

    function defKirinMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 1 || i == 3 || i == 7 || i == 9
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		elseif i == 2 || i == 4 || i == 6 || i == 8
    			step(srcRow, srcCol, option, srcRow + 2*moveOption[i].row, srcCol + 2*moveOption[i].col)
    		end
    	end
    end

    function defFreeBoarMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 2 && i != 5 && i != 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defFlyingOxMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 4 && i != 5 && i != 6
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defSideMoverMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 4 || i == 6
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 2 || i == 8
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defVerticalMoverMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i == 4 || i == 6
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defCopperGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defSilverGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (i != 4 && i != 5 && i != 6) || (chessboard[srcRow, srcCol].side == defWhite && i != 8) || (chessboard[srcRow, srcCol].side == defBlack && i != 2)
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defMultiGeneralMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && (i == 2 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3 || i == 8))
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defFlyingStagMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		elseif i != 5
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defDogMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && (i == 2 || i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3 || i == 8))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end
    		
    function defBlindTigerMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i != 5 && ((chessboard[srcRow, srcCol].side == defWhite && i != 2) || (chessboard[srcRow, srcCol].side == defBlack && i != 8))
    			step(srcRow, srcCol, option, srcRow + moveOption[i].row, srcCol + moveOption[i].col)
    		end
    	end
    end

    function defWhiteHorseMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 1 || i == 3)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 7 || i == 9))
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defWhaleMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8 || (chessboard[srcRow, srcCol].side == defWhite && (i == 7 || i == 9)) || (chessboard[srcRow, srcCol].side == defBlack && (i == 1 || i == 3))
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defLanceMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if (chessboard[srcRow, srcCol].side == defWhite && i == 2) || (chessboard[srcRow, srcCol].side == defBlack && i == 8)
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    function defReverseChariotMove(srcRow::Int64, srcCol::Int64, option::String)
    	for i in 1:9
    		if i == 2 || i == 8
    			range(srcRow, srcCol, option, srcRow, srcCol, i)
    		end
    	end
    end

    ######
    # TEST FUNCTIONS
    ######

    function printBoard()
    	for i in 1:dim
    		for j in 1:dim
    			stringTest = chessboard[i,j].display
    			print(" $stringTest")
    		end
    		println("")
    	end
    end

    function printBoardBAttack()
    	for i in 1:dim
    		for j in 1:dim
    			stringTest = chessboard[i,j].BAttack
    			print(" $stringTest")
    		end
    		println("")
    	end
    end

    function printBoardWAttack()
    	for i in 1:dim
    		for j in 1:dim
    			stringTest = chessboard[i,j].WAttack
    			print(" $stringTest")
    		end
    		println("")
    	end
    end

    ######
    # MAIN
    ######

    createBoard()
    add(8, 8, "vice general", "Bl")
    add(5, 6, "king", "Wh")
    printBoard()
    currTurn = "Bl"
    moveFunctions("capture")
    moveFunctions("update")
    strength = -1
    printBoardBAttack()