c - 使用行和列使一维数组可寻址

标签 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 并给出正确的方 block ,如:

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

最佳答案

您只需计算 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 答案中所述,使用内联函数会更好。

关于c - 使用行和列使一维数组可寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44786721/

相关文章:

c - 编译 C 时,Visual Studio 头文件中出现错误 C3409

c - 如何在C中计算IP地址和子网掩码的AND运算?

algorithm - 国际象棋的统计方法?

haskell - GHCi/Haskell 对黑色典当 unicode 字符有什么问题?

lambda - lambda 内部的非法函数调用

需要处理查询时 C 秒滴答作响?

c++ - 符号不同 [-Wpointer-sign] 在 Eclipse 中禁用此检查

c - 通过数组的最有效方法?

c++ - Sprite 纹理不从图像中划分碎片 C++

chess - 使用魔术位板生成滑动移动