2013-04-29 115 views
1

我必須編寫一個程序來解決迷宮圖像,我決定將圖像傳遞到更容易閱讀的東西,所以我將圖像轉換成如下的二維數組:
#: blackwalls
':空格
R:開始(我知道在哪裏和讀)
B:端部(我知道在哪裏和是藍色)
問題與迷宮圖像2D陣列

的問題是,I表示各像素在一個字符中,所以我有一個441 x 441二維數組。 這裏我questino:我怎樣才能簡化我的二維數組中的元素數量,而不失迷宮比例?

我有這樣的:

# # # # # # # 
# ' ' ' ' ' ' ' ' '  
# ' ' ' ' ' ' ' ' '  
# ' ' ' ' ' ' ' ' ' 

,我想這

# # # # # # # 
#  
# ' ' ' ' ' ' ' ' '  
# 

我只想要刪除的白色空間,這樣我就不必檢查每個空間,問題是我必須確定每個列和每行必須刪除多少空格(')。

+0

退房我如何閱讀和在此建項目的迷宮地形:http://hexgridutilities.codeplex.com/我認爲你需要的一切是在MazeMap.cs。 – 2013-04-29 01:46:56

+0

感謝您的回答,您能否向我解釋一下他們在MazeMap.cs課程中做了些什麼? – Moy 2013-04-29 04:14:35

+0

你能發佈兩個你需要解決的例子嗎?最好的方法是(例如你需要編寫多麼複雜)取決於你需要什麼樣的迷宮 – Patashu 2013-04-29 04:50:54

回答

0

我不確定你在問什麼,但如果你想減小代表迷宮的數組的大小,你可以使用鋸齒狀的數組。至少對於其中一個維度。請參閱http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.110).aspx

然後,您可以用一個值和一個計數替換多個重複值。

Original: 
# # # # # # # 
# ' ' ' ' ' ' ' ' ' 
# ' ' ' ' ' ' ' ' ' 
# ' ' ' ' ' ' ' ' ' 

Jagged: 
# 7 
# ' 9 
# ' 9 
# ' 9 
+0

那麼您將如何解決迷宮? – Patashu 2013-04-29 04:52:14

+2

我知道起點在哪裏,「'」符號是我可以去的地方,然後我可以開始檢查每個位置(上,下,左和右),如果有#表示我不能去那個地方。 – Moy 2013-04-29 05:24:02

+0

@Patashu見Moises的評論。它只會改變你存儲數據的方式,而不會改變你如何使用它。 – denver 2013-04-29 13:36:10

0

這裏是我如何實現我的MazeMap的關鍵部分。它被設計用於六角形網格,所以連接與正交網格稍微偏離。

public sealed class MazeMap : MapDisplay { 
    protected override string[] Board { get { return _board; } } 
    string[] _board = new string[] { 
    ".............|.........|.......|.........|.............", 
     /* many similar lines omitted */ 
    ".............................|.......|.....|..........." 
    }; 

    public override bool IsPassable(ICoordsUser coords) { 
    return IsOnBoard(coords) && this[coords].Elevation == 0; 
    } 

    public override IMapGridHex this[ICoordsCanon coords] { 
    get {return this[coords.User];} 
    } 
    public override IMapGridHex this[ICoordsUser coords] { get { 
    return new GridHex(Board[coords.Y][coords.X], coords); 
    } } 

    public struct GridHex : IMapGridHex { 
    internal static MapDisplay MyBoard { get; set; } 

    public GridHex(char value, ICoordsUser coords) : this() { Value = value; Coords = coords; } 

    IBoard<IGridHex> IGridHex.Board   { get { return MyBoard; } } 
    public IBoard<IMapGridHex> Board   { get { return MyBoard; } } 
    public ICoordsUser   Coords   { get; private set; } 
    public int     Elevation  { get { return Value == '.' ? 0 : 1; } } 
    public int     ElevationASL { get { return Elevation * 10; } } 
    public int     HeightObserver { get { return ElevationASL + 1; } } 
    public int     HeightTarget { get { return ElevationASL + 1; } } 
    public int     HeightTerrain { get { return ElevationASL + (Value == '.' ? 0 : 10); } } 
    public char    Value   { get; private set; } 
    public IEnumerable<NeighbourHex> GetNeighbours() { 
     var @this = this; 
     return NeighbourHex.GetNeighbours(@this).Where(n=>@this.Board.IsOnBoard(n.Hex.Coords)); 
    } 
    } 
} 

注意大約一半向下的this的定義。這允許MaxeMap的一個實例像一個數組GridHex結構一樣訪問。

ICoordsUser和ICoordsCanon接口分別支持矩形或傾斜(即120度軸)的六角網格操作,並自動從一個轉換到另一個;這在正交網格中是不必要的,在這個網格中足以傳遞一個Point實例。

+0

感謝您的幫助我將使用A *算法來解決迷宮問題 – Moy 2013-05-02 22:41:36