C++ 扫雷舰程序,意外输出

C++ 扫雷舰程序,意外输出,c++,minesweeper,C++,Minesweeper,我在做一个史蒂文·斯基纳的问题扫雷游戏。你必须输出广场附近的地雷数量 #include<iostream> using namespace std; int main() { int n,m; cin>>m>>n; char a[m][n]; for(int i=0;i<m;i++) { for (int j = 0; j < n; j++) { cin>>a[i][j]; } } for (i

我在做一个史蒂文·斯基纳的问题扫雷游戏。你必须输出广场附近的地雷数量

#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
char a[m][n];
for(int i=0;i<m;i++)
{
    for (int j = 0; j < n; j++)
    {
        cin>>a[i][j];
    }
}

for (int i = 0; i < m; i++)
{
    for (int j = 0; j < n; j++)
    {
        if(a[i][j]!='*')
        {
            int no=0;
            if(a[i-1][j-1]=='*')
            no++;
            else if(a[i][j-1]=='*')
            no++;
            else if(a[i+1][j-1]=='*')
            no++;
            else if(a[i+1][j]=='*')
            no++;
            else if(a[i+1][j+1]=='*')
            no++;
            else if(a[i][j+1]=='*')
            no++;
            else if(a[i-1][j+1]=='*')
            no++;
            else if(a[i-1][j]=='*')
            no++;
            a[i][j]=(char)no;
        }
    }

}


for(int i=0;i<m;i++)
{
    for (int j=0; j<n; j++)
    {
        cout<<a[i][j];
    }
    cout<<endl;
}


return 0;
}
当我尝试运行此程序时,未放置地雷的阵列为空。这与整数到字符的转换有关吗?

一个错误是:

a[i][j]=charno

这不是将一位整数转换为字符表示的方式

正确的方法是将“0”添加到整数:

a[i][j]=no+'0'

之所以这样做,是因为数字的字符表示形式与实际数字值不同。例如,ASCII排序序列使用48作为字符“0”,49表示“1”,50表示“2”,等等

因此,添加“0”,即48,将给出数字的字符表示形式。

一个错误是:

a[i][j]=charno

这不是将一位整数转换为字符表示的方式

正确的方法是将“0”添加到整数:

a[i][j]=no+'0'

之所以这样做,是因为数字的字符表示形式与实际数字值不同。例如,ASCII排序序列使用48作为字符“0”,49表示“1”,50表示“2”,等等


因此,添加“0”,即48,将为您提供数字的字符表示。

您可以更改程序,例如:

我把你的阵法改成了整数阵法,所有地雷都是-1。因此,不必在一个数组中混合int值和char值。有了它,您必须在带有if条件的输出中处理它

#include<iostream>
using namespace std;

int main()
{
    int n,m;
    cin>>m>>n;
    char a[m][n];

    for(int i=0;i<m;i++)
    {
        for (int j = 0; j < n; j++)
        {
            char in;
            cin>>in;
            if(in == '*') {
                a[i][j] = -1;
            } else {
                a[i][j] = 0;
            }
        }
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if(a[i][j]!=-1)
            {
                int no=0;
                if(a[i-1][j-1]==-1)
                no++;
                else if(a[i][j-1]==-1)
                no++;
                else if(a[i+1][j-1]==-1)
                no++;
                else if(a[i+1][j]==-1)
                no++;
                else if(a[i+1][j+1]==-1)
                no++;
                else if(a[i][j+1]==-1)
                no++;
                else if(a[i-1][j+1]==-1)
                no++;
                else if(a[i-1][j]==-1)
                no++;
                a[i][j]=no;
            }
        }

    }


    for(int i=0;i<m;i++)
    {
        for (int j=0; j<n; j++)
        {
            if(a[i][j] == -1) {
                cout<<" * ";
            } else {
                cout<<" "<<a[i][j]<<" ";
            }
        }
        cout<<endl;
    }

    return 0;
}

您可以更改您的程序,例如:

我把你的阵法改成了整数阵法,所有地雷都是-1。因此,不必在一个数组中混合int值和char值。有了它,您必须在带有if条件的输出中处理它

#include<iostream>
using namespace std;

int main()
{
    int n,m;
    cin>>m>>n;
    char a[m][n];

    for(int i=0;i<m;i++)
    {
        for (int j = 0; j < n; j++)
        {
            char in;
            cin>>in;
            if(in == '*') {
                a[i][j] = -1;
            } else {
                a[i][j] = 0;
            }
        }
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if(a[i][j]!=-1)
            {
                int no=0;
                if(a[i-1][j-1]==-1)
                no++;
                else if(a[i][j-1]==-1)
                no++;
                else if(a[i+1][j-1]==-1)
                no++;
                else if(a[i+1][j]==-1)
                no++;
                else if(a[i+1][j+1]==-1)
                no++;
                else if(a[i][j+1]==-1)
                no++;
                else if(a[i-1][j+1]==-1)
                no++;
                else if(a[i-1][j]==-1)
                no++;
                a[i][j]=no;
            }
        }

    }


    for(int i=0;i<m;i++)
    {
        for (int j=0; j<n; j++)
        {
            if(a[i][j] == -1) {
                cout<<" * ";
            } else {
                cout<<" "<<a[i][j]<<" ";
            }
        }
        cout<<endl;
    }

    return 0;
}

既然人们似乎在给男人鱼,我看不出有什么理由不给。从计算上改变no的起始行,得到一个好的解决方案

    char no='0';

既然人们似乎在给男人鱼,我看不出有什么理由不给。从计算上改变no的起始行,得到一个好的解决方案

    char no='0';

我在这里看到了一些单独的问题,它们共同导致了您遇到的问题

首先,正如上面所指出的,一旦你计算了与每个地雷相邻的地雷的数量,你当前存储结果的方式就不会像你期望的那样打印出来。这里的其他答案建议了几种不同的方法

其次,你计算相邻地雷的方法有点不正确。让我们看看这段代码:

if(a[i-1][j-1]==-1)
   no++;
else if(a[i][j-1]==-1)
   no++;
else if(a[i+1][j-1]==-1)
   no++;
else if(a[i+1][j]==-1)
   no++;
else if(a[i+1][j+1]==-1)
   no++;
else if(a[i][j+1]==-1)
   no++;
else if(a[i-1][j+1]==-1)
   no++;
else if(a[i-1][j]==-1)
   no++;
这里使用的if/else if/else if/…模式。。。意味着最多将执行其中一个分支。也就是说,一旦该代码找到地雷,它就会停止在单元格周围的其他位置寻找其他地雷。解决此问题的一种方法是使其不是一个if/else if链,而是一个常规的if链:

你甚至可能想考虑如何改变这个结构,这样,你就可以使用一个双嵌套的for循环来枚举离你一步之遥的所有位置,而不是拥有一个长的if语句列表。这将压缩代码,使其更清楚地匹配每个相邻位置的模式,如果是地雷,则将其计算为地雷


希望这有帮助

我在这里看到了几个单独的问题,它们共同导致了您遇到的问题

首先,正如上面所指出的,一旦你计算了与每个地雷相邻的地雷的数量,你当前存储结果的方式就不会像你期望的那样打印出来。这里的其他答案建议了几种不同的方法

其次,你计算相邻地雷的方法有点不正确。让我们看看这段代码:

if(a[i-1][j-1]==-1)
   no++;
else if(a[i][j-1]==-1)
   no++;
else if(a[i+1][j-1]==-1)
   no++;
else if(a[i+1][j]==-1)
   no++;
else if(a[i+1][j+1]==-1)
   no++;
else if(a[i][j+1]==-1)
   no++;
else if(a[i-1][j+1]==-1)
   no++;
else if(a[i-1][j]==-1)
   no++;
这里使用的if/else if/else if/…模式。。。意味着最多将执行其中一个分支。也就是说,一旦该代码找到地雷,它就会停止在单元格周围的其他位置寻找其他地雷。解决此问题的一种方法是使其不是一个if/else if链,而是一个常规的if链:

你甚至可能想考虑如何改变这个结构,这样,你就可以使用一个双嵌套的for循环来枚举离你一步之遥的所有位置,而不是拥有一个长的if语句列表。这将压缩代码,使其更清楚地匹配每个相邻位置的模式,如果是地雷,则将其计算为地雷


希望这有帮助

请不要描述输出,而是将其放在您作为文本提供的后扫描中—确切的实际输出和确切的预期输出?包括您输入到程序的输入。更好的是,考虑用硬编码的值替换输入操作,以便那些试图帮助你的人不必再做必要的工作。
][j] =charno;-这不是将一位数int转换为等效字符表示的方式。这也是为什么从竞争性编程站点学习C++是浪费时间的原因。这是一个非常好的字符表示,而不是一个小数的阿拉伯数字。提示:查看字符串、字符二进制表示,为什么是“0”!=0,或者简单地尝试添加“0”的魔力。请注意,可变长度数组字符a[m][n];不是有效的C++。有些编译器允许它们,因为它们是C99的一部分,但并非所有编译器都允许。请不要描述输出,而是将其放在您作为文本提供的后扫描中—确切的实际输出和确切的预期输出?包括您输入到程序的输入。更好的是,考虑用硬编码的值替换输入操作,以便那些试图帮助你的人不必再做必要的工作。[i] [j]=CARNO;这不是将一位数int转换为等效字符表示的方式。这也是为什么从竞争性编程站点学习C++是浪费时间的原因。这是一个非常好的字符表示,而不是一个小数的阿拉伯数字。提示:查看字符串、字符二进制表示,为什么是“0”!=0,或者简单地尝试添加“0”的魔力。请注意,可变长度数组字符a[m][n];不是有效的C++。有些编译器允许它们,因为它们是C99的一部分,但并非所有编译器都允许。它成功了,我放置了elseif而不是使用if语句,谢谢。有一件事,如果不使用这些多个if语句,我如何比较矩阵的所有这些相邻元素?尝试使用双for循环枚举每对dx,dy,其中dx是-1、0或+1中的一个,dy是-1、0或+1中的一个。然后,您可以列出所有这些增量,跳过增量0,0。谢谢,我将尝试以这种方式实现。它成功了,我放置了else if而不是使用if语句,谢谢。有一件事,如果不使用这些多个if语句,我如何比较矩阵的所有这些相邻元素?尝试使用双for循环枚举每对dx,dy,其中dx是-1、0或+1中的一个,dy是-1、0或+1中的一个。然后,您可以列出所有这些增量,跳过增量0,0。谢谢,我将尝试以这种方式实现。