Страница: 1 |
a po podrobnee mozhno?chto znachit bez izognutostej? i na yabasic'e svoj kod dat` vzglyanut` mogesh`? Это же элементарно, Ватсон Не просто рисуешь последовательно корабли, а еще и рамку вокруг них шириной 1. А потом для каждого нового расположения проверяешь, можно ли туда запихать корабль. А теперь РЕАЛЬНО КРУТАЯ ЗАДАЧА!!! Скорее даже, для математиков. Подсчитать число возможных расположений на доске 10х10 кораблей по правилам Морского боя: 1 4-палубный, 2 3-палубных, 3 2-палубных, 4 1-палубных. Пытался написать программу, но предварительный ручной расчет показал, что не хватит даже long... Попробуй по RND. 1. Сначала одно случайное число из двух - горизонтально или вертикально. 2. Затем одно из 100 - позиция. 3. Потом сверяешь пересекание с другими кораблями. Если пересекаются то возврат на 2 или 1. Если нет - следующий корабль. Вообще я в умной математической книжке читал такой способ построения.. Все большие корабли (2, 3, 4-палубные) кидаем в кучу в один угол, как можно плотнее. А мелочь (4 одднопалубных) раскидываем в рассыпную в оставшееся место. Смысл: противник перебивает все большие корабли, но зато потом долго-долго бегает за мелочью, т.к. поймать её труновато. Мой супералгоритм для Морского боя заключался в построении массива всех расположений кораблей на поле и вычислении вероятности нахождения корабля в определенной клетке - число случаев/число расстановок, ударе по этой клетке и вычеркивании неверных расстановок... Да только натолкнулось это на проблему числа расстановок... Вообще же, что касается расстановки кораблей на поле, можно перебрать все варианты размещения корабля, вычеркивать из них невозможные, брать рандом по числу оставшихся и отсчитывать этот вариант. Идеальная расстановка - это, конечно, хорошо, но такое высказывание достаточно умозрительно. Лучше бы вычислить вероятность - победа заданной конфигурации над случайным противником. >РЕАЛЬНО КРУТАЯ ЗАДАЧА!!! >... >Пытался написать программу, но предварительный ручной расчет показал, что не хватит даже long... Так тут нужно длинную арифметику использовать (хотя, возможно, все равно не хватит памяти). Поясняю: число записывается не в переменную, а в массив переменных. a(0) - число цифр в числе, a(1)...a(a(0)) - сами цифры. Нужно написать к этому сложение, вычитания, умножение - в общем, необходимые функции. Зато плюс в том, что легко вести расчет в ЛЮБОЙ системе счисления - хоть 10-ричной, хоть 72428-ричной! 2 Aracon: Типа потом как в "Матрице" терминальчик в какой-нибудь 1024-ной системе счисления в виде иероглифов забабахать... mc-black, a chevo smeeshsya?ved` v nature mozhno. ya vot dazhe uzhe hotel nachat` delat` takoe delo, da vot zanyalsya drugim delom(igru ya, ponimaete-li delayu ) a voobshe komu ne len`, vot chto mozhete sdelat`(pravda ento ne v temu, no vsezhe...): class kakojto chtoby tama mozhno bylo delat` arifmeticheskie dejstviya s gromadnymi chislami. nu, tima samo chislo v String'e hranit`, a potom esli tam skazhem pribavlyat`, to delaem kak 'V Stolbik', no toka programno, nu i.t.d... P.S. ne podumajte sho ya toka shas slozhenie v stolbik vyuchil... che, v nature! Страница: 1 |
Вопрос: Морской бой (почти олимпиада)
Добавлено: 03.01.04 02:47
Автор вопроса: Neco | Web-сайт:
Ну, робята, колитесь. Кто из вас не пробовал написать морской бой на VB? Так вот: какой вы использовали (или использовали бы) алгоритм для построения кораблей? С учётом того, что корабли не бывают гнутыми и не касаются друг друга даже углами. Я ещё на YaBasic'е написал чудовищно (как мне кажется) короткий алгоритм и теперь мне хочется пробить более лёгкий способ. Мой способ со всеми комментариями (их не так много) и объявлениями - 107 строк... особо не сжимал...
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #1
Добавлено: 03.01.04 03:48
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 03.01.04 07:15
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 03.01.04 07:44
Номер ответа: 4
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #4
Добавлено: 03.01.04 10:04
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 03.01.04 11:14
Номер ответа: 6
Автор ответа:
Aracon
ICQ: 221881915
Вопросов: 16
Ответов: 28
Web-сайт:
Профиль | | #6
Добавлено: 28.01.04 19:48
Номер ответа: 7
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #7
Добавлено: 28.01.04 20:15
Номер ответа: 8
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #8
Добавлено: 28.01.04 21:39
Номер ответа: 9
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #9
Добавлено: 29.01.04 10:34
Посмторите статью про длинную арифметику в VB (есть на VBNet такая),
может поможет... Там вроде и код был.
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 08.02.04 12:56
2Aracon: дело не в типе, дело во времени вычислений. С длинной арифметикой я знаком
Номер ответа: 11
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #11
Добавлено: 25.09.04 06:34
А я написал весь морской бой в 7 строк! Тока вот пришлось скачать SeaBattle.Ocx и All_formulas_in_the_world.dll!!! (наверно догадались, что это шутка
Номер ответа: 12
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #12
Добавлено: 11.05.05 23:34
Да, кстати, я вот подумал... если противнику будет просто найти все большие корабли и он их грохнет все с одного или двух ходов, то у него будет преимущество по количеству ходов. И так как среднее количество ударов в той или иной степени одинаковое, то поражение неизбежно. может надо раскидать мелочь по рандомайзу, а потом между НИМИ впихивать всё оставшееся? Как Doom'аете?
Номер ответа: 13
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #13
Добавлено: 12.05.05 00:17
да нет - в том-то и фенька, что при сбивании в кучу противник хоть и собьёт все большие корабли очень быстро, вероятность попадания в одиночки настолько мала, что с лихвой окупается и противник большую часть игрового времени палит "мимо" - это не очень интересно, но эффективно - проверено. 8)
А происходит это потому, что идёт наиболее оптимальное перекрывание областей вокруг затонувших кораблей и мест в которых МОЖЕТ быть корабль, но его там НЕТ - гораздо больше, чем при любой другой расстановке.
Однако, к примеру, мой алгоритм расстановки кораблей не предусматривает хитростей - иначе было бы скучно. Расставляются по рандому. Гораздо интереснее реализовывать AI, но у меня счас времени нет.
Кстати, свой алгоритм расстановки ему я уже выслал - осталось кому-нить подкинуть "комп".