使1D数组可以使用行和列进行寻址

时间:2017-06-27 17:46:19

标签: c chess

我在 C 中使用数组(单维)编写国际象棋引擎?

#define ROW(sq)         (sq >> 3)
#define COL(sq)         (sq & 7)

int board[64] = {
   0,1,2,3,4,5,6,7,
   8,9,10,11,12,13,,14,15,
   .......................
   .......................
   56,57,48,59,60,61,62,63
}

现在: 要得到11号的行和列,我使用:

int r = ROW(11);
int c = COL(11);

它给出了:

r = 1
c = 3

请帮我编写一个函数,使参数为rc,并给出正确的方格,如:

sq = fnc(r,c);
sq = fnc(1,3);
sq = 11;

3 个答案:

答案 0 :(得分:2)

您只需计算row * MAX_COL + col MAX_COL = 8。使用row * MAX_COL,您将进入下一行,如下图所示:

                   1 * 8 ---                 2 * 8 ---
                           |                         |
|         row = 0        | v       row = 1         | v       row = 2
| 0  1  2  3  4  5  6  7 | 8  9  10 11 12 13 14 15 | 16 ...

如果您想要一个使用全局变量board的宏:

#define FIELD(row,col) board[(row) * 8 + (col)]

或作为也使用全局定义的board变量的函数:

inline int FIELD (int row, int col)
{
   return board[row * 8 + col]
}

如果你想将电路板作为数组传递给函数,你可以执行以下操作,其中int boardArr[] decays指向一个指针:

inline int FIELD (int boardArr[], int row, int col)
{
   return boardArr[row * 8 + col]
}

此外,您应该更改宏定义,因为如果传递的参数是计算中使用的值,则它们是不安全的。你可以阅读它here on SO。因此,您应该在参数sq

周围使用大括号
#define ROW(sq)   ((sq) >> 3)
#define COL(sq)   ((sq) & 7)

使用内联函数会更好,因为在SO答案中也会这样说。

答案 1 :(得分:1)

如果您的电路板总是8x8,您可以看到每个r从0,8,16开始......每个c只是与这些初始点的偏移,因此给出{ {1}}和r,您可以按c计算数组索引以获取相应的部分。

答案 2 :(得分:1)

最好使用二维数组进行处理,因为这样您只需访问board[r][c]

如果您(或您的教授)坚持使用一维数组,此宏将执行您想要的操作:

#define GET_PIECE(r, c) (board[((c) + (8) * (r))])

注意所有内容都包含在括号中。 This is very important with macros!

更好的解决方案是使用inline function