[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка растановки караблей в морском бое
p.pavluxa
Здравствуйте, уважаемые пользователи форума! Пишу игру "Морской бой", и у меня такой вопрос.

У меня есть двумерный массив состоящий из 0 и 1, где 0 - пустая ячейка, 1 - кораблик (или его часть). Мне необходимо реализовать проверку на PHP которая выявит хорошо ли расставлены корабли или нет по следующим критерием:
1. По количеству кораблей всего: 4 - однопалубных, 3 - двухпалубных, 2 - трёхпалубных, 1 - четырёх палубные.
2. Корабли могут находится только в вертикальном либо горизонтальном положении.
3. Корабли не должны соприкасаться друг с другом.

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



Спустя 1 час, 48 минут, 3 секунды (24.07.2012 - 19:03) kamanch написал(а):
biggrin.gif Ну ты хоть ссыль на свой ресурс скинь, будем ходить туда по ночам, играть.
Или это у тебя контрольные работы?
Шашки, теперь морской бой...

К вопросу...

При твоей структуре массива - никак, т.к. нет разницы между 2х палубным кораблем и 2мя однопалубными, стоящими впритык

Спустя 48 минут, 7 секунд (24.07.2012 - 19:51) p.pavluxa написал(а):
А как тогда сделать это дело что бы всё получилось то?

Спустя 2 минуты, 9 секунд (24.07.2012 - 19:53) p.pavluxa написал(а):
ЕЩё 2 игры и покажу )

Спустя 38 секунд (24.07.2012 - 19:54) p.pavluxa написал(а):
В притык однопалубные ставить нельзя. Между кораблями должен быть минимум 1 нолик.

Спустя 1 час, 30 секунд (24.07.2012 - 20:54) kamanch написал(а):
Цитата
Мне необходимо реализовать проверку на PHP которая выявит хорошо ли расставлены корабли или нет по следующим критерием:

Значит корабли уже расставлены.
И тебе нужно проверить
Цитата
3. Корабли не должны соприкасаться друг с другом.

А как ты поймешь - 2х палубный или 2 однопалубных впритык?

Я бы не проверял, хороши ли они расставлены, а проверял: можно ли поставить очередной корабль туда, куда хочет игрок.

Спустя 10 часов, 1 минута, 35 секунд (25.07.2012 - 06:56) p.pavluxa написал(а):
Вы не поняли идею, мне нужно реализовать проверку что по одиночке должно быть 4 еденицы в массиве, по 2 штуки (по вертикали или горизонтале) стоящих рядом - 3 , и т.п

Спустя 12 минут, 50 секунд (25.07.2012 - 07:09) p.pavluxa написал(а):

class NavalBattle {

# Метод: проверка правильности расстановки кораблей.
# Принимает: игровое поле в виде двумерного массива.
# Возвращает: true либо номер ошибки.
# ВНИМАНИЕ! НУЖНО СДЕЛАТЬ ПРОВЕРКУ РАСТАНОВКИ ЧТО БЫ ОНИ НЕ СЛИВАЛИСЬ!

public static function CheckPlacement( &$aField ) {

# Проверка количества строк :
if( count( $aField ) != 10 )
return -1;

# Счетчик кораблей на поле :
$iShipCounter = 0;

# Перебор по строкам :
for( $iY = 0; $iY < 10; $iY++ ) {

# Проверка количества столбцов :
if( count( $aField[$iY] ) != 10 )
return -2;

# Перебор по столбцам :
for( $iX = 0; $iX < 10; $iX++ ) {

# Фильтрация значения ячейки :
$aField[$iY][$iX] = intval( $aField[$iY][$iX] );

# Проверка значения ячейки :
if( $aField[$iY][$iX] != 0 && $aField[$iY][$iX] != 1 )
return -3;

# Если это корабль :
if( $aField[$iY][$iX] == 1 ) {

# Проверяем что бы угловые ячейки содержали 0 :
if( (isset( $aField[$iY-1][$iX-1] ) && $aField[$iY-1][$iX-1] != 0) || (isset( $aField[$iY-1][$iX+1] ) && $aField[$iY-1][$iX+1] != 0) || (isset( $aField[$iY+1][$iX-1] ) && $aField[$iY+1][$iX-1] != 0) || (isset( $aField[$iY+1][$iX+1] ) && $aField[$iY+1][$iX+1] != 0) )
return -4;

# Увеличиваем счетчик палуб кораблей :
$iShipCounter++;
}
}
}


# Проверка количества палуб на поле :
if( $iShipCounter != 20 )
return -5;

return true;
}
}


Спустя 36 секунд (25.07.2012 - 07:09) p.pavluxa написал(а):
Остаётся сделать проверку на количество кораблей по количеству палуб (слившихся едениц).

У кого какие идеи?

Спустя 38 минут, 31 секунда (25.07.2012 - 07:48) kamanch написал(а):
Попробуй так:
Делаем массив Ship[]
В этом массиве 10 элементов, по одному для каждого корабля. Значения элементов - флаги (0,1)
Например, Ship[0], Ship[1], Ship[2], Ship[3] - зарезервировано под 4 однопалубных.

Напиши отдельно функцию -
может_ли_эта_палуба_быть_частью_корабля_с_количесвом(палуб);
Далее, берем какую-то клетку и прогоняем ее через функцию. Если оказывается, что это 1-палубный, пишем Ship[0] = 1
На поле же, все просканированые клетки отмечаем как 2 (не 0-пусто / не 1-палуба)
Далее сканируешь клетки, которые еще не в статусе 2.

В конце у тебя должен быть полностью заполнен массив Ship
Если нет - то корабли расставлены неверно.

Спустя 15 минут, 55 секунд (25.07.2012 - 08:04) p.pavluxa написал(а):
Всё сделал гораздо проще, прохожу по строкам и подсчитываю количества комбинаций двухпалубных, трёхпалубных и четырёх палубных кораблей. Потом так же по вертикали, и в результате проверю скоко у меня их.

Вот код:

class NavalBattle {

# Метод: проверка правильности расстановки кораблей.
# Принимает: игровое поле в виде двумерного массива.
# Возвращает: true либо номер ошибки.

public static function CheckPlacement( &$aField ) {

# Проверка количества строк :
if( count( $aField ) != 10 )
return -1;

# Счетчик кораблей на поле :
$iShipCounter = 0;
$iSingleDeckCounter = 0;
$iDoubleDeckCounter = 0;
$iThreeDeckCounter = 0;
$iFourDeckCounter = 0;

# Перебор по строкам :
for( $iY = 0; $iY < 10; $iY++ ) {

# Проверка количества столбцов :
if( count( $aField[$iY] ) != 10 )
return -2;

# Подсчет количества кораблей по палубно :
$sTmp = str_replace( array( '[', ']' ), array( '0,', ',0' ), json_encode( $aField[$iY] ) );
$iDoubleDeckCounter += substr_count( $sTmp, '0,1,1,0' );
$iThreeDeckCounter += substr_count( $sTmp, '0,1,1,1,0' );
$iFourDeckCounter += substr_count( $sTmp, '0,1,1,1,1,0' );

# Перебор по столбцам :
for( $iX = 0; $iX < 10; $iX++ ) {

# Фильтрация значения ячейки :
$aField[$iY][$iX] = intval( $aField[$iY][$iX] );

# Проверка значения ячейки :
if( $aField[$iY][$iX] != 0 && $aField[$iY][$iX] != 1 )
return -3;

# Если это корабль :
if( $aField[$iY][$iX] == 1 ) {

# Проверяем что бы угловые ячейки содержали 0 :
if( (isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX-1] ) && $aField[$iY-1][$iX-1] != 0) || (isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX+1] ) && $aField[$iY-1][$iX+1] != 0) || (isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX-1] ) && $aField[$iY+1][$iX-1] != 0) || (isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX+1] ) && $aField[$iY+1][$iX+1] != 0) )
return -4;

# Проверяем, однопалубный ли это корабль :
if( (!isset( $aField[$iY-1] ) || $aField[$iY-1][$iX] == 0) && (!isset( $aField[$iY+1] ) || $aField[$iY+1][$iX] == 0) && (!isset( $aField[$iY][$iX-1] ) || $aField[$iY][$iX-1] == 0) && (!isset( $aField[$iY][$iX+1] ) || $aField[$iY][$iX+1] == 0) )
$iSingleDeckCounter++;

# Увеличиваем счетчик палуб кораблей :
$iShipCounter++;
}
}
}


# Проверка количества палуб на поле :
if( $iShipCounter != 20 )
return -5;
if( $iSingleDeckCounter != 4 )
return -6;

# Подсчет количества кораблей по вертикали :
for( $iX = 0; $iX < 10; $iX++ ) {
$aTmp = array();
for( $iY = 0; $iY < 10; $iY++ )
$aTmp[] = $aField[$iY][$iX];
$sTmp = str_replace( array( '[', ']' ), array( '0,', ',0' ), json_encode( $aTmp ) );
$iDoubleDeckCounter += substr_count( $sTmp, '0,1,1,0' );
$iThreeDeckCounter += substr_count( $sTmp, '0,1,1,1,0' );
$iFourDeckCounter += substr_count( $sTmp, '0,1,1,1,1,0' );
}

# Проверка количества кораблей на поле :
if( $iDoubleDeckCounter != 3 || $iThreeDeckCounter != 2 || $iFourDeckCounter != 1 )
return -6;

return true;
}
}


Спустя 23 минуты, 5 секунд (25.07.2012 - 08:27) p.pavluxa написал(а):
Теперь возникает вопрос, после выстрела и попадания в палубу, как определить полностью ли корабль сдох или нет?

Спустя 2 часа, 31 минута, 49 секунд (25.07.2012 - 10:58) inpost написал(а):
н правильно организовал данные, если делаешь для себя... Ячейка не только хранить информацию о том, занята ли она, но и идентификатор кораблика, чтобы была связь. Или наоборот у корабля. Кроме этого в ячейке так же должна быть информация, стреляли ли по ней уже. И если там располагается палуда, то подбита ли она или нет.

Первый вопрос решается тем, что в проверке соседних клеток ты делаешь условие такое: является ли соседняя клетка занятой (1) И(!) не имеет айди корабля, проверку которого ты сейчас осуществляешь. Второй вопрос: так как мы храним инфу о том, стреляли ли в данную клетку - мы не допустим выстрелы по одной и той же палубе. Далее выбор за тобой:
1.хранишь хп у корабля и если стало 0 - значит он убит!
2. Банально проверяешь циклом все палубы, целы ли они...

Спустя 6 минут, 38 секунд (25.07.2012 - 11:05) kamanch написал(а):
inpost
Не будет так работать.
А знаешь почему? smile.gif
Потому что
p.pavluxa так делать не будет.
Все мои попытки призвать его к логичной организации данных разбиваются об его молчаливое "Я уже почти все написал так, как сам задумал... тут чуть осталось"


Спустя 9 минут, 55 секунд (25.07.2012 - 11:15) inpost написал(а):
h.n.81
Беда. Зато яркий представить программистов таких... И сразу видно, что прежде чем писать - необходимо продумать логику приложения. Ато кораблики расставили, а как все работать будет - теперь думаем.
По своему опыту скажу, что свои наработки всегда приходится переделывать и этого бояться нельзя. Правильно организуешь - быстрее сделаешь. А как ты пытаешься сделать через костыли - приложение так развалится.

Спустя 1 час, 3 минуты (25.07.2012 - 12:18) p.pavluxa написал(а):
Сделал! Зацените

class NavalBattle {

# Метод: проверка правильности расстановки кораблей.
# Принимает: игровое поле в виде двумерного массива.
# Возвращает: true либо номер ошибки.

public static function CheckPlacement( &$aField ) {

# Проверка количества строк :
if( count( $aField ) != 10 )
return -1;

# Счетчик кораблей на поле :
$iShipCounter = 0;
$iSingleDeckCounter = 0;
$iDoubleDeckCounter = 0;
$iThreeDeckCounter = 0;
$iFourDeckCounter = 0;

# Перебор по строкам :
for( $iY = 0; $iY < 10; $iY++ ) {

# Проверка количества столбцов :
if( count( $aField[$iY] ) != 10 )
return -2;

# Подсчет количества кораблей по палубно :
$sTmp = str_replace( array( '[', ']' ), array( '0,', ',0' ), json_encode( $aField[$iY] ) );
$iDoubleDeckCounter += substr_count( $sTmp, '0,1,1,0' );
$iThreeDeckCounter += substr_count( $sTmp, '0,1,1,1,0' );
$iFourDeckCounter += substr_count( $sTmp, '0,1,1,1,1,0' );

# Перебор по столбцам :
for( $iX = 0; $iX < 10; $iX++ ) {

# Фильтрация значения ячейки :
$aField[$iY][$iX] = intval( $aField[$iY][$iX] );

# Проверка значения ячейки :
if( $aField[$iY][$iX] != 0 && $aField[$iY][$iX] != 1 )
return -3;

# Если это корабль :
if( $aField[$iY][$iX] == 1 ) {

# Проверяем что бы угловые ячейки содержали 0 :
if( (isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX-1] ) && $aField[$iY-1][$iX-1] != 0) || (isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX+1] ) && $aField[$iY-1][$iX+1] != 0) || (isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX-1] ) && $aField[$iY+1][$iX-1] != 0) || (isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX+1] ) && $aField[$iY+1][$iX+1] != 0) )
return -4;

# Проверяем, однопалубный ли это корабль :
if( (!isset( $aField[$iY-1] ) || $aField[$iY-1][$iX] == 0) && (!isset( $aField[$iY+1] ) || $aField[$iY+1][$iX] == 0) && (!isset( $aField[$iY][$iX-1] ) || $aField[$iY][$iX-1] == 0) && (!isset( $aField[$iY][$iX+1] ) || $aField[$iY][$iX+1] == 0) )
$iSingleDeckCounter++;

# Увеличиваем счетчик палуб кораблей :
$iShipCounter++;
}
}
}


# Проверка количества палуб на поле :
if( $iShipCounter != 20 )
return -5;
if( $iSingleDeckCounter != 4 )
return -6;

# Подсчет количества кораблей по вертикали :
for( $iX = 0; $iX < 10; $iX++ ) {
$aTmp = array();
for( $iY = 0; $iY < 10; $iY++ )
$aTmp[] = $aField[$iY][$iX];
$sTmp = str_replace( array( '[', ']' ), array( '0,', ',0' ), json_encode( $aTmp ) );
$iDoubleDeckCounter += substr_count( $sTmp, '0,1,1,0' );
$iThreeDeckCounter += substr_count( $sTmp, '0,1,1,1,0' );
$iFourDeckCounter += substr_count( $sTmp, '0,1,1,1,1,0' );
}

# Проверка количества кораблей на поле :
if( $iDoubleDeckCounter != 3 || $iThreeDeckCounter != 2 || $iFourDeckCounter != 1 )
return -6;

return true;
}

# Метод: полностью раненый корабль, делает его убитым, и окружает недоступностью.
# Принимает: игровое поле в виде двумерного массива.

public static function DefineDeadShips( &$aField ) {

# Выполняем замену одиночных кораблей :
for( $iY = 0; $iY < 10; $iY++ )
for( $iX = 0; $iX < 10; $iX++ )
if( $aField[$iY][$iX] == 3 && (!isset( $aField[$iY-1] ) || $aField[$iY-1][$iX] == 0 || $aField[$iY-1][$iX] == 2) && (!isset( $aField[$iY+1] ) || $aField[$iY+1][$iX] == 0 || $aField[$iY+1][$iX] == 2) && (!isset( $aField[$iY][$iX-1] ) || $aField[$iY][$iX-1] == 0 || $aField[$iY][$iX-1] == 2) && (!isset( $aField[$iY][$iX+1] ) || $aField[$iY][$iX+1] == 0 || $aField[$iY][$iX+1] == 2) )
$aField[$iY][$iX] = 4;

# Выполняем замену горизонтальных кораблей :
for( $iY = 0; $iY < 10; $iY++ ) {
$sRow = str_replace( array( '[', ']' ), array( '[0,', ',0]' ), json_encode( $aField[$iY] ) );
$sRow = str_replace( '0,3,3,3,3,0', '0,4,4,4,4,0', $sRow );
$sRow = str_replace( '2,3,3,3,3,2', '2,4,4,4,4,2', $sRow );
$sRow = str_replace( '2,3,3,3,3,0', '2,4,4,4,4,0', $sRow );
$sRow = str_replace( '0,3,3,3,3,2', '0,4,4,4,4,2', $sRow );
$sRow = str_replace( '0,3,3,3,0', '0,4,4,4,0', $sRow );
$sRow = str_replace( '2,3,3,3,2', '2,4,4,4,2', $sRow );
$sRow = str_replace( '2,3,3,3,0', '2,4,4,4,0', $sRow );
$sRow = str_replace( '0,3,3,3,2', '0,4,4,4,2', $sRow );
$sRow = str_replace( '0,3,3,0', '0,4,4,0', $sRow );
$sRow = str_replace( '2,3,3,2', '2,4,4,2', $sRow );
$sRow = str_replace( '2,3,3,0', '2,4,4,0', $sRow );
$sRow = str_replace( '0,3,3,2', '0,4,4,2', $sRow );
$sRow = str_replace( array( '[0,', ',0]' ),array( '[', ']' ), $sRow );
$aField[$iY] = json_decode( $sRow );
}

# Выполняем замену вертикальных кораблей :
for( $iX = 0; $iX < 10; $iX++ ) {
$aCol = array();
for( $iY = 0; $iY < 10; $iY++ )
$aCol[$iY] = $aField[$iY][$iX];
$sCol = str_replace( array( '[', ']' ), array( '[0,', ',0]' ), json_encode( $aCol ) );
$sCol = str_replace( '0,3,3,3,3,0', '0,4,4,4,4,0', $sCol );
$sCol = str_replace( '2,3,3,3,3,2', '2,4,4,4,4,2', $sCol );
$sCol = str_replace( '2,3,3,3,3,0', '2,4,4,4,4,0', $sCol );
$sCol = str_replace( '0,3,3,3,3,2', '0,4,4,4,4,2', $sCol );
$sCol = str_replace( '0,3,3,3,0', '0,4,4,4,0', $sCol );
$sCol = str_replace( '2,3,3,3,2', '2,4,4,4,2', $sCol );
$sCol = str_replace( '2,3,3,3,0', '2,4,4,4,0', $sCol );
$sCol = str_replace( '0,3,3,3,2', '0,4,4,4,2', $sCol );
$sCol = str_replace( '0,3,3,0', '0,4,4,0', $sCol );
$sCol = str_replace( '2,3,3,2', '2,4,4,2', $sCol );
$sCol = str_replace( '2,3,3,0', '2,4,4,0', $sCol );
$sCol = str_replace( '0,3,3,2', '0,4,4,2', $sCol );
$sCol = str_replace( array( '[0,', ',0]' ),array( '[', ']' ), $sCol );
$aCol = json_decode( $sCol );
for( $iY = 0; $iY < 10; $iY++ )
$aField[$iY][$iX] = $aCol[$iY];
}

# Выполняем обводку убитых кораблей :
for( $iY = 0; $iY < 10; $iY++ ) {
for( $iX = 0; $iX < 10; $iX++ ) {
if( $aField[$iY][$iX] == 4 ) {
if( isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX-1] ) && ($aField[$iY-1][$iX-1] == 0 || $aField[$iY-1][$iX-1] == 2) )
$aField[$iY-1][$iX-1] = 5;
if( isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX] ) && ($aField[$iY-1][$iX] == 0 || $aField[$iY-1][$iX] == 2) )
$aField[$iY-1][$iX] = 5;
if( isset( $aField[$iY-1] ) && isset( $aField[$iY-1][$iX+1] ) && ($aField[$iY-1][$iX+1] == 0 || $aField[$iY-1][$iX+1] == 2) )
$aField[$iY-1][$iX+1] = 5;
if( isset( $aField[$iY] ) && isset( $aField[$iY][$iX-1] ) && ($aField[$iY][$iX-1] == 0 || $aField[$iY][$iX-1] == 2) )
$aField[$iY][$iX-1] = 5;
if( isset( $aField[$iY] ) && isset( $aField[$iY][$iX+1] ) && ($aField[$iY][$iX+1] == 0 || $aField[$iY][$iX+1] == 2) )
$aField[$iY][$iX+1] = 5;
if( isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX-1] ) && ($aField[$iY+1][$iX-1] == 0 || $aField[$iY+1][$iX-1] == 2) )
$aField[$iY+1][$iX-1] = 5;
if( isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX] ) && ($aField[$iY+1][$iX] == 0 || $aField[$iY+1][$iX] == 2) )
$aField[$iY+1][$iX] = 5;
if( isset( $aField[$iY+1] ) && isset( $aField[$iY+1][$iX+1] ) && ($aField[$iY+1][$iX+1] == 0 || $aField[$iY+1][$iX+1] == 2) )
$aField[$iY+1][$iX+1] = 5;
}
}
}
}


# Метод: проверяет, все ли корабли убиты.
# Принимает: игровое поле в виде двумерного массива.
# Возвращает: true или false.

public static function DoAllShipsKilled( &$aField ) {
foreach( $aField as $aRow )
foreach( $aRow as $iValue )
if( $iValue == 1 )
return false;
return true;
}
}


Спустя 1 минута, 22 секунды (25.07.2012 - 12:19) p.pavluxa написал(а):
И сделаем заключение:
0 - пустая ячейка,
1 - кораблик,
2 - промах
3 - кораблик который ранели,
4 - кораблик убитый,
5 - зона в радиусе 1 клетки от убитого нахер корабля

Спустя 6 часов, 58 минут, 3 секунды (25.07.2012 - 19:17) inpost написал(а):
дело за малым, мультиплеер прикрепить smile.gif

Спустя 51 минута, 19 секунд (25.07.2012 - 20:09) p.pavluxa написал(а):
Та нет, сейчас новая запара... Нужно сделать что бы при клике на случайную расстановку оно автоматом раставляло караблики на двумерном массиве. Сделал уже что бы по горизонтали раставляло правильно, а вот по вертикали что-то уже затупил.
Может что подскажите:

/* Инициализируем массив игрового поля пустотой */
CreateGame.aField = [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ];

/* Перебираем размеры корабля начиная с самого крупного */
for( var iShipSize = 4; iShipSize > 0; iShipSize-- ) {

/* Перебираем количество кораблей требуемого размера */
for( iShipCount = 0; iShipCount < 5 - iShipSize; iShipCount++ ) {

/* Случайный выбор направления корабля : верикаль либо горизонталь */
var bDirection = intRandom( 0, 1 ) == 0; // true - горизонталь, false - вертикаль

/* Расчет позиций в которых можно впихнуть корабль */

var aPositions = [];

/* Переход по строкам */
for( var iY = 0; iY < 10; iY++ ) {

/* Переход по столбцам */
for( var iX = 0; iX < 10; iX++ ) {

var bGood = true;

/* Проверяем что бы корабль помещался и вокруг не было других */
for( var i = -1; i < iShipSize+1; i++ )
if(
(
iX-(-i) < 10 || i != iShipSize) && iX-(-i) > -1 && (
CreateGame.aField[iY][iX-(-i)] != 0 ||
(
CreateGame.aField[iY-1] !== undefined && CreateGame.aField[iY-1][iX-(-i)] != 0) ||
(
CreateGame.aField[iY-(-1)] !== undefined && CreateGame.aField[iY-(-1)][iX-(-i)] != 0)
))

bGood = false;

/* Сюда можно засунуть кораблик */
if( bGood )
aPositions[aPositions.length] = [iX, iY];
}
}


do {
var aRandomPosition = aPositions[intRandom( 0, aPositions.length )];
}
while( aRandomPosition === undefined );
for( var i = 0; i < iShipSize; i++ )
CreateGame.aField[aRandomPosition[1]][aRandomPosition[0]-(-i)] = 1;
}
}

Спустя 24 минуты, 42 секунды (25.07.2012 - 20:33) p.pavluxa написал(а):
user posted image

Да я же мега супер адский программер! Я сделал эту херню!!!


/* Инициализируем массив игрового поля пустотой */
CreateGame.aField = [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ];

/* Перебираем размеры корабля начиная с самого крупного */
for( var iShipSize = 4; iShipSize > 0; iShipSize-- ) {

/* Перебираем количество кораблей требуемого размера */
for( iShipCount = 0; iShipCount < 5 - iShipSize; iShipCount++ ) {

/* Случайный выбор направления корабля : верикаль либо горизонталь */
var bDirection = intRandom( 0, 1 ) == 0; // true - горизонталь, false - вертикаль

/* Расчет позиций в которых можно впихнуть корабль */

var aPositions = [];

if( bDirection ) {

/* Переход по строкам */
for( var iY = 0; iY < 10; iY++ ) {

/* Переход по столбцам */
for( var iX = 0; iX < 10; iX++ ) {

var bGood = true;

/* Проверяем что бы корабль помещался и вокруг не было других */
for( var i = -1; i < iShipSize+1; i++ )
if(
(
iX-(-i) < 10 || i != iShipSize) && iX-(-i) > -1 && (
CreateGame.aField[iY][iX-(-i)] != 0 ||
(
CreateGame.aField[iY-1] !== undefined && CreateGame.aField[iY-1][iX-(-i)] != 0) ||
(
CreateGame.aField[iY-(-1)] !== undefined && CreateGame.aField[iY-(-1)][iX-(-i)] != 0)
))

bGood = false;

/* Сюда можно засунуть кораблик */
if( bGood )
aPositions[aPositions.length] = [iX, iY];
}
}


do {
var aRandomPosition = aPositions[intRandom( 0, aPositions.length )];
}
while( aRandomPosition === undefined );
for( var i = 0; i < iShipSize; i++ )
CreateGame.aField[aRandomPosition[1]][aRandomPosition[0]-(-i)] = 1;
}
/* Нужно поставить корабль вертикально */
else {

for( iX = 0; iX < 10; iX++ ) {
for( iY = 0; iY < 10; iY++ ) {

var isGoodPosition = true;

// Провяем что бы сверху от корабля ничего не было:
if( CreateGame.aField[iY-1] !== undefined && ((CreateGame.aField[iY-1][iX-1] !== undefined && CreateGame.aField[iY-1][iX-1] != 0) || CreateGame.aField[iY-1][iX] != 0 || (CreateGame.aField[iY-1][iX-(-1)] !== undefined && CreateGame.aField[iY-1][iX-(-1)] != 0)) ) {
isGoodPosition = false;
break;
}

// По бокам от каробля не должно быть других кораблей и он должен помещаться :
for( i = 0; i < iShipSize; i++ ) {
if( CreateGame.aField[iY-(-i)] === undefined || CreateGame.aField[iY-(-i)][iX] != 0 || (CreateGame.aField[iY-(-i)][iX-1] !== undefined && CreateGame.aField[iY-(-i)][iX-1] != 0) || (CreateGame.aField[iY-(-i)][iX-(-1)] !== undefined && CreateGame.aField[iY-(-i)][iX-(-1)] != 0) ) {
isGoodPosition = false;
break;
}
}


// Провяем что бы снизу от корабля ничего не было:
if( CreateGame.aField[iY-(-iShipSize)] !== undefined && ((CreateGame.aField[iY-(-iShipSize)][iX-1] !== undefined && CreateGame.aField[iY-(-iShipSize)][iX-1] != 0) || CreateGame.aField[iY-(-iShipSize)][iX] != 0 || (CreateGame.aField[iY-(-iShipSize)][iX-(-1)] !== undefined && CreateGame.aField[iY-(-iShipSize)][iX-(-1)] != 0)) ) {
isGoodPosition = false;
break;
}

if( isGoodPosition )
aPositions[aPositions.length] = [iX, iY];
}
}


do {
var aRandomPosition = aPositions[intRandom( 0, aPositions.length )];
}
while( aRandomPosition === undefined );
for( var i = 0; i < iShipSize; i++ )
CreateGame.aField[aRandomPosition[1]-(-i)][aRandomPosition[0]] = 1;
}
}
}


Спустя 9 минут, 23 секунды (25.07.2012 - 20:43) neadekvat написал(а):
Как резко, однако, поменялся ЯП в треде.

Если игра - мультиплеер, то все данные и логику лучше держать на сервере. Случайную генерацию поля - в том числе.

А на js только "рисовать" это поле по готовым данным и делать проверки для скорости работы.

Спустя 1 день, 17 часов, 6 минут, 16 секунд (27.07.2012 - 13:49) p.pavluxa написал(а):
Все данные и так держу на сервере, но нужно в клиентской части раставлять кораблики и методом POST отправлять массив. Зачем нам генерировать случайную растановку в PHP, если яваскрипт сам прекрасно расставит и отправит методом POST на скрипт, а мы её просто проверим на правильность.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.