2013-11-16 2 views
0

Я пытаюсь получить след, который появится за игровым байком, но по какой-то причине вместо «x», появляющегося за игроком каждый раз, когда он движется, игрок фактически дублирует себя. Это звучит немного запутанно, но вы должны сами составить этот код и посмотреть, что я имею в виду. То, что я пытаюсь сделать, - это просто получить «x» за игроком, а не оставлять след «P». спасибоC++ tron ​​2d array repeating

#include <iostream> 
    #include "windows.h" 
    #include <conio.h> 
    #include <ctime> 
    using namespace std; 

    //prototype functions used 
    void DisplayMap(); 
    void PlayerBike(); 
    void setCursorTo(); 
    void SetBike(); 
    //global variables that will be used by different functions 
    int PlayerX = 10; 
    int PlayerY = 70; 
    bool GameOver = false; 
    const int H = 25; // const variable so it doesnt change size 
    const int W = 82;// const variable so it doesnt change size 
    char Map[H][W]; // char map with HxW 
    char trail = 'x'; // this is where the trail is initialized as a * 
    int main() 
    { 

     SetBike(); 
     DisplayMap(); 
    while (GameOver == false){ 
     setCursorTo(); 

     PlayerBike(); 



    } // end while loop 

     return 0; 
    }//end main 



    void DisplayMap(){ // display map function 

    for(int i = 0; i < H; i++){ 
     for(int j = 0; j < W; j++){ 

      if(i == 0 || i == 24 || j == 0 || j == 81){ Map[i][j] = 'x';} // characters in row 24x81 are changed to x 
      cout << Map[i][j]; // output map 
     } // end for loop 
      cout << "\n"; // create new line to output the map correctly 

    } //end for loop 


    } // end DisplayMap function 


    void SetBike(){ 

    Map[PlayerX] [PlayerY] = 'P'; 

} 
    void PlayerBike(){ 
     Map[PlayerY][PlayerX]= trail; // I would like this trail to repeat behind the player but it does not appear at all. 
     if (kbhit()) {// get user key input 
     char GetCh = getch(); // GetCh equal to the button the user presses 
     if (GetCh == 'w'){PlayerX = PlayerX - 1; Trailx = Trailx -1;} 
     else if (GetCh == 's'){PlayerX = PlayerX +1; Trailx = Trailx +1;} 
     else if (GetCh == 'd'){PlayerY = PlayerY +1;} 
     else if (GetCh == 'a'){PlayerY = PlayerY - 1;} 
    }// end kbhit 
    }// end PlayerBike function 

    void setCursorTo() // stops constant flashing on the map 
    { 
     HANDLE handle; 
     COORD position; 
     handle = GetStdHandle(STD_OUTPUT_HANDLE); 
     position.X = 0; 
     position.Y = 0; 
     SetConsoleCursorPosition(handle, position); 
    } 

ответ

1

Ваша функция DisplayMap ошибочна.

Во-первых, это, кажется, вы не только отображения карту, вы также активно изменения его. Поместите чертеж-a-границу в отдельную функцию initMap, которая также уничтожает все остальные позиции с пространством (похоже, вы этого еще не сделали, поэтому, возможно, именно там оно и выходит не так). Вам нужно только позвонить initMap один раз.

Затем не нарисуйте плеер P в функции DisplayMap. Нарисуйте этот один раз, прежде чем войти в игровой цикл. Затем: если пользователь нажал действующий ключ перемещения,

  1. положить x на позиции игрока
  2. обновления позиция игрока
  3. поставить P на новой позиции
  4. перерисовки экрана, вызвав DisplayMap
  5. , и вы увидите, что тропа остается.

Возможные уточнения: перед тем принимать команду «перемещение» путем корректировки положения, проверьте, если карта содержит пробел или что-то другое. Если он содержит пробел, вы можете выполнить ход; если нет, воспроизведите анимацию взрыва (*oO*+.). Кроме того, рассмотрите поиск инструкции switch в вашей любимой ссылке на C, чтобы избежать бесконечных длинных последовательностей if..else.

+0

Благодарим вас за ввод, я установил карту, велосипед игрока «SetBike()» вне цикла, так что теперь они не повторяются многократно в цикле. Как только я устанавливаю плеер и нахожу карту снаружи, у меня нет возможности переместить персонаж игрока с помощью функции PlayerBike() и как я могу постоянно обновлять карту? doesnt setCursorTo(); функция делает это уже? – ssj3goku878

+0

Ваш 'setCursorTo' определенно делает * не * делает это. Посмотрите на свой собственный код ... Похоже, вы внесли мои предложения только частично - особенно в пункты с 1 по 5. Я вижу, что вы переместили «DisplayMap» из цикла; извините, это должно быть * в * - я имел в виду взятие 'P'. Попытайтесь повторить попытку? – usr2564301

+0

Есть ли способ связаться с вами по электронной почте или скайпу? Мне нужна дополнительная помощь :( – ssj3goku878