我写的战舰计划应该循环无限次,直到满足条件。然而,它在第一次执行后停止。我的循环有什么问题?代码运行,但最终它输出游戏超过两次,当它不应该。游戏中还剩下更多船只。
#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;
}
}
}
}
答案 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
进行比较。这是一件很疯狂的事情,也没用,因为结果价值不适用于任何事情。只需删除该行。