7

私はブール値を返す関数を持っています:

bool restart()
{
    std::string answer;
    bool answered = false;
    while(answered == false)
    {
        cout << endl << endl << "Do you want to play again? y/n : ";
        cin >> answer;
        if(answer == "y" || answer == "Y" || answer == "1" || answer == "yes")
        {return true;}
        if(answer == "n" || answer == "N" || answer == "0" || answer == "no")
        {return false;}
    }
}

私がそれを使用して呼び出すとき:

cout << restart();

出力を取得します:

Do you want to play again? y/n : y
56

誰かがこの奇妙な問題を解決する方法を見ることができますか?前もって感謝します。

現在の私のWIPコード:

#include <iostream>
#include <cstdlib>

using namespace std;

void drawScreen(int grid[3][3]);                               //
int movef(int grid[3][3], bool playersMove);
int updateGrid(int grid[3][3], int move, bool playersMove);
bool hasWon(int grid[3][3]);
bool swapMover(bool playersMove);                              //
bool restart();
void endGame();

int main()
{
    int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    bool appRunning = true, gameRunning = true, playersMove = true;
    int move;

    // tests //
    std::cout << restart();
    // tests //

    //while(appRunning == true)
    //{
    //    while(gameRunning == true)
    //    {
    //        drawScreen(grid);
    //        move = movef(grid, playersMove);
    //        grid[3][3] = updateGrid(grid, move, playersMove);
    //        drawScreen(grid);
    //        gameRunning = hasWon(grid);
    //        playersMove = swapMover(playersMove);
    //    }
    //    appRunning = restart();
    //}
    //endGame();
    }

    void drawScreen(int grid[3][3])
    {
        for(int i = 0; i < 3; i++)
        {
             for(int j = 0; j < 3; j++)
             {
             if(grid[i][j] == 10){cout << "X  ";if(j == 2){cout << endl << endl;}}
             if(grid[i][j] == 11){cout << "O  ";if(j == 2){cout << endl << endl;}}
             if(grid[i][j] != 10 && grid[i][j] != 11){cout << grid[i][j] << "  ";
             if(j == 2){cout << endl << endl;}}
             }
        }
   }

  int movef(int grid[3][3], bool playersMove)
  {
       return 0;
  }

  int updateGrid(int grid[3][3], int move, bool playersMove)
  {
       return 0;
  }

  bool hasWon(int grid[3][3])
  {
      return false;
  }

  bool swapMover(bool playersMove)
  {
       if(playersMove == true){return false;}
       if(playersMove == false){return true;}
  }

bool restart()
{
    std::string answer;
    bool answered = false;
    while(answered == false)
    {
       cout << endl << endl << "Do you want to play again? y/n : ";
       cin >> answer;
       if(answer == "y" || answer == "Y" || answer == "1" || answer == "yes")
       {return true;}
        if(answer == "n" || answer == "N" || answer == "0" || answer == "no")
       {return false;}
    }
}

void endGame()
{

}
4

3 に答える 3

4

[OPが彼の問題を解決したと言ったので、これは私のコメントの再投稿のようなものです]

whileループの外部で定義された戻り値はありません。どういうわけかそれの外に出た場合、あなたは値を返しません(私はどのような振る舞いが期待されているのか、この場合何らかの振る舞いが期待されているのかどうかはわかりませんが)

私の答えをもう少し徹底的にするために、私はこれを見つけました: 値を返さずに非void関数の終わりから流れ出ると、コンパイラエラーが発生しないのはなぜですか?

于 2012-07-16T16:37:33.623 に答える
3

OK、推測しています。元のコードには次の行があります

grid[3][3] = updateGrid(grid, move, playersMove);

そしてあなたのグリッド定義は

int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

これは、配列の境界から書き込みを行っていることを意味します。これは未定義の動作です。これを修正して、プログラムが期待どおりに機能するかどうかを確認してください。

于 2012-07-16T16:44:52.283 に答える
1

私はmingw32コンパイラを使用しましたが、g++4.8を使用すると正常に動作します。コンパイラエラーのようです。(グリズリーに感謝)

于 2016-11-10T15:49:26.790 に答える