0

好的,所以我在国际象棋比赛中走了很长一段路!我有一个主要问题!如果我想要棋盘[4][3] 上的棋子,则棋盘在内存中的索引如下所示:

y axis
  0 1 2 3 4 5 6 7
  1 
x 2
a 3
x 4     X
i 5
s 6
  7

我将 x 轴编号为内存索引的样子,以便用户在查看屏幕时看到这一点。正如我现在的代码一样,这是我必须输入的内容才能在 d,6 处获得棋子:用户输入 = wf4,它在程序中转换为 Board[5][3]。如您所见,我想输入 wd6 并转到 d 和最多 6 个。但程序首先下降 5,然后下降到 3(d)。

  1 R N B Q K B N R
x 2 P P P P P P P P
a 3
x 4
i 5         
s 6       P
  7 P P P   P P P P
  8 R N B Q K B N R
    a b c d e f g h
        y-axis

我有从坐标中减去 1 的公式,所以如果用户输入 (e,8),它会在 chessBoard[4][7] 中寻找一个棋子,但当然这不会找到棋子,因为 [4][ 7] 比 7 下降 4。我们想要超过 4 下降 7。我真正想要的是超过 4 上升 1!所以它看起来像这样:

  8 R N B Q K B N R
y 7 P P P P P P P P
a 6
x 5
i 4
s 3
  2 P P P P P P P P
  1 R N B Q K B N R
    a b c d e f g h
       x-axis

在这里,我应该输入 e, 1 并得到一个 King。为此,我需要找到某种方法使左下角变为 0,0 而不是左上角。所以基本上,我该怎么做?如何将 2D 数组索引转换为数学样式网格?!?!编辑***好吧,完美的例子!我是我的玩家,输入 c, 6 将弹出输入值:source.x = 2 和 source.y = 6。我有执行此操作的代码。现在我需要告诉我的棋盘[source.x][source.y]玩家的意思是棋盘[2][2]。看?而且我没有看到直接的公式,因为查看此输入列表与使用最后一个图表需要查看的板:

  • input = 1,4 array[4][1] 得到相同的片段
  • input = 5,7 array[1][5] 得到相同的部分
  • input = 2,6 array[2][2] 得到相同的片段
  • input = 3,7 array[1][3] 得到相同的部分

所以很明显输入 x 需要交换到数组的 y 索引中。但是,x 值呢?呃,这太复杂了

4

2 回答 2

1

试试chessBoard[x-1][8-y]

那样:

  • x = 1 -> x-1 = 0
  • x = 8 -> x-1 = 7

和:

  • y = 1 -> 8-y = 7
  • y = 8 -> 8-y = 0

正是你需要的。

更新

这里似乎有些混乱......所以让我们重述一下:排列 2D 矩阵的方法只有 8 种(最低限度合理):2 个x符号乘以 2 个y符号次切换x/y或不切换= 2*2*2 = 8。你只需要选择你最喜欢的。

首先,为了简单起见,我将假设两者xy范围从07包容。如果不是这种情况,那么更正应该是微不足道的。

让数组名称为b,那么你有:

  1. b[x][y]
  2. b[x][7-y]
  3. b[7-x][y]
  4. b[7-x][7-y]
  5. b[y][x]
  6. b[y][7-x]
  7. b[7-y][x]
  8. b[7-y][7-x]

现在,哪一个?简单的。例如,您说当x增加时您应该向右移动……那么,正确的位置在哪里?好吧,这取决于你如何绘制矩阵(我看到了你的 ASCII 艺术,但它很模棱两可),但是从 avobe 8 选项中,只有 2 应该像你说的那样移动。在这 2 个中,一个会y上升,另一个会下降。尝试两者并再次选择。

于 2012-10-01T20:13:08.930 回答
0

非常感谢你们的帮助,我真的很感激!我想到了。我的解决方案是继续制作两个 Location 结构。一个是 ChessLocation,其x 值为 chary 为 int,另一个是 ArrayLocation,其x 和 y 值均为 int 值。然后我制作了在两者之间进行转换的方法。这个想法是使用 ChessLocations 来操作我的代码中的几乎所有内容。只有当我实际在棋盘的某个位置设置一块或检查一块时,我才会使用 ArrayLocations。转换如下(另外,对不起,我不知道如何在这个文本编辑器中制作段落......)

ArrayLocation ChessBoard::convertToArrayLocation(ChessLocation chessLocation)
{
    ArrayLocation location;
    location.x = 8- chessLocation.y;
    location.y = chessLocation.x - 0x61;


    return location;
}

这将转换回 ChessLocation

ChessLocation ChessBoard::convertToChessLocation(ArrayLocation arrayLocation)
{
    ChessLocation location;

    location.x = 0;
    location.y = 0;
    location.x = arrayLocation.y +0x61;
    location.y = 8 - arrayLocation.x  ;

    return location;
}

我本可以使用两个接受任何值并吐出所需值的构造函数来创建一个 Location 类,但我对 c++ 还不是很精通(不幸的是,我所有的类都使用了 Java ...

于 2012-10-02T08:00:04.970 回答