2014-12-25 55 views
-3

在C++初学者在这里。C++从2d阵列对角检查

for (int z = 0; z < arraysize; z++) { 

    if (generated[z][0] == generated[z][1] && generated[z][1] == generated[z][2]) { 
     wins++; 
    } 

    if (generated[0][z] == generated[1][z] && generated[1][z] == generated[2][z]) { 
     wins++; 
    } 

正如你所看到的,它检查水平线。我想检查一下是否有对角线连续3个。如果有,wins变量应该添加一个。有任何想法吗?

+0

(不是一个答案)使用'arraysize'很好,但是你通过在代码本身中使用'2'来抵消它......考虑在内部使用循环;这接近于硬编码到固定大小。 – usr2564301

+0

@Peter,你的数组大小是多少? – aerokite

+0

@AerofoilKite const int = 3; – Peter

回答

1

从两个如果条件,你用,我认为你正在尝试像3 * 3井字脚趾。

所以,如果你的ARRAYSIZE是3,你不能在你的循环使用下列检查:

if (generated[z][z] == generated[z+1][z+1] && generated[z+1][z+1] == generated[z+2][z+2]) 
{ 
    wins++; 
} 

Z + 2和z + 1将穿越阵列极限。通过使用z为两个范围,而不只是一个索引

generated[0][0] == generated[1][1] && generated[1][1] == generated[2][2] 
generated[0][2] == generated[1][1] && generated[1][1] == generated[2][0] 
+0

没有迹象表明阵列的大小是固定的,或者如果是您的解决方案中使用的尺寸。 –

+0

当然不是。但是在他的'如果'情况下,他只是使用3 * 3大小的阵列来检查。这就是为什么,它最好是3 * 3阵列.. Tnx为downvote – aerokite

2

你可以这样做:


所以,你可以检查一下你的循环之外。

for (int z = 0; z < arraysize; z++) 
{ 
    if (generated[z][z] == generated[0][0]) 
    { 
     //... handle it 
    } 
    if (generated[arraysize - z - 1][z] == generated[arraysize - 1][0]) 
    { 
     //... handle it 
    } 

} 

不幸的是,这只会让你到目前为止。您的代码中的当前逻辑不会像您期望的那样工作。问题是它保持横向和纵向所有线的累计计数。如果你有几个部分匹配,你可能会得到一个不正确的win值。您可以通过在执行扫描时添加几个附加循环来检查每条垂直和水平线的内容来避免此问题。这将需要添加一些额外的标志以跟踪在任一方向是否有胜利。以下示例应该为您提供一组灵活多变的检查,可用于任何大小的数组。

bool hwin = false; 
bool vwin = false; 
int d1wins = 0; 
int d2wins = 0; 
for (int z = 0; z < arraysize; z++) 
{ 
    int hwins = 0; 
    int vwins = 0; 

    // Check horizontal line 
    for (int i = 0; i < arraysize; ++i) 
    { 
     if (generated[i][z] == generated[0][z]) 
     { 
      hwins++; 
     } 
    } 
    hwin = hwin || hwins == arraysize; 

    // Check vertical line 
    for (int i = 0; i < arraysize; ++i) 
    { 
     if (generated[z][i] == generated[z][0]) 
     { 
      vwins++; 
     } 
    } 
    vwin = vwin || vwins == arraysize; 

    // Check diagonal 
    if (generated[z][z] == generated[0][0]) 
    { 
     d1wins++; 
    } 

    // Check diagonal 
    if (generated[arraysize - z - 1][z] == generated[arraysize - 1][0]) 
    { 
     d2wins++; 
    } 
} 

bool dwin = d1wins == arraysize || d2wins == arraysize; 
+1

阵列大小是3.我认为他正在尝试井字游戏。而且他只检查大小为3的水平和垂直。所以你不应该使用循环。 – aerokite

+0

非常感谢,非常感谢。试图做一个老虎机计数对角线和水平 – Peter

+1

@Peter然后,你一定要确保你的代码是可调整的行数之间可用的行数。 3x3是一种配置,但5x3和5x4这些日子更常见。这需要更多的逻辑,而不是你准备好给出你当前的代码。 –