2015-07-23 2 views
0

Итак, я пытаюсь написать программу, которая решает проблему «Dungeon Crawl» здесь: http://www.cplusplus.com/forum/articles/12974/. Если вы слишком ленивы, чтобы прочитать ссылку (что вполне понятно), основная предпосылка игры состоит в том, что игрок перемещается по сетке 10x10 и пытается достичь сокровища, избегая ловушек и движущихся врагов. Поскольку все раскрывается игроку, это не очень большая игра, но я думал, что это будет хорошая практика кодирования. К сожалению, я ржав на пользовательском входе и никогда не научился совмещать всю программу, а это значит, что у меня серьезные проблемы с правильными функциями.Функции, которые не выполняются должным образом

Основная функция заключается в следующем:

int main() 
{ 
    int turn=0,enemyCount=0; 
    bool end=false; 
    srand (time(NULL)); 
    node* world; 
    world = new node[100]; 
    generateWorld(world); 
    drawWorld(world); 
    do { 
     playerMove(world); 
     enemiesMoves(world,enemyCount); 
     drawWorld(world); 
     end = endCheck(world); 
     turn++; 
    } while (end == false); 
    return 0; 
} 

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

Это playerMove() функция:

void playerMove(node* array){ 
    int i,playerLocation,oldLocation; 
    bool valid=false; 
    char move; 
    for (i=0;i<100;i++){ 
     if (array[i].player == true){ 
      playerLocation = i; 
      oldLocation = playerLocation; 
     } 
    } 
    while(!valid){ 
      if (cin >> move){ 
        if (move=='w' || move=='s' || move=='a' || move=='d') 
          valid = true; 
      } 
      if (move=='w'){ 
        playerLocation = oldLocation-10; 
        if (playerLocation < 0){ 
          cout << "You can't swim." << endl; 
          valid = false; 
        } 
      } 
      else if (move=='s'){ 
        playerLocation = oldLocation+10; 
        if (playerLocation > 99){ 
          cout << "You can't swim." << endl; 
          valid = false; 
        } 
      } 
      else if (move=='a'){ 
        playerLocation = oldLocation-1; 
        if (playerLocation % 10 == 9){ 
          cout << "You can't swim." << endl; 
          valid = false; 
        } 
      } 
      else if (move=='d'){ 
        playerLocation = oldLocation+1; 
        if (playerLocation % 10 == 0){ 
          cout << "You can't swim." << endl; 
          valid = false; 
        } 
      } 
    } 
    array[oldLocation].player = false; 
    array[playerLocation].player = true; 
} 

Он должен собрать вход игрок, ничего не делать, если игрок входит ключ, который не WASD (они могут двигаться только в четырех основных направлениях), отклонить вход, если игрок пытается покинуть край мира и обновить позицию игрока. Он успешно выполняет последнее, но он не поймает недопустимый ввод, и если переход не удался, он отказывается отображать сообщение, которое оно должно использовать.

Это enemiesMoves функция:

void enemiesMoves(node* array,int enemyCount){ 
    int i,j=0,n,enemyLocations[enemyCount],oldLocations[enemyCount]; 
    bool valid = false; 
    for (i=0;j<enemyCount;i++){ 
     if (array[i].enemy==true){ 
      enemyLocations[j] = i; 
      cout << enemyLocations[j] << endl; 
      j++; 
     } 
    } 
    for (j=0;j<enemyCount;j++){ 
     oldLocations[j] = enemyLocations[j]; 
    } 
    for (j=0;j<enemyCount;j++){ 
     while (!valid){ 
      n = rand() % 4 + 1; 
      if (n = 1){ 
       enemyLocations[j] = oldLocations[j]-10; 
       if (enemyLocations[j] < 0) 
        valid = false; 
         } 
         else if (n = 2){ 
       enemyLocations[j] = oldLocations[j]+10; 
       if (enemyLocations[j] > 100) 
        valid = false; 
         } 
         else if (n = 3){ 
       enemyLocations[j] = oldLocations[j]-1; 
       if (enemyLocations[j] % 10 == 9) 
        valid = false; 
         } 
         else if (n = 1){ 
       enemyLocations[j] = oldLocations[j]+1; 
       if (enemyLocations[j] % 10 == 0) 
        valid = false; 
         } 
       } 
       array[enemyLocations[j]].enemy = true; 
       array[oldLocations[j]].enemy = false; 
     }    
} 

Предполагается переместить врагов в случайном направлении, но отвергают движение, если противник движется от мира. Хотя я думал, что правильно переписал код playerMove(), он отказывается обновлять положение врагов; они остаются в том же месте, что и после поворота.

Это drawWorld() функция:

void drawWorld(node* array){ 
    int i; 
    for (i=0;i<100;i++){ 
     if (array[i].player==true) 
      cout << "P"; 
     else if (array[i].trap==true) 
      cout << "T"; 
     else if (array[i].enemy==true) 
      cout << "E"; 
     else if (array[i].treasure==true) 
      cout << "X"; 
     else if (array[i].player==true && array [i].treasure==true) 
      cout << "W"; 
     else if ((array[i].player==true && array[i].trap==true) || (array[i].player==true && array[i].enemy==true)) 
      cout << "L"; 
     else { 
      cout << "O"; 
     } 
     if ((i+1 % 10) == 0){ 
      cout << endl; 
     } 
    } 
    cout << endl << endl; 
} 

Он рисует мировой штраф, за исключением того, что он не будет переносить текст каждые десять символов, как это ясно сказано сделать. Я не могу понять, что мне здесь не хватает.

Наконец, это endCheck() функция:

bool endCheck(node* array){ 
    int i; 
    for (i=0;i<100;i++){ 
     if (array[i].player==true && array[i].treasure==true){ 
      cout << "You found the treasure and now enjoy a life of unmitigated opulence." << endl; 
      return true; 
     } 
     else if (array[i].player==true && array[i].trap==true){ 
      cout << "You fell into a conspicuous trap and became tiger food." << endl; 
      return true; 
     } 
     else if (array[i].player==true && array[i].enemy==true){ 
      cout << "You were captured alive by angry natives and enjoyed as part of their New Year's feast." << endl; 
      return true; 
     } 
     else 


      return false; 
    } 
} 

Это просто не выполняется вообще. Я могу переместить игрока в ловушку, и ничего не происходит.

Эти проблемы невероятно расстраивают, потому что я просто не могу понять, что не так с кодом. Я знаю, что сообщение длинное, но если кто-нибудь может указать, что не так, то это будет очень признательно. Также следует отметить, что я искал ответы, прежде чем публиковать это, но поскольку я считаю, что проблемы являются неотъемлемой частью моего кода, я не смог найти никаких полезных ответов.

+3

Какие функции вы говорите? – ameyCU

+0

TL; DR. Постройте пример *** MINIMAL ***. –

+0

Я не совсем уверен, как я мог бы построить что-нибудь более минимальное, чем это. Весь код, который я опубликовал, имеет значение. –

ответ

2

Вы возвращаетесь в конце первой итерации. Таким образом, он будет проверять только первое поле и затем возвращать false (если в первом поле не было игрока и сокровища/ловушки/врага).

Измените функцию, чтобы выглядеть следующим образом:

bool endCheck(node* array){ 
int i; 
for (i=0;i<100;i++){ 
    if (array[i].player==true && array[i].treasure==true){ 
     cout << "You found the treasure and now enjoy a life of unmitigated opulence." << endl; 
     return true; 
    } 
    else if (array[i].player==true && array[i].trap==true){ 
     cout << "You fell into a conspicuous trap and became tiger food." << endl; 
     return true; 
    } 
    else if (array[i].player==true && array[i].enemy==true){ 
     cout << "You were captured alive by angry natives and enjoyed as part of their New Year's feast." << endl; 
     return true; 
    } 
} 
return false; 
} 

Вы должны проверить все возможные поля, прежде чем вернуться ложным, что указывает на отсутствие столкновения.

+0

Я смущен. Я этого не понимал. Спасибо; эта функция работает правильно. –

2

В enemiesMoves(), вы проверяете if(n = 1), я уверен, что вы имели в виду if(n == 1).

ли это:

.... 
n = rand() % 4 + 1; 
if (n == 1){ 
..... 

Кроме того, n == 1 случай проверяется дважды! Один раз в if, а затем в последних else if.

Для функции rand() на самом деле генерации случайных чисел при каждом запуске, инициализировать случайное зерно первого использования srand() следующим образом:

/* initialize random seed: */ 
    srand (time(NULL)); 

n = rand() % 4 + 1; 
+0

Я исправил их, но он все еще не работает должным образом, так как теперь он застревает в цикле генерации случайных чисел. Есть ли что-нибудь еще там, вы можете заметить, что это мешает ему делать то, что я хочу? –

+0

Для генерации случайного числа каждый раз вам нужно сначала инициализировать случайное семя. Я не вижу, что это происходит в вашем коде! Проверьте обновленный ответ. – CinCout

+0

Недостаточно ли инициализировать случайное семя один раз в 'main()'? –