C++ 国际象棋数学网格的二维索引
好吧,我下棋要走很长一段路了!不过我有一个大问题!如果我想在棋盘[4][3]上得到一块棋子,那么下面是棋盘在内存中作为索引的样子: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,最多
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
x
符号乘以2y
符号乘以切换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值是char而y是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;
}