// Place piece on the board and handle board state management private void PlacePiece(GoStone piece, Vector2 pointGrid) { int point_x = (int)pointGrid.x; int point_y = (int)pointGrid.y; GoPoint point_center = gridPoints[point_x, point_y]; GoColor color_attacker = piece.Color; GoColor color_enemy = (color_attacker == GoColor.GC_Black ? GoColor.GC_White : GoColor.GC_Black); // Place GoPiece GameObject in the GoPoint point_center.SetPiece(piece); //// Decrement neighboring point's empty count //UpdateAdjacentEmptySpaces(pointGrid, (color_attacker == GoColor.GC_Black)); // Check if we have captured any enemy pieces (Up/Down/Left/Right Queue <Vector2> queue_adjacents = new Queue <Vector2>(); List <Vector2> list_adj = GetAdjacentPoints(pointGrid); foreach (Vector2 point_adj in list_adj) { queue_adjacents.Enqueue(point_adj); } int count_captured = 0; while (queue_adjacents.Count > 0) { // Retrieve Vector2 Vector2 vec_curr = queue_adjacents.Dequeue(); // Check if valid if (IsValidPoint(vec_curr)) { // Retrieve GoPoint GoPoint point_curr = gridPoints[(int)vec_curr.x, (int)vec_curr.y]; // Check if valid, if enemy color if (!point_curr.IsEmpty() && point_curr.GetStone().Color == color_enemy) { // If so, check if surrounded. if (IsGroupCaptured(vec_curr, color_enemy)) { // If so, remove group and report score to GoStateManager count_captured += TryCaptureGroup(vec_curr, color_enemy); } } } } // Report captured stones if (count_captured > 0) { gameStateManager.OnStonesCaptured(color_attacker, count_captured); } }