2015-09-29 3 views
1

Я пытаюсь отслеживать местоположение игрока с x, обозначающим их место. Когда игрок входит в строку, я соответственно увеличиваю координаты. Однако, когда игрок находится в одном пространстве от периметра, затем пытается переместиться к краю карты, игрок исчезает.Элемент массива исчезает

Пример:

..... 
...x. 
..... 
..... 
..... 

Игрок находится в 'x'

Если игрок вводит строку "право" и переместить player_loc, массив просто возвращает:

..... 
..... 
..... 
..... 
..... 

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

#include <stdio.h> 
#include <string.h> 
char map[6][6]; 
char player_loc = 'x'; 
int row; 
int col; 

void init_map() 
{ 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 5; j++) { 

     map[i][j] = '.'; 

     } 
    } 
} 

void print_map() 
{ 
     for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 5; j++) { 

       printf("%c", map[i][j]); 

      } 
     printf("\n"); 
     } 
} 

int get_player_loc() 
{ 
    for (int j = 0; j < 5; j++) { 
     for (int k = 0; k < 5; k++) { 
      if(map[j][k] == player_loc) 
      { 
       row = k; 
       col = j; 
      } 
     } 
    } 
    return row; 
    return col; 
} 

void init_player_loc() 
{ 
    int check = 1; 
    for (int g = 0; g < 5; g++) { 
     for (int h = 0; h < 5; h++) { 
      if (map[g][h] == 'x') { 
       check = 0; 
      } 

     } 
    } 
    if(check == 1) { 
     map[0][0] = player_loc; 
    } else { 
     get_player_loc(); 
    } 

} 

void move_left() 
{ 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 5; j++) { 
      if (map[i][j] == player_loc) { 
       map[i][j-1] = player_loc; 
       map[i][j] = '.'; 
      } 
     } 
    } 

} 

void move_right() 
{ 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 5; j++) { 
      if (map[i][j] == player_loc) { 
       map[i][j+1] = player_loc; 
       map[i][j] = '.'; 
      } 
     } 
    } 
} 




int main(int argc, char* argv[]) 
{ 
    char input[15]; 
    printf("You enter a room...you can go left, right, or straight. Which way do you go?\n"); 

    int done = 0; 

    init_map(); 
    map[3][3] = player_loc; 
    //init_player_loc(); 
    print_map(); 

    while (!done) { 
     scanf("%s", input); 

      if (strcmp("left", input) == 0) { 
       move_left(); 
       printf("You go left...\n"); 
       print_map(); 
       get_player_loc(); 
       printf("%d %d\n", row, col); 
       done = 1; 
      } 
      else if (strcmp("right", input) == 0) { 
       move_right(); 
       printf("You go right...\n"); 
       print_map(); 
       get_player_loc(); 
       printf("%d %d\n", row, col); 
       done = 1; 
      } 
      else if (strcmp("straight", input) == 0) { 
       printf("You go straight..."); 
       done = 1; 
      } 
      else { 
       printf("Sorry, can't do that.\n"); 
      } 
     } 
} 
+0

где вы увеличиваете индексы? – zubergu

+0

Извините, не понял, что я вставил старый файл. Исправлено. В операторах if я печатаю координаты в попытке отладить это. На самом деле это не часть «игры». – Jiskadar

+1

В 'get_player_loc()' вы не можете использовать 'return row; return col; } 'для возврата строки и столбца; он возвращает одно значение, и это оператор 'row' -' return col ;' недопустим, и компилятор должен предупредить об этом. Однако, если вы устанавливаете глобальные переменные, вам не нужно возвращать ни одно значение; 'get_player_loc()' должен быть 'void get_player_loc (void)' без возврата в конце. Или вы можете вернуться из «if» и получить ошибку, если дойдете до конца; что бы показать проблему (без игрока). –

ответ

1

Проблема заключается в том, что ваша move_right функция поднимает игрока и перемещает их полностью от карты. Допустим, ваш игрок находится в [0, 2] и пройдите через код.

for (int j = 0; j < 5; j++) { 
    if (map[i][j] == player_loc) { 
     map[i][j+1] = player_loc; 
     map[i][j] = '.'; 
    } 
} 
  • [0, 0] Нет игрока здесь, двигаться по
  • [0, 1] Нет игрока здесь, двигаться по
  • [0, 2] Нашли игрока! Переместить их прямо на [0, 3]
  • [0, 3] Найден игрока! Переместите их прямо на [0, 4]
  • [0, 4] Найден игрока!Переместить их прямо на [0, 5]

В 5 петля заканчивается. Из-за добавленного буфера ваш массив равен 6x6, поэтому игрок спрятан в крыльях, не разбивая программу. Есть несколько вещей, которые вы должны сделать:

  • После того, как вы нашли и переместили игрок, break или return таким образом они будут двигаться только один раз.
  • Сделайте свой массив 5x5 (или распечатайте все 6x6), чтобы вы могли видеть все.
  • Проверьте некоторые границы, чтобы игроку не разрешалось перемещаться с j = 5.
  • Остерегайтесь этой же ошибки в move_up, где это произойдет, когда вы увеличиваете i.
+0

Я предполагаю, что меня действительно смущало то, что левая функция работала, но права не было. Теперь это имеет смысл. Я разбираю «вперед» через массив, поэтому, как только я переместил игрока влево, функция переходит через плеер. При правильном перемещении игрок все еще находится в «пути» цикла for. Разум дует. Я добавил перерыв в функции move_right, и теперь он работает отлично. Большое спасибо за Вашу помощь! @ Kristján – Jiskadar

+1

Рад помочь! Это обычная проблема, которую нужно отслеживать, когда вы изменяете список, в то же время, когда вы повторяете его. Удачи! –

0

Ваши петли позволяют проверить позицию дважды, один раз в I, J, и снова я, (к + 1) (или какой-то другой вариант). Вероятно, это не то, что вы намереваетесь. После того, как вы найдете игрока, вы должны сделать обновления, а затем выйти из циклов.

Кроме того, код, который позволяет индексировать, прошел теоретические оценки границ массива. И не то, что нужно. Вы можете рассмотреть проверку границ. Я не знаю, что должно произойти, когда игрок движется вправо, а справа - стена. Он не двигается? Обернитесь вокруг? LR-угол может вызвать сегрегацию, как сейчас.

3

Вы должны разорвать петлю, если вы найдете место игрока, например

void move_right() 
{ 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 5; j++) { 
      if (map[i][j] == player_loc) { 
       map[i][j+1] = player_loc; 
       map[i][j] = '.'; 
       return; 
      } 
     } 
    } 
} 

В своем коде вы двигаетесь прямо на игроке, и следующий цикл будет найти игрок в новом месте и сделать правильный ход снова, навсегда.

Кроме того, в вашем коде вы не заботитесь о границах вашей матрицы 2d: j+1 действителен только в том случае, если j<5. Тогда лучше код должен быть

void move_right() 
{ 
    for (int i = 0; i < 4; i++) { 
     for (int j = 0; j < 4; j++) { 
      if (map[i][j] == player_loc) { 
       map[i][j+1] = player_loc; 
       map[i][j] = '.'; 
       return; 
      } 
     } 
    } 
} 
+0

Значит, он не может двигаться прямо в нижнем ряду? – Jiminion

+0

@Jiminion Если Он реализует так, как Он может. Фактический код не предусматривает, что игрок перемещается на 'i + 1' или' i-1', если достигает левой или правой границы. – LPs

0

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

В начале, инициализируйте переменные row и col. (Значения взяты из вашего main.)

int row = 3; 
int col = 3; 

Изменить функцию get_player_loc так, что он просто обновляет глобалам row и col. Он устанавливает row и col в 0, если игрок не найден, в соответствии с оригиналом.

void get_player_loc(void) 
{ 
    for (int j = 0; j < 5; j++) { 
     for (int k = 0; k < 5; k++) { 
      if(map[j][k] == player_loc) 
      { 
       // The meaning of row and col is set by how they are used 
       // to index the array in the move and print functions. Keep 
       // the same order and meaning here. 
       row = j; 
       col = k; 
       return; 
      } 
     } 
    } 
    // Set row and col to 0 if the location is not found. 
    row = 0; 
    col = 0; 
    map[0][0] = player_loc; 
} 

Вы все еще будете иметь проблемы, когда они достигают края, в связи с индексом массива, выходящим за пределы в функциях двигающейся, но это другая проблема.

+0

Я отредактировал функцию get_player_loc, и теперь я получаю сообщение об ошибке. «return» без значения, в функции, возвращающей не-void [включено по умолчанию] – Jiskadar

+0

Обратите внимание, что теперь функция определена как 'void get_player_loc (void)'. Вероятно, вы оставили первую 'void' как' int'.Рад, что вы нашли правильный ответ и решение вашей проблемы. –

Смежные вопросы