C ++ игнорирует условие цикла - PullRequest
0 голосов
/ 12 марта 2019

Недавно я создал текстовую RPG в C ++ и сейчас пытаюсь включить простой алгоритм поиска пути.Я проверил сам алгоритм и обнаружил, что он работает, однако условие цикла while в функции стало игнорироваться, когда я попытался включить его в RPG.Вот мой код:

    int Strategy::path(char (&map)[25][100], int current_y, int current_x, int Target_x, int Target_y)
{
    int i;
    int n;
    bool up=false;
    bool down=false;
    bool left=false;
    bool right=false;
    while (map[Target_y-1][Target_x]!='_'&&map[Target_y-1][Target_x]!='-'&&map[Target_y-1][Target_x]!='='&&map[Target_y+1][Target_x]!='_'&&map[Target_y+1][Target_x]!='-'&&map[Target_y+1][Target_x]!='='&&map[Target_y][Target_x-1]!='_'&&map[Target_y][Target_x-1]!='-'&&map[Target_y][Target_x-1]!='='&&map[Target_y][Target_x+1]!='_'&&map[Target_y][Target_x+1]!='-'&&map[Target_y][Target_x+1]!='=')
    {
        bool f=false;
        int m=0;
        system("cls");
        printf("Time left: %i\n", time);
        int x;
        int y;
        using namespace std;
        for (y = 0; y<25; y++)
        {
            for (x = 0; x<100; x++)
            {
                cout << map[y][x];
            }
            printf("\n");
        }
        if (current_y > 0 && map[current_y - 1][current_x] ==' ')
        {
            map[current_y - 1][current_x] = '-';
        }
        if (current_y < 25 && map[current_y + 1][current_x] ==' ')
        {
            map[current_y + 1][current_x] = '-';
        }
        if (current_x > 0 && map[current_y][current_x - 1] ==' ')
        {
            map[current_y][current_x - 1] = '-';
        }
        if (current_x<100 && map[current_y][current_x + 1] ==' ')
        {
            map[current_y][current_x + 1] = '-';
        }
        map[current_y][current_x] = '=';
        for (i = 0; i < 25; i++)
        {
            for (n = 0; n < 100; n++)
            {
                if (map[i][n] == '_')
                {
                    current_y = i;
                    current_x = n;
                    f=true;
                    break;
                }
            }
            if (f==true)
            {
                break;
            }
        }
        for (i = 0; i < 25; i++)
        {
            for (n = 0; n < 100; n++)
            {
                if (map[i][n] == '-')
                {
                    map[i][n] = '_';
                    m++;
                }
            }
        }
        if (m==0)
        {
            return 4;
        }
    }
    bool r=false;
    while (true)
    {
        int d=rand()%4;
        if (map[Target_y + 1][Target_x] == '_' && d==0)
        {
            for (i = 0; i < 25; i++)
            {
                for (n = 0; n < 100; n++)
                {
                    if (map[i][n] == '-'||map[i][n]=='_'||map[i][n]=='=')
                    {
                        map[i][n] = ' ';
                    }
                }
            }
            return 0;
        }
        else if (map[Target_y - 1][Target_x] == '_' && d==1)
        {
            for (i = 0; i < 25; i++)
            {
                for (n = 0; n < 100; n++)
                {
                    if (map[i][n] == '-'||map[i][n]=='_'||map[i][n]=='=')
                    {
                        map[i][n] = ' ';
                    }
                }
            }
            return 1;
        }
        else if (map[Target_y][Target_x+1] == '_' && d==2)
        {
            for (i = 0; i < 25; i++)
            {
                for (n = 0; n < 100; n++)
                {
                    if (map[i][n] == '-'||map[i][n]=='_'||map[i][n]=='=')
                    {
                        map[i][n] = ' ';
                    }
                }
            }
            return 2;
        }

        else if (map[Target_y][Target_x-1] == '_' && d==3)
        {
            for (i = 0; i < 25; i++)
            {
                for (n = 0; n < 100; n++)
                {
                    if (map[i][n] == '-'||map[i][n]=='_'||map[i][n]=='=')
                    {
                        map[i][n] = ' ';
                    }
                }
            }
            return 3;
        }
    }
}

1 Ответ

0 голосов
/ 12 марта 2019

Как и все другие комментарии, вы определенно должны использовать функцию в вашем состоянии while. Это действительно нечитаемое выражение.

Может быть, это вам поможет:

bool conditionValid(char (&map)[25][100], int target_x, int target_y)
{
  char c='0';
  for(int i = 0; i<4; ++i)
  {
    switch(i)
    {
      case 0: c = map[target_y-1][target_x]; break; //check the first character
      case 1: c = map[target_y+1][target_x]; break; //check the second character
      case 2: c = map[target_y][target_x-1]; break; //check the third character
      case 3: c = map[target_y][target_x+1]; break; //check the forth character
    }

    switch(c)
    {
      case '_': std::cout << "aborting ... c" << i << "= " << c << std::endl; return false;
      case '-': std::cout << "aborting ... c" << i << "= " << c << std::endl; return false;
      case '=': std::cout << "aborting ... c" << i << "= " << c << std::endl; return false;
    }
  }
  return true;
}

int Strategy::path(char (&map)[25][100], int current_y, int current_x, int Target_x, int Target_y)
{
    int i;
    int n;
    bool up=false;
    bool down=false;
    bool left=false;
    bool right=false;
    while (conditionValid(map, Target_x, Target_y))
    {
        ...
    }
}

Как только вы поймете, почему ваш цикл прерван, вы можете удалить std::cout s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...