/* Updates the board start when receiving a move over the network from an opponent on the same board. */ func UpdateFromOpponent(board int, team int, color int, turnO int, origL int, newL int, capturedI string, capturedT string, capturedU int) { if board != game.Board && capturedI != "" && team == game.TeamPlayer { // Ignore this update then. Or could actually get the captured piece thingy. captured := new(mylib.CapturedPiece) captured.Image = capturedI captured.Type = capturedT captured.TeamPiece = capturedU capturedPieces.Add(*captured) qml.Changed(capturedPieces, &capturedPieces.Len) } else if board == game.Board && team != game.TeamPlayer { if turn != turnO { // Incompatible state. Different amounts of turns fmt.Println("Error with the number of turns.") } else { chessBoard.Update(origL, newL) turn++ } } else { //if board != game.Board && team == game.TeamPlayer { // Can ignore, is a move not from your board // Can ignore if it //fmt.Println("DEBUG: An update from opponent or team mate that is not on this board has happend. Handled correctly!.") return } }
/* A function that modifies the local nodes game board and sends notification to other players about the move. */ func (c *ChessBoard) MovePiece(origLoc int, newLoc int) { if game.PlayerColor == (turn%2)+1 { // Get the square values at the index locations origS := c.Square(origLoc) newS := c.Square(newLoc) // Check that the origS color is the same as the local player's color. if origS.TeamPiece == (turn%2)+1 { // Check to see the the newLoc square is empty, same color piece, other team piece // For same team piece, move is not valid, exit if origS.TeamPiece == newS.TeamPiece { fmt.Println("Cannot move a piece on top of a piece of the same color") fmt.Println("An exception would be castling, but that is not implemented yet.") } else if newS.Empty { // For empty piece, move the piece there, and end the turn. // Involves sending info over the network and changing the turn value to the other team c.Board[newLoc].Empty = false c.Board[newLoc].TeamPiece = origS.TeamPiece c.Board[newLoc].Type = origS.Type c.Board[newLoc].OrigPosition = false c.Board[newLoc].FromOtherBoard = origS.FromOtherBoard c.Board[newLoc].Image = origS.Image newS.Empty = false newS.TeamPiece = origS.TeamPiece newS.Type = origS.Type newS.OrigPosition = false newS.FromOtherBoard = origS.FromOtherBoard newS.Image = origS.Image c.Board[origLoc].Image = "" c.Board[origLoc].Empty = true c.Board[origLoc].TeamPiece = mylib.EMPTY c.Board[origLoc].Type = "EMPTY" c.Board[origLoc].FromOtherBoard = false c.Board[origLoc].OrigPosition = false origS.Empty = true origS.TeamPiece = mylib.EMPTY origS.Type = "EMPTY" origS.OrigPosition = false origS.FromOtherBoard = false origS.Image = "" qml.Changed(c.Board[origLoc], &c.Board[origLoc].Image) qml.Changed(c.Board[newLoc], &c.Board[newLoc].Image) // Send message to the opponent before incrementing turn // Send them the current player, the turn value, and the 2 index's. // In this case, send a caputed value to nil or 0. // Also need to send board value. // Message content as follows: // board_num:team:current_player:turn:origLoc:newLoc: : temp := fmt.Sprintf("%v:%v:%v:%v:%v:%v:%v:%v:%v", game.Board, game.TeamPlayer, game.PlayerColor, turn, origLoc, newLoc, "", "", 0) //fmt.Println("DEBUG: state message to be sent accross network = ", temp) // client.Send_move(temp) // Find some way of having main send a message of temp to the other nodes. turn++ // Add a send message to opponent about the move... messenger.Msnger.Send_message(temp, mylib.MOVE) } else { // For enemy piece, record the captured piece, move the piece there and end the turn. // Involves sending info over the network and changing the turn value to the other team. // Record the captured Piece and add it to the array of captured pieces... // Create a gridview to view all of the caputred pieces.... captured := new(mylib.CapturedPiece) captured.Image = newS.Image captured.Type = newS.Type captured.TeamPiece = newS.TeamPiece capturedPieces.Add(*captured) c.Board[newLoc].Empty = false c.Board[newLoc].TeamPiece = origS.TeamPiece c.Board[newLoc].Type = origS.Type c.Board[newLoc].OrigPosition = false c.Board[newLoc].FromOtherBoard = origS.FromOtherBoard c.Board[newLoc].Image = origS.Image newS.Empty = false newS.TeamPiece = origS.TeamPiece newS.Type = origS.Type newS.OrigPosition = false newS.FromOtherBoard = origS.FromOtherBoard newS.Image = origS.Image c.Board[origLoc].Image = "" c.Board[origLoc].Empty = true c.Board[origLoc].TeamPiece = mylib.EMPTY c.Board[origLoc].Type = "EMPTY" c.Board[origLoc].FromOtherBoard = false c.Board[origLoc].OrigPosition = false origS.Empty = true origS.TeamPiece = mylib.EMPTY origS.Type = "EMPTY" origS.OrigPosition = false origS.FromOtherBoard = false origS.Image = "" qml.Changed(c.Board[origLoc], &c.Board[origLoc].Image) qml.Changed(c.Board[newLoc], &c.Board[newLoc].Image) qml.Changed(capturedPieces, &capturedPieces.Len) // Send message to the opponent before incrementing turn // Send them the current player, the turn value, and the 2 index's. // In this case, send a caputed value equal to [Color][Piece] as a string or something. // Add a send captured pieces to partner temp := fmt.Sprintf("%v:%v:%v:%v:%v:%v:%v:%v:%v", game.Board, game.TeamPlayer, game.PlayerColor, turn, origLoc, newLoc, captured.Image, captured.Type, captured.TeamPiece) turn++ messenger.Msnger.Send_message(temp, mylib.MOVE) if captured.Type == "King" { temp := fmt.Sprintf("%v:%v:%v", game.Board, game.TeamPlayer, "King") messenger.Msnger.Send_message(temp, mylib.GAMEOVER) EndGame(game.Board, game.TeamPlayer, "King") } } } else { fmt.Println("Cannot move pieces that are not your own!") } } else { fmt.Println("Can't move a piece when it is not your turn!") } }