Dungeon Crawl игра, проблема с механизмом движения - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в C ++ и пишу программу под названием dungeoncrawl.cpp.

Итак, для первой части программы (генерация карт и случайные позиции) пока все хорошо, но потомдля механики движения я нашел проблему.Да, я добавил только левый и правый, но программа, кажется, всегда распознает только второй случай внутри оператора switch, например, когда я нажимаю «d», игрок идет вправо, но когда я нажимаю «a», ничего не происходит, и если я изменю порядок дел, произойдет обратное.Я почти уверен, что смогу заставить его работать, используя оператор if, но мне стало любопытно.Спасибо за помощь.

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

// dungeoncrawl.cpp
// Make a program that outputs a simple grid based gameboard to the screen
// using either numbers or characters.
// Allow the user (marked by G in the example) to move either up, down, left,
// or right each turn.
// If the player steps on a trap then they lose. If the make it to the
// treasure 'X' then they win.

int i;
char table[76];

class game {
 public:
  void board() {  // GAME BOARD
    srand(time(0));
    for (i = 0; i <= 76; i++) {
      if (i % 11 == 0) {
        table[i] = '\n';
      } else {
        table[i] = '.';
      }
    }
    // ENEMIES
    for (int x = 0; x < 3; x++) {
      i = (rand() % 75);
      if (table[i] != '\n' && table[i] != 'G' && table[i] != 'X' &&
          table[i] != 'T') {
        table[i] = 'T';
      } else {
        i = (rand() % 75 + 1);
        if (table[i] != '\n' && table[i] != 'G' && table[i] != 'X' &&
            table[i] != 'T') {
          table[i] = 'T';
        }
      }
    }
    // PLAYER

    i = (rand() % 25 + 1);  // player initiantes in the beggining of the board
    if (table[i] != '\n' && table[i] != 'G' && table[i] != 'X' &&
        table[i] != 'T') {
      table[i] = 'G';
    } else {
      i = (rand() % 25 + 1);
      if (table[i] != '\n' && table[i] != 'G' && table[i] != 'X' &&
          table[i] != 'T') {
        table[i] = 'G';
      }
    }
    // TREASURE
    table[75] = 'X';
    // PRINT BOARD
    for (i = 0; i <= 76; i++) cout << table[i];
  }
};

// board:
// game obj;
// obj.board();

int main() {
  char move;
  game obj;
  obj.board();
  // player move
  while (table[75] != 'G') {
    cout << "\n"
         << "Make your move: ";
    cin >> move;
    switch (move) {
      case 'a':
        for (i = 0; i <= 76; i++) {
          if (table[i] == 'G') {
            table[i] = '.';
            table[i - 2] = 'G';
            break;
          }
        }
      case 'd':
        for (i = 0; i <= 76; i++) {
          if (table[i] == 'G') {
            table[i] = '.';
            table[i + 2] = 'G';
            break;
          }
        }
    }
    for (i = 0; i <= 76; i++) cout << table[i];
  }
  return 0;
}

1 Ответ

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

У вас недостаточно операторов break, ваш разрыв находится внутри цикла for и выходит из этого

Попробуйте это:

case 'a':

for (i=0;i<=76;i++){
if (table [i]=='G') {
table [i]='.';
table [i-2]='G';break;}
  }
break;

case 'd':

for (i=0;i<=76;i++){
if (table [i]=='G') {
table [i]='.';
table [i+2]='G';break;}
} 
break;
...