func addMovesToBoard(current *matrix.DenseMatrix, newMoves *matrix.DenseMatrix, steps int) *matrix.DenseMatrix { // fmt.Println("New Moves: \n", newMoves.String()) result := current for i := 0; i < 15; i++ { for j := 0; j < 15; j++ { if newMoves.Get(i, j) != 0 && result.Get(i, j) == float64(0) { // fmt.Println(" Adding ", steps, " to (", i, ", ", j, ")") // if HoleBoard.Get(i, j) > 0 { // result.Set(i, j, 500) // } else { result.Set(i, j, float64(steps)) // } } } } return result }
func getNextLocations(piece byte, allMoves *matrix.DenseMatrix, ellipse *matrix.DenseMatrix, baseNode *node.Node) []*node.Node { result := make([]*node.Node, 0, 20) x := baseNode.GetX() y := baseNode.GetY() next := baseNode.GetStep() + 1 // Start with the single move board var singleMove *matrix.DenseMatrix switch piece { case Pawn: singleMove = singlePawnMove case Rook: singleMove = singleRookMove case Knight: singleMove = singleKnightMove case Bishop: singleMove = singleBishopMove case Queen: singleMove = singleQueenMove case King: singleMove = singleKingMove case Puppy: singleMove = singlePuppyMove } singleMove = shiftMatrix(singleMove, x-8, y-8) singleMove = singleMove.GetMatrix(7, 0, 8, 8) // fmt.Println("(", x, ", ", y, ")") // fmt.Println("Single Move: \n", singleMove) // fmt.Println("\nAll Moves: \n", allMoves) // fmt.Println("\nEllipse: ", ellipse) for i := 0; i < 8; i++ { for j := 0; j < 8; j++ { // fmt.Println("(", i+1, ", ", 8-j, ") : single: ", singleMove.Get(j, i), "ellipse: ", ellipse.Get(j, i), "all: ", allMoves.Get(j, i)) if singleMove.Get(j, i) != 0 && ellipse.Get(j, i) != 0 && allMoves.Get(j, i) == float64(next) { // fmt.Println("New Child Node: (", i+1, ", ", 8-j, ")") var newNode *node.Node newNode = new(node.Node) newNode.SetX(i + 1) newNode.SetY(8 - j) newNode.SetStep(next) baseNode.AddChild(newNode) result = append(result, newNode) } } } return result }
func GenerateMoveBoard(piece byte, x int, y int) *matrix.DenseMatrix { var singleMove *matrix.DenseMatrix var result *matrix.DenseMatrix // Start with the single move board switch piece { case Pawn: singleMove = singlePawnMove case Rook: singleMove = singleRookMove case Knight: singleMove = singleKnightMove case Bishop: singleMove = singleBishopMove case Queen: singleMove = singleQueenMove case King: singleMove = singleKingMove case Puppy: singleMove = singlePuppyMove } result = shiftMatrix(singleMove, x-8, y-8) for i := 0; i < 15; i++ { for j := 0; j < 15; j++ { if HoleBoard.Get(j, i) > float64(0) { result.Set(j, i, 500) } } } // fmt.Println(HoleBoard.String()) // Get the secondary moves for n := 1; n < 20; n++ { // fmt.Println("Current State: \n", result.String()) for i := 0; i < 15; i++ { for j := 0; j < 15; j++ { // Check if the current position needs to generate it's child moves if result.Get(i, j) == float64(n) { // Shift the single move matrix // fmt.Println("Generating moves from position (", j, ", ", i, ") as ", n) result = addMovesToBoard(result, shiftMatrix(singleMove, j-7, 15-(i+8)), n+1) } } } } // Remove the -1 for i := 0; i < 15; i++ { for j := 0; j < 15; j++ { // Check if the current position needs to generate it's child moves if result.Get(i, j) == float64(-1) { result.Set(i, j, 0) } } } // fmt.Println(result.String()) result = result.GetMatrix(7, 0, 8, 8) // for i := 0; i < 8; i++ { // for j := 0; j < 8; j++ { // if HoleBoard.Get(i, j) == 1 { // result.Set(j, i, 500) // } // } // } return result }