Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 |

 

  Вопрос: Морской бой (почти олимпиада) Добавлено: 03.01.04 02:47  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Ну, робята, колитесь. Кто из вас не пробовал написать морской бой на VB? Так вот: какой вы использовали (или использовали бы) алгоритм для построения кораблей? С учётом того, что корабли не бывают гнутыми и не касаются друг друга даже углами. Я ещё на YaBasic'е написал чудовищно (как мне кажется) короткий алгоритм и теперь мне хочется пробить более лёгкий способ. Мой способ со всеми комментариями (их не так много) и объявлениями - 107 строк... особо не сжимал...

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #1 Добавлено: 03.01.04 03:48

a po podrobnee mozhno?chto znachit bez izognutostej?

i na yabasic'e svoj kod dat` vzglyanut` mogesh`?

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 03.01.04 07:15

Это же элементарно, Ватсон :)

Не просто рисуешь последовательно корабли, а еще и рамку вокруг них шириной 1. А потом для каждого нового расположения проверяешь, можно ли туда запихать корабль. А теперь РЕАЛЬНО КРУТАЯ ЗАДАЧА!!! Скорее даже, для математиков.

Подсчитать число возможных расположений на доске 10х10 кораблей по правилам Морского боя: 1 4-палубный, 2 3-палубных, 3 2-палубных, 4 1-палубных. Пытался написать программу, но предварительный ручной расчет показал, что не хватит даже long...

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 03.01.04 07:44

Попробуй по RND.

1. Сначала одно случайное число из двух - горизонтально или вертикально.

2. Затем одно из 100 - позиция.

3. Потом сверяешь пересекание с другими кораблями. Если пересекаются то возврат на 2 или 1. Если нет - следующий корабль.

Ответить

Номер ответа: 4
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #4
Добавлено: 03.01.04 10:04

Вообще я в умной математической книжке читал такой способ построения..

Все большие корабли (2, 3, 4-палубные) кидаем в кучу в один угол, как можно плотнее. А мелочь (4 одднопалубных) раскидываем в рассыпную в оставшееся место.

Смысл: противник перебивает все большие корабли, но зато потом долго-долго бегает за мелочью, т.к. поймать её труновато.

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 03.01.04 11:14

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

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

Идеальная расстановка - это, конечно, хорошо, но такое высказывание достаточно умозрительно. Лучше бы вычислить вероятность - победа заданной конфигурации над случайным противником.

Ответить

Номер ответа: 6
Автор ответа:
 Aracon



ICQ: 221881915 

Вопросов: 16
Ответов: 28
 Web-сайт: aracon-studios.com
 Профиль | | #6
Добавлено: 28.01.04 19:48

>РЕАЛЬНО КРУТАЯ ЗАДАЧА!!!

>...

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

Так тут нужно длинную арифметику использовать (хотя, возможно, все равно не хватит памяти). Поясняю: число записывается не в переменную, а в массив переменных. a(0) - число цифр в числе, a(1)...a(a(0)) - сами цифры. Нужно написать к этому сложение, вычитания, умножение - в общем, необходимые функции. Зато плюс в том, что легко вести расчет в ЛЮБОЙ системе счисления - хоть 10-ричной, хоть 72428-ричной!

Ответить

Номер ответа: 7
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #7
Добавлено: 28.01.04 20:15

2 Aracon:

Типа потом как в "Матрице" терминальчик в какой-нибудь 1024-ной системе счисления в виде иероглифов забабахать... :)

Ответить

Номер ответа: 8
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #8 Добавлено: 28.01.04 21:39

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!

Ответить

Номер ответа: 9
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #9
Добавлено: 29.01.04 10:34
Посмторите статью про длинную арифметику в VB (есть на VBNet такая),
может поможет... Там вроде и код был.

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 08.02.04 12:56
2Aracon: дело не в типе, дело во времени вычислений. С длинной арифметикой я знаком

Ответить

Номер ответа: 11
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #11
Добавлено: 25.09.04 06:34
А я написал весь морской бой в 7 строк! Тока вот пришлось скачать SeaBattle.Ocx и All_formulas_in_the_world.dll!!! (наверно догадались, что это шутка:-)

Ответить

Номер ответа: 12
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #12
Добавлено: 11.05.05 23:34
Все большие корабли (2, 3, 4-палубные) кидаем в кучу в один угол, как можно плотнее. А мелочь (4 одднопалубных) раскидываем в рассыпную в оставшееся место.


Да, кстати, я вот подумал... если противнику будет просто найти все большие корабли и он их грохнет все с одного или двух ходов, то у него будет преимущество по количеству ходов. И так как среднее количество ударов в той или иной степени одинаковое, то поражение неизбежно. может надо раскидать мелочь по рандомайзу, а потом между НИМИ впихивать всё оставшееся? Как Doom'аете?

Ответить

Номер ответа: 13
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #13
Добавлено: 12.05.05 00:17
да нет - в том-то и фенька, что при сбивании в кучу противник хоть и собьёт все большие корабли очень быстро, вероятность попадания в одиночки настолько мала, что с лихвой окупается и противник большую часть игрового времени палит "мимо" - это не очень интересно, но эффективно - проверено. 8)
А происходит это потому, что идёт наиболее оптимальное перекрывание областей вокруг затонувших кораблей и мест в которых МОЖЕТ быть корабль, но его там НЕТ - гораздо больше, чем при любой другой расстановке.
Однако, к примеру, мой алгоритм расстановки кораблей не предусматривает хитростей - иначе было бы скучно. Расставляются по рандому. Гораздо интереснее реализовывать AI, но у меня счас времени нет.
Кстати, свой алгоритм расстановки ему я уже выслал - осталось кому-нить подкинуть "комп".

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам