2014-09-29 3 views
0

Я строю игру с линкорами, и мне нужны советы, как справиться с этой проблемой.C++ совет, как разбить цикл

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

Проблема заключается в функции void ShootAtShip(int board1[], int board2[], string names[], int cap), а цикл while говорит while ((board1[i] != 0 || board2[i] != 0)), что я думаю, проблема в том, что цикл while должен проходить весь путь сверху вниз до его окончания, я хочу, чтобы он разбился посередине IF board1 получает все 0.

bool isGameOver(int board1[], int board2[], int cap) 
{ 
    bool lost1 = true; 
    bool lost2 = true; 
    for (int i = 0; i < cap && lost1 != false; ++i) 
     if (board1[i] != 0) 
      lost1 = false; 
    if (lost1) 
     return true; 
    for (int i = 0; i < cap && lost2 != false; ++i) 
     if (board2[i] != 0) 
      lost2 = false; 
    return lost2; 
} 

void ShootAtShip(int board1[], int board2[], string names[], int cap) { 
    const int hit = 0; 
    int shot = 0; 
    int temp; 
    isGameOver(board1, board2, cap); 

    for (int i = 0; i < cap; i++) { 
     while ((board1[i] != 0 || board2[i] != 0)) { //detects if any board has all their ships shot down 

      cout << names[1] << " set a position to shoot." << endl; 
      cin >> shot; 
      temp = shot; 

      while ((shot >= cap) || (shot < 0)) {  //detects if the number is allowed 
       cout << "That number is not allowed, " << names[1] << " set a position to shoot." << endl; 
       cin >> shot; 
      } 

      if (board1[shot] != 0) { 
       board1[shot] = 0; 
       cout << "Hit!" << endl; 
      } 
      else { 
       cout << "You missed." << endl; 
      } 

      shot = 0; 

      cout << names[0] << " set a position to shoot." << endl; 
      cin >> shot; 

      while ((shot >= cap) || (shot < 0)) {  //detects if the number is allowed 
       cout << "That number is not allowed, " << names[0] << " set a position to shoot." << endl; 
       cin >> shot; 
      } 

      if (board2[shot] != 0) { 
       board2[shot] = 0; 
       cout << "Hit!" << endl; 
      } 
      else { 
       cout << "You missed." << endl; 
      } 

     } 


    } 



    cout << "Testing is while loop stops"; 
} 
+4

Действительно ли необходимо опубликовать весь код? Нам гораздо труднее реально помочь вам, если нам придется пройти через все это. Всегда старайтесь максимально упростить проблему. – Jendas

+0

Что именно не так с этим? Разрушено? Или нужна ли оптимизация? – rsethc

+0

изменил код на smaler, проблема в том, что цикл while не будет ломаться, когда ONE из досок получает все нули ТОЛЬКО, когда оба получат все ноль. –

ответ

4

Поэтому причина, по которой цикл не прерывается, заключается в том, что вы используете неправильный логический оператор в своем состоянии.

while ((board1[i] != 0 || board2[i] != 0)) должен быть while (board1[i] && board2[i])

Я считаю, что вы думаете «если плата 1 пуста или доска 2 пуст, затем перерыв», но то, что вы напечатал «если плата 1 имеет ничего не осталось, или на доске 2 осталось что-то, продолжайте идти ».

Также обратите внимание, что if (n != 0) потенциально более эффективен (и точно такой же), как if (n).

+0

Okey, я хочу, чтобы цикл прерывался, когда у одного есть все 0, так вот так? ** while (board1 [i]! = 0 && board2 [i]! = 0) ** –

+0

О, чтобы сломать, если все элементы в массиве равны 0? Это другое. – rsethc

+0

В этом случае вам может понадобиться другая функция, которая возвращает 'bool', такую ​​как' bool IsBoardAlive (<...> * board) {<...>}; '. Содержимое может быть чем-то вроде: for (int cur = 0; cur }; '. Вы поняли? – rsethc

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