gpt4 book ai didi

c - C中的"Minesweeper",计算周围地雷在板中某个位置附近的问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:53 24 4
gpt4 key购买 nike

我必须用 C 重新创建一个简单版本的游戏“雷区”,但我无法计算棋盘上某个位置附近有多少地雷。我的一段代码遍及整个阵列(板)搜索地雷。当它找到地雷时,它应该在地雷周围的所有地点加起来+1。我的代码只适用于 T[0][0] 周围的点。 m 和 n 代表板上的行数和列数。请帮忙!!

void mine_counting (int T[MMAX][NMAX], int m, int n)
{
int cont, i, j;

for (i = 0 ; i < m ; i++)
{
printf("\ni = %d", i);
for (j = 0 ; j < n ; j++)
printf("\nj = %d", j);
{
if (T[i][j] == -3)
{
if (i == 0)
{
printf("i=0");
if (j == 0)
{
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
if (T[i+1][j+1] != -3)
T[i+1][j+1] = T[i+1][j+1] + 1;
}
if (j == (n-1))
{
printf("j = n-1");
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
if (T[i+1][j-1] != -3)
T[i+1][j-1] = T[i+1][j-1] + 1;
}
if (j != 0 && j!= (n-1))
{
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
if (T[i+1][j+1] != -3)
T[i+1][j+1] = T[i+1][j+1] + 1;
if (T[i+1][j-1] != -3)
T[i+1][j-1] = T[i+1][j-1] + 1;
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
}
}
if (i == (m-1))
{
if (j == 0)
{
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j+1] != -3)
T[i-1][j+1] = T[i-1][j+1] + 1;
}
if (j == (n-1))
{
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j-1] != -3)
T[i-1][j-1] = T[i-1][j-1] + 1;
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
}

if (j != 0 && j!= (n-1))
{
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j+1] != -3)
T[i-1][j+1] = T[i-1][j+1] + 1;
if (T[i-1][j-1] != -3)
T[i-1][j-1] = T[i-1][j-1] + 1;
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
}
}
if (j == 0 && i != 0 && i!= (m-1))
{
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j+1] != -3)
T[i-1][j+1] = T[i-1][j+1] + 1;
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i+1][j+1] != -3)
T[i+1][j+1] = T[i+1][j+1] + 1;
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
}
if (j == (n-1) && i != 0 && i!= (m-1))
{
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j-1] != -3)
T[i-1][j-1] = T[i-1][j-1] + 1;
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
if (T[i+1][j-1] != -3)
T[i+1][j-1] = T[i+1][j-1] + 1;
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
}
if ((i != 0) && (i != (m-1)) && (j != 0) && (j != (n-1)))
{
if (T[i-1][j] != -3)
T[i-1][j] = T[i-1][j] + 1;
if (T[i-1][j-1] != -3)
T[i-1][j-1] = T[i-1][j-1] + 1;
if (T[i][j-1] != -3)
T[i][j-1] = T[i][j-1] + 1;
if (T[i+1][j-1] != -3)
T[i+1][j-1] = T[i+1][j-1] + 1;
if (T[i+1][j] != -3)
T[i+1][j] = T[i+1][j] + 1;
if (T[i+1][j+1] != -3)
T[i+1][j+1] = T[i+1][j+1] + 1;
if (T[i][j+1] != -3)
T[i][j+1] = T[i][j+1] + 1;
if (T[i-1][j+1] != -3)
T[i-1][j+1] = T[i-1][j+1] + 1;
}

最佳答案

您的方法可能可以修复,但它已经产生了太多代码行。

首先,包含地雷和邻接计数的数据结构有点人为设计。它确实表示可见板,但它在 int 数据类型中插入了两种不同的信息。

其次,列出相邻点不如使用循环自动查找它们优雅。边缘会出现特殊情况(文字边缘情况!),但您可以通过用零填充它们来避免这种情况。

例如,

// Parameter "mines" is the minefield, plus a ring of zero values around the edge.
// Parameter "adjacence" must be pre-filled with zeroes. It has no such padding.
void mine_counting (const bool mines[MMAX+2][NMAX+2], int adjacence[MMAX][NMAX],
int m, int n) {
for ( int di = -1; di <= 1; ++ di ) {
for ( int dj = -1; dj <= 1; ++ dj ) {
for ( int i = 0; i != m; ++ i ) {
for ( int j = 0; j != n; ++ j ) {
adjacence[i][j] += mines[i + di + 1][j + dj + 1];
}
}
}
}
}

如果你想让两个数组的坐标系完全匹配,你可以在 adjacence 中添加相同的填充——这不会有什么坏处。然后最内层循环中的 +1 将消失。

关于c - C中的"Minesweeper",计算周围地雷在板中某个位置附近的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com