Возникли проблемы с отображением кораблей в командной строке! - PullRequest
0 голосов
/ 13 июля 2011

Я строю игру на линейном корабле в C. У меня есть следующий код, чтобы подтвердить, что очки случайно размещенного корабля не превышают лимит платы.Код работает не очень гладко, и приложение зависает при генерации случайных точек.

Не могли бы вы порекомендовать некоторые варианты оптимизации к тому, что у меня есть?

while(1 == 1)
  {  
      //Generates the x, y coordenates of the point
      int x = rand() % 9;
      int y = rand() % 9;      

      //Calculating the ship direction
      char direction = ((rand() % 10) > 5) ? 'V' : 'H';   

      if(direction == 'H')
      {
           //Verifies that the ship placed on the acquired x coordenate of the point does not exceed the board size
           //if so recalculates the value of x               
           while(!(((x + ships[i].length) - 1) < 10)) x = (rand() % 5);
      }
      else
      {
           //Verifies that the ship placed on the acquired y coordenate of the point does not exceed the board size
           //if so recalculates the value of y
           while(!(((y + ships[i].length) - 1) < 10)) y = (rand() % 5);
      }                              

      //Calculating the coordenates for each point of the ship                             
      for(j = 0; j < ships[i].length; j++)
      {
          if(direction == 'H')
          {                                      
             points[j].x = (x + j);
             points[j].y = y;
          }    
          else
          {
             points[j].x = x;
             points[j].y = (y + j);                                                        
          }

          //Validating that the coordenate asigned to a point has not been assigned to another ship              
          if(verifyPos(points[j].x, points[j].y, ships, length)) 
          {           
              invalid = 1;
              break;
          }
      }

      //if all the points of the ship are valid, move to the next ship
      //if not recalculate the initial point and the subsequent coordenates
      if(invalid == 0) break;       
  }

  ships[i].points = points;
 }   
}

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Ну, один из способов улучшить это - выбрать направление движения корабля V или H, а затем использовать только ту часть доски, в которую он будет вписываться, так что если у корабля 4 длины и в вертикуле используются только ряды 1-7 (из 10-рядной доски) для начальной точки вертикали. Тогда вам не нужно проверять, подходит ли он вообще.

Глядя на код, я не вижу, где баллы присваиваются в

points[j].x = x;
points[j].y = (y + j); 

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

0 голосов
/ 13 июля 2011

Вам нужно посеять рандомизатор.

#include <time.h>

srand(time(NULL));

это тривиальный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...