2009-08-07 80 views
6

我正在嘗試將棋盤遊戲帶到計算機世界,棋盤由16個空格組成,每個棋格6個,中間4個。董事會是菱形的,兩端代表兩個團隊的基地。在遊戲中,peices只向敵人的基地前進(當然有特殊能力),所以這裏是我的問題:你認爲什麼是代表遊戲棋盤的最佳數據結構?第一件事是我的心是一棵樹,但我真的不喜歡這個主意,因爲將有兩個「根」有什麼建議代表遊戲棋盤的最佳數據結構

板看起來是這樣的:?

& 
    & & 
& & & 
* * * * 
$ $ $ 
    $ $ 
    $ 

所以&隊只能移動。對$團隊,反之亦然,*保持中立領土

+0

請問您可以在什麼地方上傳繪圖板?我不確定我是否很好地解釋了你的描述。 – 2009-08-07 00:15:57

回答

11

它本質上是一個正方形嗎?鑽石形狀只是一個解釋問題?像這樣..

M A A A 
B M A A 
B B M A 
B B B M 

如果是這樣,也許只是使用二維數組,並使用您的顯示系統將其「變成鑽石」。

編輯

我想你可以映射你移動設置的陣列 - 如果你的「$」片只向上和向左或向上和向右,這幾乎相當於我的「B '只能向上移動'或'向右移動'。相似的,如果'&'棋子只能左右移動,就像'A'棋子只能向下或向左移動。

這個想法是,在程序的內部,想想你的數據'上下',但是當你向你的用戶展示你的遊戲狀態時,只需要在鑽石配置中繪製

+0

它的正方形,但我用鑽石,因爲在廣場的情況下,peices將不得不朝向另一個角對角移動,而不是隻是向上或向下移動,而我發現使得更有意義並且更方便 – 2009-08-07 00:17:41

+2

2D數組肯定是要走的路。它不僅是一個快捷方便的結構,而且運動規則應該易於編碼。把事情簡單化! – Darryl 2009-08-07 00:30:58

0

我會用一種圖形的像:

class Field 
{ 
    private List<Field> neighbours; 
} 

或者不是一個列表,而是一個包含邊界字段空引用的數組。任何董事會都可以用這個來表示。

+0

這當然是最簡單的做事方式,但我不喜歡它,因爲它沒有顯示左/右移動的限制,而鄰居列表不會明確告訴你哪個區域在哪裏。 – 2009-08-07 00:19:09

0

爲什麼不使用簡單的數組結構?如果棋盤是菱形的,它是方形/矩形的,對嗎?

Dim myBoard(5,5) As Array 

當然,如果板形狀怪異,(像有空間和東西在中間),這可能無法正常工作。

+0

只要中間的東西是鑽石,它仍然可以工作 - 它們可以表示爲空值或類似的東西。 – 2009-08-07 00:16:25

+0

與justjeff相同,感謝您的想法 – 2009-08-07 00:19:50

1

中間四個字段相同的兩棵樹呢? (我的意思是引用相同的對象)

+0

我也想過,但不知道如果我採取中間領域,並抓住其父母會發生什麼?我怎麼知道一個人得到? 最佳答案呢! – 2009-08-07 00:47:51

+0

你說玩家只能前進 - 所以你需要父母嗎? – 2009-08-07 01:02:21

4

您關注的不僅僅是如何表示董事會又是如何表現的作品,因爲板件需要通信相互存在和影響。

因此,您如何表示你的董事會將由您如何表示你的作品和遊戲的制約板和片的規則確定。

您首先關心的是如何表現這些作品。

遊戲塊或遊戲自動機是面向對象編程的完美模型。

讓我配藥摒棄了宣言,如公共的,靜態的說明等

abstract class BasicUnit 
{ 
// determine constraints of movement here. 
// update position and return new position 
abstract Position move(Direction d); 

abstract Position getPosition(); 
Arsenal arsenal; 
} 

class Worker 
extends BasicUnit 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class farmer 
extends Worker 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class Warrior 
extends BasicUnit 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class Sniper 
extends Warrior 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

現在,你必須決定是否對棋子的位置是

  • 板中心:棋子的位置僅在棋盤上註冊
  • 以棋子爲中心:棋子只在棋子上註冊
  • 冗餘:你必須裁員當一塊棋子移動時,可以更新棋子和棋盤。

對於大多數棋盤遊戲來說,以棋子爲中心的棋子並不是一個好主意,因爲你必須搜索每件棋子來確定棋子是否被佔用。

如果以電路板爲中心,則需要搜索電路板的每個位置以找到一塊電路板的位置。

對於冗餘,您必須確保棋盤和棋子所登記的位置不會錯位。如果您打算允許您的遊戲通過互聯網進行播放,會話可以暫停和休眠 - 您可能會遇到同步方面的挑戰。

所以,你的問題的答案是 - 散列矢量來代表董事會。

哈希向量是一個具有兩個訪問門的集合 - 一個訪問位置,第二個訪問關鍵。你的散列載體將允許您通過位置來訪問

  • 董事會找出是在一個位置
  • 片的id,找出在黑板上它是什麼單位。

除非您的棋是多維棋盤遊戲,否則您不能將棋盤代表爲樹。當樹木,梯子或坐在棋盤位置上的城堡需要樹時,當單位達到棋盤的水平位置時,需要前進到梯子或城堡的垂直位置。而在城堡裏,這個單位需要轉移到衆多的房間裏。或者在樹上是一個女巫,能夠將這個單位捕獲到一個瓶子裏,並帶有令人困惑的逃生路徑。因此,使用樹結構來表示你的棋盤會給你的遊戲編程帶來不必要的複雜性。

無論是菱形還是圓形等均無關緊要。您只需要列舉棋盤的位置即可。枚舉方法必須方便您的規則捕獲。

這意味着,你不應該枚舉一個作爲(1,3),然後枚舉它的鄰近片爲(2,7) - 這只是常識。因爲(1,3)的鄰居是(0,2),(1,2),(2,2),(0,3),(2,3),(0,4),(1,4 )和(2,4)而不是(2,7)。

因此,您需要一個2維散列向量。

,以滿足您找出在x什麼單位的需求,你的董事會的y位置:

BasicUnit getPosition(x,y) 

除了,找出(X,Y)爲單位的位置。

Position getUnit(BasicUnit unit) 

那麼你可能計劃你的遊戲是可擴展的,以便於實現勝利的球員可以繼續發揮其具有不同的板形一個新的水平。你的二維散列矢量仍然會被使用,因爲你將軟件的表示層與其數據結構分開。

你只是在你的向量中插入更多職位。

您可以查看我的Java實現一個1-d的 http://code.google.com/p/synthfuljava/wiki/HashVector

散列載體把它翻譯爲您選擇的編程語言,並添加一個向量維它。

+0

我忘了補充說,變換一維哈希向量是一個將abtract(x,y)位置映射到一維哈希向量的實際線性位置的相當簡單的事情。 因此,如果您板是由9 9, 變換(X,Y)到向量索引是 vectorindex = X + 9 * Y – 2009-08-07 03:55:25

+0

好後,但哈希向量是該這樣的矯枉過正。與簡單的地圖相比,該板只有4x4意味着散列實際上會減慢速度。 – 2009-08-07 14:28:26