![]() |
|
Модераторы: Rickert |
![]()
|
|
| OXOTHUK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
Есть игра в которой игроки по-очереди ставят точки на клеточном поле на перекрестии линий. Нужно окружить как можно больше вражеских точек. Как только ты окружаешь точку, ты через свои точки(которые окружают) провожишь линию(даже если внутри есть много точек и даже если они тоже так сказать "укреплены"). "Укреплены" значит, что враг не может проводить линию через твою линию.
Я решил сделать такаю игру на компе. Я написал структуру, в которой есть: 1) координаты (x, y) 2) кем установлена точка 3) координаты окружающих 8-ми точек (xU, yU, xD, yD, ...) 4) 8 переменных принадлежности окружающих точек какому-либо игроку, т.е. кем установлена, к примеру, точка сверху. 5) 8 булевских переменных: соеденены ли точки?! У меня в программе все переменный для каждой точки уже вычисляются, кроме последних 8ми. Сколько не мучил, не знаю как сделать. Какой алгоритм можете посоветовать? P.S. И как можно узнать какие точки попали в круг. P.P.S. Я пишу на Си++ и точки у меня представлены 2-мерным массивом размеров 29 на 29. |
|||
|
||||
| Fighter |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
Ты VB знаешь, я кстати точно такую же игру пишу. Я уже написал проставление точек и т.д. и т.п., и вот теперь надо написать логику, если переключишься на VB я могу тебе исходники переслать и будет вместе работать над игрой, возможно вдвоем что-нить и получится.
|
|||
|
||||
| Fighter |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
а кто-нибудь еще не хотел бы заняться этой проблемой...
|
|||
|
||||
| OXOTHUK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
VB я не знаю, но логикой программы можно обмениваться.
Я вообще смотрю: самое сложное - это представить кольцо(визуально(на глаз)кажется ерудна, а как массив ... По-началу хотел методом перебора, но тут не знаешь с какой точки начать, как не повторяться, а об счёте кол-ва точек внутри и ИИ речи идти не может. |
|||
|
||||
| Fighter |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
Я считаю что надо так. Сначала надо проверить первая это точка или нет. Если первая то общет вообще не нужен. Если это не первая точка то обсчет надо начинать с последней поставленной точки, и надо считать так чтобы он проходил через все точки. Если комп прошел через все точки и вернулся в первоначальную, то тогда все замкнуто точками, если комп не вернулся то тогда ничего точками не замкнуто. |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
Я бы мог подключиться. Пишу на С/С++. Для графики использую SDL. Смогу,может, что поделать после 25 декабря.
|
|||
|
||||
| OXOTHUK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
А если несколько колец? И ведь кольца не может быть если внутри нет хотя бы 1ной вражеской точки. |
|||
|
||||
| Fighter |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
Впринципе правильно, значит нужен еще алгоритм нахождения находится ли в данном так сказать полигоне вражеская точка либо надо проверять точки противника (ну например, если ходится игрок 1, то по жесткой логике нужно проверять все точки игрока 2). Добавлено @ 16:49
Я поясни (расшифруй) пожалуйста, что такое SDL, и в чем ты пишешь на C++ (Borland Builder or MSVC)? |
||||
|
|||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
SDL - графическая библиотека(со своим API). Там есть функции для загрузки картинок(bmp, jpeg, png и др.), просто рисования, воспроизведения звуков, для работы со временем. На изучение SDL не требуется много времени(SDL совместима и с Java, Delphi - если не ошибаюсь).
Я работаю с MinGW(портирован с gcc) в Windows, в Linux с gcc. Про SDL На русском: -хороший туториал поищи на plg.lrn.ru. Адрес более старого(несильно отличается http://pmg.org.ru/galaxy2d/SDLtutorial.zip -документация http://plg.lrn.ru/temp/html_ru/ Сайт SDL - www.libsdl.org |
|||
|
||||
| OXOTHUK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
Можно через массивы сделать (легко) как проверить на окружение только 1-ой точки. А там как-нибудь дальше вытечет.
Алгоритм: Массив строчек (пусть dots) размером (пусть) 29 на 29 - dots[29][29] (так на Си, не знаю как VB). Например: если точка dots[2][2] - Player 2 и dots[1][2] - Player 1 и dots[3][2] - Player 1 и dots[2][1] - Player 1 и dots[2][3] - Player 1, то 4 точки игрока 1 в кольцо: 010 121 010. Тут надо подумать как несколько точек окружать... |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
По-моему нужно что-то другое, так будет сложно делать большие окружения. После 26-го присоединюсь.
|
|||
|
||||
| Fighter |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
Это все понятно. Я думаю, что может быть надо попробовать найти какую нибудь закономерность и затем свести все это к перемножению матриц? |
|||
|
||||
| OXOTHUK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
А как их меремножать? Я мало с матрицами работал. |
|||
|
||||
| segmentation_fault |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 14.2.2005 Где: в интернете Репутация: нет Всего: 1 |
Помню такую игру, в детстве играл.
Мне эта проблема напоминает нахождение циклов в ненаправленном циклическом графе. В данном случае вершины - это точки (вашего цвета), и ребро существует между двумя вершинами только если они находятся на расстоянии в одну клетку друг от друга, т.е. если в случае цикла между ними можно нарисовать линию. Собственно алгоритм нахождения циклов я не знаю, но уверен что поиск на гугле даст искомый результат. Тут только не учитывается, если ваши точки окружают хотя бы одну точку противника. |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
Немного подумал и понял чуть-чуть логику окружения. Геометрическая фигура. Противник ставит точку(первый). Комп должен ставить точки отличающиеся на одну координату, когда противник ставит рядом точку, то изменяются и увеличиваются координаты будущих точек.
|
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |