2010-08-09 66 views
5

表示四平面(一組正方形)的最基本方法是使用二維數組。六角形平面的形狀和運動表示

在C#中,我們把這個聲明爲int[,],可以使我們的飛機一樣大,我們想:

string[3,3] => tic-tac-toe board (or similar) 
string[8,8] => chess or checkers board 

「移動」在飛機上一個項目,我們只是ASIGN它TOA新的「位置」

//using our tic-tac-toe board: 
string[0,0] = "x"; //top-left 
string[1,1] = "o"; //middle-middle 

//to move 
string[0,1] = bN; //Black Knight's starting positon 
string[2,2] = bN; //Black Knight moves 
string[0,1] = String.Empty; 

那麼,如何將代表六角平面(一堆六邊形的),以及如何將從一個位置到下一個運動處理?

注意:這不完全是理論上的,因爲我有一個想法,那就是需要這種運動的腦袋裏有一個小小的遊戲,但是我無法圍繞如何完成這件事。我已經查看了其他一些問題,但無法找到合適的匹配...

+0

你已經解釋了一個「四足飛機」,但是到底什麼是六角形飛機呢?一個6維平面?或者它是一個二維平面,形狀像一個六邊形,在成角的兩邊有一堆半角切片?切片正方形可用位置? – 2010-08-09 19:43:12

+0

@Jimmy Hoffa董事會的例子。 http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif – 2010-08-09 19:45:51

+0

你提出這個問題很有趣。上個週末我剛剛開始製作2D六角形瓦片遊戲。 – 2010-08-09 20:11:38

回答

7

我不知道這是否是最佳解決方案,但我要做的是創建一個新類型的棋盤該板將是「單元」的集合,每個單元將包含指向其每個相鄰單元的指針(或者如果單元位於邊緣,則爲空)。你可以在棋盤類上實現一些迭代器來遍歷單元格。

你將不得不把它更像一個List而不是一個向量。但這至少是一個開始。


另一種解決方案是設置你登上了這樣alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

,仍然只是使用[,]進入每個單元格,但它需要多一點的數學搞清楚,如果你正在穿越細胞( Up Right是[+ 1,-1],Right是[+1,0],Down Right是[0,+ 1],Down Left是[-1,+ 1],Left是[-1,0],上左爲[0,-1])

編輯

如果你想垂直的牆壁,而不是傾斜只需使寬度(X)等於X + Y * 2,然後在每一行上設置當前行號(y),並將單元格0設置爲Y-y,並將X-Y設置爲X關閉限制。

例子:

const int X = 10; 
const int Y = 10; 
int grid[,] = new int[X+(2*Y), Y]; 

bool IsCellOffLimits(int x, int y) 
{ 
    return (x < Y-y || x > X-y || y < 0 || y > Y); 
} 

你浪費一點內存空間,但它給你一個板這樣 alt text http://img192.imageshack.us/img192/5580/gridw.png

如果你很聰明©你可以使用正常的空間,但只是有你代碼有任何東西在Yy或Xy範圍內的董事會的反面。但是,病態代碼留給讀者。

+0

這可能是您最好的解決方案。一塊正方形和一塊正方形板之間唯一真正的區別是你如何顯示它,而不是你如何存儲它。 – 2010-08-09 21:35:48

0

三個方向,左/右,上/下,有趣的角度單向/其他方式。

public class Player 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public void MoveLeft() { X++; } 
    public void MoveRight() { X--; } 

    public void MoveUp() { Y++; } 
    public void MoveDown() { Y--; } 

    public void MoveFunny() { Y++; X++; } 
    public void MoveOtherFunny() { Y--; X--; } 
}