C++ 国际象棋数学网格的二维索引

C++ 国际象棋数学网格的二维索引,c++,chess,C++,Chess,好吧,我下棋要走很长一段路了!不过我有一个大问题!如果我想在棋盘[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:user input=wf4,它在程序中翻译为Board[5][3]。正如你所看到的,我想输入wd6,然后转到d,最多

好吧,我下棋要走很长一段路了!不过我有一个大问题!如果我想在棋盘[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:user input=wf4,它在程序中翻译为Board[5][3]。正如你所看到的,我想输入wd6,然后转到d,最多六个。但是程序先下降5,然后上升到3(d)

我有一个从坐标中减去1的公式,所以如果用户输入(e,8),它将在棋盘[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,然后得到一个国王。要做到这一点,我需要找到一些方法使左下角变成0,0,而不是左上角。那么基本上,我该怎么做呢?如何将二维数组索引转换为数学样式的网格?!?! 编辑***好的完美例子!我是我的播放器,输入c,6,它将弹出到输入值中:source.x=2和source.y=6。我有这样的代码。现在我需要告诉我的棋盘[source.x][source.y],玩家的意思是棋盘[2][2]。看见我没有看到一个直接公式,因为使用上一个图表,看看这个输入列表与电路板需要看到的内容:

  • input=1,4数组[4][1]获取相同的片段
  • input=5,7数组[1][5]获取相同的片段
  • input=2,6数组[2][2]获取相同的片段
  • input=3,7数组[1][3]获取相同的片段

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

试试
棋盘[x-1][8-y]

这样:

  • x=1->x-1=0
  • x=8->x-1=7
以及:

  • y=1->8-y=7
  • y=8->8-y=0
正是你需要的

更新

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

首先,为了简单起见,我将假设
x
y
的范围从
0
7
不等。如果不是这样的话,纠正应该是微不足道的

将数组名设为
b
,则有:

  • b[x][y]
  • b[x][7-y]
  • b[7-x][y]
  • b[7-x][7-y]
  • b[y][x]
  • b[y][7-x]
  • b[7-y][x]
  • b[7-y][7-x]

  • 现在,哪一个?容易的。例如,您说当
    x
    增加时,您应该向右移动。。。那么,哪里是正确的?好的,这取决于你如何绘制矩阵(我看到了你的ASCII艺术,但它很模糊),但是从avobe 8选项来看,只有2个应该像你说的那样移动。在这两个选项中,一个选项将向上显示
    y
    ,另一个选项将向下显示。两种方法都试一下,然后再选择。

    非常感谢你们的帮助,我真的很感激!我想出来了。我的解决方案是继续制作两个位置结构。一个是ChessLocation,它的x值是chary是int,另一个是ArrayLocation,它的x和y值都是int值。然后我做了一些方法在两者之间进行转换。这个想法是用棋子来操作代码中的几乎所有内容。只有当我实际设置一个工件或在电路板的某个位置检查工件时,我才会使用阵列定位。转换如下(另外,很抱歉,我不知道如何在此文本编辑器中创建段落…)

    这会转换回棋子位置

    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;
    }
    

    我可以用两个构造函数来构造一个位置类,它接受任何值并吐出你需要的值,但我还没有那么精通C++。(不幸的是,我所有的类都使用了Java…

    这实际上是一个透视问题。您的第一张图表显示2d数组的心智模型向下和向右生长,但在您的硬盘驱动器中没有“向下”和“向右”这两个词。如果您希望数组向右和向右生长,那么您只需要修改您的心智模型(如果您根据旧心智模型放置棋子,则可能需要修改棋子的初始位置)。但是,假设我创建了一个2d数组[8][8]。当我执行for循环初始化它时,它从0开始向下移动到7,然后创建一个数组[8]在每个索引处。那么…我会从8开始,移动到0来解决这个问题吗?好吧,这个问题我已经解决了。如果我正确理解了你的解决方案,那么输入(1,1)将给出(0,7)处的片段,但问题仍然存在。问题是,当用户选择坐标时,他先移动X,然后向上移动Y。但程序索引先向下移动X,然后再向上移动Y。这有意义吗?也许我解释得不够清楚?再次查看我在原始问题中绘制的电路板布局。程序使用X作为行和y作为列。但是数学网格使用x作为行,y作为列。而且,我也不想表现得太粗鲁!在上一篇评论中可能看起来像这样,但我真的很困惑哈哈!但是我已经有了处理实际索引号的代码。我正在使用char变量并减去正确的十六进制代码来处理它帽子。就像我说的,我遇到的问题是网格结构与数学网格完全不同。那么你可能想要
    棋盘[8-y][x-1]
    ?或者
    ches
    
    ArrayLocation ChessBoard::convertToArrayLocation(ChessLocation chessLocation)
    {
        ArrayLocation location;
        location.x = 8- chessLocation.y;
        location.y = chessLocation.x - 0x61;
    
    
        return location;
    }
    
    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;
    }