

このプログラムを実行すると、decide_direction()内のｘとｙが意図したとおりに変化しません。教えてもらえませんか？  
このコードを実行したときに出力されるｙの値を2, 4, 6, 8 ... としたいのですが、2, 2, 2, 2, ... と値が変わらないです。

[code]

    #include <iostream>
    #include <ctime>
    /*
     *棒倒し法
     */
    
    class maze {
      int wall_info[77][77] = {{0}};
      int x, y;
    public:
      maze();
      void make_wall();
      int decide_direction();
      int wall_check();
      void show();
    };
    
    maze::maze()
    {
      //make wall
      for (y = 0; y <= 76; y++) {
        for (x = 0; x <= 76; x++) {
          if (y == 0 || x == 0 || y == 76 || x == 76) {
            wall_info[y][x] = 1;
          }if (y % 2 == 0 && x % 2 == 0) {
            wall_info[y][x] = 1;
          }
        }
      }
      y = 2;
      x = 2;
    }
    
    void maze::make_wall()
    {
      while (y < 76) {
        while (x < 76) {
          if (decide_direction() == 4) {
            wall_info[y - 1][x] = 1;
          }
          else if (decide_direction() == 3) {
            wall_info[y][x - 1] = 1;
          }
          else if (decide_direction() == 2) {
            wall_info[y + 1][x] = 1;
          }
          else {
            wall_info[y][x + 1] = 1;
          }
          x += 2;
        }
        y += 2;
        // std::cout << y << std::endl;
      }
    }
    
    int maze::decide_direction()
    {
      int direction = 0;
      int check;
    
      std::cout << y << std::endl;
    
      if (y <=  2) {
        check = wall_check();
        if (wall_check() == -1) {
          direction = rand() % 3 + 1;
        }
        else {
          direction = rand() % 4 + 1;
        }
      }
      else {
        if (wall_check() == -1) {
          direction = rand() % 2 + 1;
        }
        else {
          direction = rand() % 3 + 1;
        }
      }
    
      return direction;
    }
    
    int maze::wall_check()
    {
      if (wall_info[y][x - 1] == 1) {
        return -1;
      }
      else {
        return 0;
      }
    }
    
    void maze::show()
    {
      for (int i = 0; i <= 76; i++) {
        for (int j = 0; j <= 76; j++) {
          if (wall_info[i][j] == 1) {
            std::cout << "■ ";
          }
          else {
            std::cout << "□ ";
          }
        }
        std::cout << std::endl;
      }
    }
    
    int main()
    {
      srand((unsigned)time(NULL));
      maze maze;
    
      maze.make_wall();
      maze.show();
    
      return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-12-31T13:44:53.557
51636
2019-01-01T06:52:52.790
2019-01-01T05:54:07.817
31631
31631
question
c++
privateの変数、ｘとｙが意図したとおりに変化できない

[code]

    void maze::make_wall()
    {
      while (y < 76) {
        while (x < 76) {
          // 省略
          x += 2;
        }
        y += 2;
        // std::cout << y << std::endl;
      }
    }
    
[/code]

このメソッドでは、二重ループで、まずxから計算しています。内側のループでxを計算している間、yの値は変わらないので、期待される出力は`2,2,2...4,4,4,...6,6,6...`です。しかし、実際には`2,2,2,...`になると思います。これは、最初の`y==2`の時に内側のルーフが終わった後、xを再初期化していないため、`y==4`以降、`x==76`のままで内側のループが実行されないためです。内側のループの直前でxを再初期化すればうまくいくはずです。

[code]

    void maze::make_wall()
    {
      while (y < 76) {
        x = 2; // ここを追加
        while (x < 76) {
    
[/code]

* * *

ちなみに、ループの中で方向を決める部分ですが、

[code]

      if (decide_direction() == 4) {
        wall_info[y - 1][x] = 1;
      }
      else if (decide_direction() == 3) {
        wall_info[y][x - 1] = 1;
      }
      else if (decide_direction() == 2) {
        wall_info[y + 1][x] = 1;
      }
      else {
        wall_info[y][x + 1] = 1;
      }
    
[/code]

一番最後の`else`の部分が実行される確率が、かなり高いと思います。`decide_direction()`を何度も呼び出していますが、返ってくる値はそのたびに違うからです。例えば、最初の`if`で`decide_direction()`が3を返すと、次の`else
if`が実行され、そこで2が返ってくると、更にその次の`else
if`が実行され、そこで4が返ってくると、1は一度も返ってきていないのに、1が返ってきた場合に当たる、最後の`else`が実行されてしまいます。ここは`switch`を使うのが良いでしょう。

[code]

    switch (decide_direction()) {
    case 4:
        wall_info[y - 1][x] = 1;
        break;
    case 3:
        wall_info[y][x - 1] = 1;
        break;
    case 2:
        wall_info[y + 1][x] = 1;
        break;
    default:
        wall_info[y][x + 1] = 1;
        break;
    }
    
[/code]


CC BY-SA 4.0
2019-01-01T06:52:52.790
51648
2019-01-01T06:52:52.790
3605
51636
answer