我在做循环时遇到了困难。它只执行一次

时间:2016-02-18 03:33:38

标签: c++

我写的战舰计划应该循环无限次,直到满足条件。然而,它在第一次执行后停止。我的循环有什么问题?代码运行,但最终它输出游戏超过两次,当它不应该。游戏中还剩下更多船只。

#include<iostream>
#include<fstream>
#include<string>
#include<cmath>

using namespace std;
bool FleetSunk();
void Fire(int&, int&, char&);
char ocean[25][25];

int main()
{
    int x;
    int y;      
    char spot;
    ifstream input;
    input.open("ocean.txt");

        for(x=0;x<25;x++)
        {
            for(y=0;y<25;y++)
            {
                input >> ocean[x][y];

            }
        }

 FleetSunk == false;
    do
    {
        cout << "Please input x coordinate: ";
        cin >> x;
        cout << endl << "Please input y coordinate: ";
        cin >> y;
        cout<< endl;
        Fire(x,y,spot);
        FleetSunk();

    }while(FleetSunk() == false);
}

void Fire(int& x, int&y, char&spot)
{
    spot = ocean[x][y];
    if(spot == '#')
    {
        cout << "You Have hit a ship"<< endl;
        ocean[x][y] = 'H';
    }
    else if(spot == 'H')
    {
        cout << "HIT AGAIN" << endl;
    }
    else if(spot == '-')
    {
        cout << "MISS" << endl;
    }
}

bool FleetSunk()
{
    int m;
    int n;
    for(m=0;m < 25; m++)
    {
        for(n=0;n<25;n++)
        { 

            if(ocean[m][n] == '#')
            {
                cout << "You still have ships remaining" << endl;
            }
            else
            {
                cout<< "You have hit all the ships. GAME OVER!" << endl;
                return true;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您的FleetSunk功能有两个问题。一个应该是编译器警告,一个是逻辑问题。

首先,并非函数中的所有路径都返回一个值......技术上。虽然在你的情况下由于逻辑问题不太正确。让我更具体一点:如果您的整个电路板都填充了'#',并且没有拍摄,那么函数行为是未定义的。它完成循环,然后不返回值。

现在让我们来做逻辑吧。在检查整个电路板之前,您无法知道是否有任何未命中的船舶位置。这意味着您无法以您的方式退出内循环。如果你遇到一个&#34; alive&#34;而你返回false怎么样?位置,并在函数末尾返回true(仅当您从未遇到&#34; alive&#34;位置时才会返回。)

bool FleetSunk()
{
    for( int m = 0; m < 25; m++ )
    {
        for( int n = 0; n < 25; n++ )
        { 
            if( ocean[m][n] == '#' ) return false;
        }
    }
    return true;
}

请参阅问题中的评论,了解与您在循环中调用FleetSunk的方式相关的其他建议。我还建议(在我的代码示例中很明显),您不会在正在测试某些条件的函数中将内容写入cout。调用者负责这样做,而不是函数本身。

最后,我想说你的循环上方的FleetSunk == false;行确实没有你想到的那样。这将获取函数指针,将其转换为布尔值并将其与false进行比较。这是一件很疯狂的事情,也没用,因为结果价值不适用于任何事情。只需删除该行。