2012-06-30 90 views
2

我連續應用製備四個或至少其計算最佳移動和東西的類。遊戲棋盤的高度爲6,寬度爲7.我不確定是否應該命名實例變量gamePosition[6][7]gamePosition[7][6]。我知道使用哪一個並不重要,但比另一個更普遍?我想立即以正確的方式做到這一點。兩維C陣列

+1

如果你想要一個數學家的建議:首先使用X維度,然後Y維度,所以colums *行,所以gamePosition [7] [6]。 – 2012-06-30 20:24:08

+3

高度對應於行數,所以我寧願'gamePosition [6] [7];'。儘管如此,它真的**並不重要。 –

+3

@ H2CO3咦?在我研究的地方,尺寸是以行×列的形式給出的。 –

回答

6

C二維數組只是一個數組數組。

添加一些常量爲清楚:

#define ROWS 6 
#define COLUMNS 7 

如果你想能夠把一行作爲一個單獨的對象,使用方法:

someType gamePosition[ROWS][COLUMNS]; 

所以gamePosition[0]是代表一個一維數組第一(第零)行。

如果你希望能夠治療作爲單個對象,用途:

someType gamePosition[COLUMNS][ROWS]; 

如果你只關心單一的元素,你可以將其定義任何一種方式(當然,你必須始終如一)。將板作爲行數組而不是列數組可能會更直觀一些,但兩者都可以工作。

0

人都期待高x寬和行×colums,所以你應該使用:

gamePosition[6][7] 

而實際上我認爲這很重要。您應該使用兩種可能性中最直觀的方式來避免混淆讀者。

+0

http://mathworld.wolfram.com/Matrix.html:一個'm×n'矩陣由'm'行和'n'列組成。 – ouah

2

寬度 - 第一個方括號。 高度 - 第二方括號。

它並不真正無論哪個選項,你會選擇。你的代碼應該是可以理解和直觀的。

2

這完全取決於你。這裏沒有「更常見」或「正確」的方式。

  • 如果您更願意認爲你的遊戲板的平面直角座標,然後[column][row]格式將更好地工作,因爲建立的數學做法是指定橫座標第一和第二縱座標。

  • 如果您更願意將其視爲矩陣,那麼它會成爲另一種方式,因爲建立索引矩陣時的數學練習是將行索引放在第一位,然後將列索引放在第二位。

P.S.當然,針對這個問題的唯一真正的解決方案就是編寫代碼的方式是,稍後您可以通過在代碼的一個位置進行一次本地修改來在這兩種方法之間切換:)

1

它不對於語義來說很重要,但是有一些性能提示:當你在板上迭代單元時,首先通過增加第二個索引和第一個索引來完成它。即:

for (i = 0; i < FIRST_SIZE; ++i) 
    for (j = 0; j < SECOND_SIZE; ++j) 
    ... process gamePosition[i][j] ... 

由於緩存局部性,您將贏得性能。

所以,也許你應該計劃哪個索引是第一個取決於你的算法。

1

就像之前的一些帖子,沒關係,但它確實很重要。

第一個。從邏輯上講,它不會影響你的代碼,你可以隨意選擇一個。但在正常的思維中,你經常寫gamePosition[6][7],因爲你經常會想從上到下,從左到右;)

第二個我想你需要這個。那取決於你如何使用這個數組。我會解釋一下:

二維數組只是數組的數組。而且,由於性能,如果瀏覽數組中的所有值,通常會逐行更加有效。例如:你有a[n][m]

你應該:(逐行)

for(int i=0; i<n; i++) 
    for(int j=0; j<m; j++) 
     // do some stuff 

,而不是:(逐列),因爲你會失去性能

for(int i=0; i<m; i++) 
    for(int j=0;j<n; j++) 
     // do some stuff 

所以。你可以把你的遊戲,你能想到你如何使用您的陣列:如果你從下到更多的時候(俄羅斯方塊遊戲-is與我的算法爲例)頂部使用 ,你應該使用gamePosition[7][6]

否則,您瀏覽排列更頻繁(大部分時間),應該使用gamePosition[6][7]

很少有人知道這一點。希望這個幫助;)