C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Морской бой
Londinium
Отправлено: 15.10.2005, 13:50


Не зарегистрирован







Здравствуйте, Господа!
Решил вот написать свой "Морской бой" и заткнулся на автоматической генерации кораблей комьютера. Просьба ко всем, кто знает, как это сделать на С++Buider, поделиться этим знанием со мной.
Заранее всем спасибо.
Grigoriy
Отправлено: 15.10.2005, 14:18


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Londinium @ 15/10/2005, 13:50)
Здравствуйте, Господа!
Решил вот написать свой "Морской бой" и заткнулся на автоматической генерации кораблей комьютера. Просьба ко всем, кто знает, как это сделать на С++Buider, поделиться этим знанием со мной.
Заранее всем спасибо.

Ну Вы и спросили.
Приложение консольное хотите создать или оконное?
Ну если оконное, тогда используем свойство формы

Form1->Canvas->...

и вперед !
Londinium
Отправлено: 15.10.2005, 19:43


Не зарегистрирован







Вы меня немного неправильно поняли или я криво сказал. Мне необходимо написать именно алгоритм генерации кораблей — т.е. корректно разместить корабли — чтобы они не соприкасались, не были под углом, чтобы их было положенное число, а нарисовать их на форме можно по-разному — это не проблема.
Grigoriy
Отправлено: 16.10.2005, 07:11


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Londinium @ 15/10/2005, 19:43)
... Мне необходимо написать именно алгоритм генерации кораблей ...

Ну так это же чисто алгоритмическая задача.
А перевести такой алгоритм на язык C++ не составит проблем.
Я в прошлый раз задавал Вам вопрос, Вы ответили мне на него, и в этот раз задаю следующий вопрос. Будем производить дискуссию smile.gif
Алгоритм генерации кораблей этот нужен для изначального создания кораблей или для определения очередного хода компьютера ?
Londinium
Отправлено: 16.10.2005, 12:48


Не зарегистрирован







Если Вы можете подсказать алгоритм для обеих случаев — буду благодарен, если для одного из них — тоже буду biggrin.gif
olegenty
Отправлено: 17.10.2005, 06:47


Ветеран

Группа: Модератор
Сообщений: 2412



я делел так (для автоматической расстановки кораблей):
1. Сканирую поле по горизонтали и по вертикали, получаю список отрезков по вертикали и горизонтали. Отфильтровываю только те, которые большей или нужной длины.
2. Рандомайзом выбираю, вертикально, или горизонтально ставить корабль
3. Рандомайзом выбираю, в какой из отрезков поместить корабль
4. Если отрезок большей, чем требуемая длина, — рандомайзом выбираю смещение, также рандомайзом выбираю край, от которого применять это смещение
5. Ставлю корабль
6. Перехожу к п.1, пока не кончатся корабли.

естественно, для гарантированной расстановки, корабли ставятся от больших к меньшим.

лучшего алгоритма, чем этот — не встречал. остальные были "от балды". этот придумал сам (с). smile.gif

Отредактировано Konstantine — 17/10/2005, 08:12
Konstantine
Отправлено: 17.10.2005, 08:13


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (olegenty @ 17/10/2005, 06:47)
...также рандомайзом выбираю край, от которого применять это смещение...

этот шаг лишний....
olegenty
Отправлено: 17.10.2005, 09:46


Ветеран

Группа: Модератор
Сообщений: 2412



хотелось большей рандомайзности — я тоже долго спорил с самим собой, нужен он, или нет. в конце концов оставил.
Konstantine
Отправлено: 17.10.2005, 17:11


Мастер участка

Группа: Модератор
Сообщений: 545



если верить теории вероятности — то ничего ты этим не выиграешь...
хотя и не проигруешь (кроме пары микросекунд smile.gif)
olegenty
Отправлено: 18.10.2005, 07:52


Ветеран

Группа: Модератор
Сообщений: 2412



Ну как тебе сказать... чисто с практической точки зрания... первым встаёт 4-хпалубный корабль. Для него доступны 10 отрезков по горизонтали и 10 по верстикали. Лафа. Да ещё всё 10 клеток в длину. И вот получил я смещение — 1. Ну и получается большущая разница в положении корабля в зависимости от того, с какого края это смещение применить.
Konstantine
Отправлено: 18.10.2005, 08:02


Мастер участка

Группа: Модератор
Сообщений: 545



да, но число-то у тебя генериться от 0 до 6... с равномерным законом распределения...
с той же вероятностью могла бы получиться и 5...
olegenty
Отправлено: 18.10.2005, 08:05


Ветеран

Группа: Модератор
Сообщений: 2412



а оставил я это именно на случай когда получится 1.
Konstantine
Отправлено: 18.10.2005, 08:18


Мастер участка

Группа: Модератор
Сообщений: 545



но всё равно это неправильно...
ты в ВУЗе учился (судя по аватарке — если это твоя фотка — то нет), так вот, там как раз нету случая... там есть вероятность и ничего более...
поверь.
и я ж говорю — грубой ошибки при этом нету — вероятность выпадения каждого события в моём случае — 1/6, а в твоём — 2/12, что одно и то же....
olegenty
Отправлено: 18.10.2005, 09:19


Ветеран

Группа: Модератор
Сообщений: 2412



фотка моя, как раз времён учёбы в вузе (через несколько дней мне будет 27).
я специально подумаю над этим вопросом и освежу в памяти алгоритм. если действительно получится 2/12-х, я соглашусь. но реализация алгоритма может несколько откорректировать "события".

заодно и подумаю, как случайность увеличить.
Dimon.Ru
Отправлено: 18.10.2005, 15:15


Станционный диспетчер

Группа: Участник
Сообщений: 92



Помню, что делал..... как точно не скажу, но поищу дома в старинных исходниках.....
olegenty
Отправлено: 19.10.2005, 06:36


Ветеран

Группа: Модератор
Сообщений: 2412



2 Konstantine — ты меня убедил.
Konstantine
Отправлено: 19.10.2005, 08:04


Мастер участка

Группа: Модератор
Сообщений: 545



Отож! smile.gif

с наступающим тебя!

Вернуться в Вопросы программирования в C++Builder