public void Walk() { int currentCellValue = 1; MatrixCoordinates currentCoordinates = new MatrixCoordinates(0, 0); MatrixCoordinates currentDirection = Directions.Southeast; while (true) { this.body[currentCoordinates.Row, currentCoordinates.Column] = currentCellValue; if (!this.CanContinue(currentCoordinates)) { bool newCoordinatesFound = this.TryFindNewCoordinates(out currentCoordinates); if (newCoordinatesFound) { currentCellValue++; this.body[currentCoordinates.Row, currentCoordinates.Column] = currentCellValue; currentDirection = Directions.Southeast; } else { break; } } while (!this.CanGoToCoordinates(currentCoordinates + currentDirection)) { this.UpdateDirectionClockwise(ref currentDirection); } currentCoordinates += currentDirection; currentCellValue++; } }
private static MatrixCoordinates[] GetDirections() { MatrixCoordinates[] directions = new MatrixCoordinates[DirectionsCount]; directions[0] = Directions.Southeast; directions[1] = Directions.South; directions[2] = Directions.Southwest; directions[3] = Directions.West; directions[4] = Directions.Northwest; directions[5] = Directions.North; directions[6] = Directions.Northeast; directions[7] = Directions.East; return directions; }
private void UpdateDirectionClockwise(ref MatrixCoordinates direction) { int currentDirectionIndex = 0; for (int i = 0; i < DirectionsCount; i++) { if (direction == directions[i]) { currentDirectionIndex = i; break; } } int newDirectionIndex = 0; if (currentDirectionIndex == DirectionsCount - 1) { newDirectionIndex = 0; } else { newDirectionIndex = currentDirectionIndex + 1; } direction = directions[newDirectionIndex]; }
private bool TryFindNewCoordinates(out MatrixCoordinates newCoordinates) { newCoordinates = new MatrixCoordinates(0, 0); for (int row = 0; row < this.body.GetLength(0); row++) { for (int col = 0; col < this.body.GetLength(1); col++) { if (this.body[row, col] == 0) { newCoordinates.Row = row; newCoordinates.Column = col; return true; } } } return false; }
private bool CanGoToCoordinates(MatrixCoordinates coordinates) { bool validRow = (0 <= coordinates.Row && coordinates.Row < this.body.GetLength(0)); bool validCol = (0 <= coordinates.Column && coordinates.Column < this.body.GetLength(1)); return validRow && validCol && this.body[coordinates.Row, coordinates.Column] == 0; }
private bool CanContinue(MatrixCoordinates newCoordinates) { for (int i = 0; i < directions.Length; i++) { if (this.CanGoToCoordinates(newCoordinates + directions[i])) { return true; } } return false; }