Using a 2D tile array for your world/level generation and representation will definitely simplify things. For example you could internally represent your world in a grid of tiles and take it from there :
using System;
using System.Collections.Generic;
using System.Text;
namespace Tiles {
public class Vector2 {
public int x; public int y;
public Vector2(int x, int y) {
this.x = x; this.y = y;
}
}
public enum TileType {
None,
Grass,
Dirt,
Stone,
Water,
Air,
}
public class Tile {
public Vector2 position;
public TileType tileType;
public Tile(int x, int y, TileType tileType) {
this.position = new Vector2(x, y);
this.tileType = tileType;
}
}
public class World {
public Tile[,] tiles;
public int sizeX; public int sizeY;
public World(int sizeX, int sizeY) {
this.sizeX = sizeX;
this.sizeY = sizeY;
int tileCount;
// build the world
tiles = new Tile[sizeX, sizeY];
Random rnd = new Random();
tileCount = Enum.GetValues(typeof(TileType)).Length;
// construct grid of tiles
for (int x = 0; x < sizeX; x++) {
for (int y = 0; y < sizeX; y++) {
tiles[x, y] = new Tile(x, y, (TileType)rnd.Next(tileCount));
}
}
}
}
class Program {
static void Main(string[] args) {
World world = new World(20, 20);
for (int y = 0; y < world.sizeY; y++) {
for (int x = 0; x < world.sizeX; x++) {
Console.Write((int)world.tiles[x, y].tileType + " ");
}
Console.WriteLine();
}
}
}
}
Once thats set up you can then interrogate a tile in your move path to see if its walkable based on the terrain type, or if it's blocked by an child obstacle etc.