> проблема с проверкой растановки кораблей в морском бое
fuzzyduzzy
Отправлено: 6 ноября 2012 в 21:59
Post Id
cообщений: 8 пользователь offline
 while (K3 > 0)   // К3 -трехпалубный корабль
    {
        dir = rand()%2;  // выбирает рандомом  в каком направлении будет растановка кораблей
горизонтальном или вертикальном
        if (dir == h)
        {
            do
            {
                x = rand()%10; // случайные координаты
                y = rand()%10;
            }
            while (x > 7);
        }
        else if (dir = v)
        {
            do
            { 
                x = rand()%10;
                y = rand()%10;
            }
            while (y > 7);
        }
            if (dir == h)   // идея проверки  на расположения кораблей
            {
                x1 = x > 0? x - 1: 0;
                y1 = y > 0? y - 1: 0;
                x2 = x + 3 < 10? x + 3: 9;
                y2 = y + 1 < 10? y + 1: 9;
            }
            else if (dir = v)
            {
                x1 = x > 0? x - 1: 0;
                y1 = y > 0? y - 1: 0;
                x2 = x + 1 < 10? x + 1: 9;
                y2 = y + 3 < 10? y + 3: 9;
            }
		

************************************************************************	
// Должно быть какое  то условие  но немогу вкурить какое((... 

		 for(i=y1;i<y2;i++)
            {
                for(j=x1;j<=x2;j++)
            {
		
                  

********************************************************************************

        for(i=0;i<3;i++)
            {
				human->ships[y][x]=3;
                if(dir == h)
                {
                    x++;
                }
                else
                {
                    y++;
                }
            }
        K3--;
        }//WHILE k>3
Обновлено: 6 ноября 2012 в 22:25
 Top
fuzzyduzzy
Отправлено: 6 ноября 2012 в 23:24
Post Id
cообщений: 8 пользователь offline

По логике вро де бы должно быть так

 for(i = y1; i < y2; i++)
       {
                for(j = x1; j < x2; j++)
		{
			if(human.ships[i][j] > 0)
                        {
                           flag=1;
                           break;
                        }
	         }
       }

Но при таком раскладе раз на 3 -4 корабли соприкасаются... и елсы ставил... тоже на определенном моменте соприкасаются((

 Top
Aceton
Отправлено: 7 ноября 2012 в 00:25
Post Id
cообщений: 155 администратор offline
Здравствуйте! У меня вопрос к вам по поводу одного момента в вашем коде...

case h:
if (ships[s-1][c-1] == 2)   --- почему сдесь двойка???
{
	e = 1;
	/*
		  345678
		#-------
		2|X 
		3| 2222 
		4| 
	*/
}

Внимательнее надо читать, 2 - значит в этой клетке установлена неподбитая секция корабля
Т.е. если равно 2 - то рядом корабль, ставить нельзя и задаем e = 1

А по поводу проверки как корабли ставить, не надо придумывать велосипед, тем более явно в некоторых точках в твоем примере пробелы, используй тот код что в статье)))

Обновлено: 7 ноября 2012 в 00:32
 Top
fuzzyduzzy
Отправлено: 7 ноября 2012 в 00:39
Post Id
cообщений: 8 пользователь offline

Мне нужно со структурами сделать)) и хочеться разобратся как и что а не тупо сфилонить код))

 Top
Aceton
Отправлено: 7 ноября 2012 в 00:45
Post Id
cообщений: 155 администратор offline

однозначно правильнее и еффективнее это делать через массивы. причем тут структуры?)))

все равно смысл одинаковый - берешь координаты корабля и проверяешь последовательно соседние клетки

 Top
fuzzyduzzy
Отправлено: 7 ноября 2012 в 00:56
Post Id
cообщений: 8 пользователь offline

Меньше писанины))) в структуре два массива))

 Top
fuzzyduzzy
Отправлено: 7 ноября 2012 в 01:08
Post Id
cообщений: 8 пользователь offline

хотел спросит еще вот такой вопрос а как реализуется растановка караблей вручную?

 Top
fuzzyduzzy
Отправлено: 7 ноября 2012 в 01:24
Post Id
cообщений: 8 пользователь offline

Еще раз просмотрел ваш урок и код... но так и не понял или не вижу)) где вы инициализируете что 1- это море, 2 - карабль, 3 раненый... ?

Обновлено: 7 ноября 2012 в 01:24
 Top
rsh
Отправлено: 7 ноября 2012 в 07:44
Post Id
cообщений: 2 пользователь offline

Вот здесь, в начале урока:
"Ячейки массива могут принимать три значения: 1 - данным значением инициализируются все ячейки - это пустые клетки (море), 2 - в данной ячейке расположен корабль (или его часть), 3 - в данной ячейке расположен подбитый врагом корабль (или его часть)."

Оригинал урока здесь: Консольный морской бой

Обновлено: 7 ноября 2012 в 07:44
 Top
fuzzyduzzy
Отправлено: 9 ноября 2012 в 19:20
Post Id
cообщений: 8 пользователь offline

BandiMonty

if (ships[s][c+deck-1] == 1)
{
  e = place_ship(s,c,dir,deck);
  if (e == 0)
  {
    for (int i = 0; i < deck; i++)
    {
      ships[s][c+i] = 2;
    }
    isset = 1;
  }
}

Допустим, случайным образом были выбраны две координаты: s = 3, c = 4. 
Допустим, нам нужно разместить четырёхпалубный корабль.

В if мы проверяем свободна ли клетка ships[3][4+deck-1] или ships[3][7]. 
Как это выглядит  на поле (один - выбранная координата):

 4567
 #----
3|1 X

У меня вопрос к вам по этому фрагменту... Почему берется ships[s][c+deck-1] (deck-1).. И что будет если координаты выпадут 7 и 9, тогда получиться ships[7][12]... Не будет ли такой ситуации что произойдет разрыв корабля?

Обновлено: 9 ноября 2012 в 22:13
 Top
Aceton
Отправлено: 9 ноября 2012 в 22:27
Post Id
cообщений: 155 администратор offline

а с какой стати должен быть разрыв? если мы просто прибавляем длину

 Top
fuzzyduzzy
Отправлено: 10 ноября 2012 в 00:06
Post Id
cообщений: 8 пользователь offline

у меня бывает что четырехпалубник рвет на два двухпалубника)) Правда не часто(1 раз из 20 примерно)

 Top
Shocker
Отправлено: 22 января 2013 в 13:14
Post Id
cообщений: 26 пользователь offline

значит ошибка в условиях какая то...

 Top
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
 



Новые сообщения