Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 23:22   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию Delphi. Сапер. Алгоритмы.

Здравствуйте, написал свой вариант сапера: http://files.mail.ru/VUBKNS
Как то пробовал давно его сделать, но не хватило толку придумать, как открыть пустые поля рядом с пустой клеткой, по которой щелкнул. Сейчас почему то быстро придумал алгоритм, но достаточно тупой (если по коду не понятно, могу объяснить).
Хотелось бы узнать какие вообще существуют алгоритмы для этого. Слышал что можно через рекурсию, но даже не пытался, ибо не силен в ней.
Еще вопрос, почему при указании размеров окна больше чем 31 на 31 - глюк, так же глюк происходит, если количество мин очень близко к количеству клеток, но это понятно(думаю опять же из-за моего тупого алгоритма), вообщем вот все что хотел узнать.
Если будете выкладывать свои алго, то немного объясню про то, как мой вариант устроен:

Есть поле(матрица (pole[i,j])) из символов: '0' - пустая клетка, '1'..'8' - кол-во мин, '9' - мина.
Есть еще две логические матрицы (open,flags) - соответственно для статусов "открыта ли клетка" и "стоит ли флажок"
Вообщем это было моим фундаментом, весь остальной код для интерактивности и графики.
Mr_freeman вне форума Ответить с цитированием
Старый 04.07.2011, 23:26   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

это типичный обход дерева, рекурсией удобней всего, имхо
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 02:55   #3
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

А почему бы к форуму не прикрепить исходник чтобы не потерялся?
Вложения
Тип файла: rar Сапер.rar (182.0 Кб, 277 просмотров)
Alar вне форума Ответить с цитированием
Старый 05.07.2011, 14:00   #4
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

А вы не могли бы рассказать поподробнее про дерево и рекурсию на данном примере??
Кстати если кому то нужно, могу написать все комментарии к коду.
Mr_freeman вне форума Ответить с цитированием
Старый 05.07.2011, 14:50   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Ну вот у вас есть поле и клетка, с которой начинается обход.

Рекурсивная процедура будет принимать как параметр координаты клетки.
Она будет просматривать 8 соседей, и для каждого пустого соседа вызывать саму себя с координатами соседа. Типа такого:

Код:
procedure MarkOpen(x, y: Integer);
begin
   0) если [x, y] уже помечена как открытая, выходим — защита от ложных вызовов
   //
   1) помечаем [x, y] как открытую
   //
   2) в цикле просматриваем 8 соседей:
     //
     2.1) если сосед [xS, yS] свободен (мин нет) и не открыт, вызываем MarkOpen(xS, yS)
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 05.07.2011 в 14:57.
veniside вне форума Ответить с цитированием
Старый 05.07.2011, 21:50   #6
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Ммм я с рекурсией плохо знаком.. Как из нее выйти??
Mr_freeman вне форума Ответить с цитированием
Старый 06.07.2011, 08:31   #7
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

Выходом из рекурсии является первое условие:
Цитата:
0) если [x, y] уже помечена как открытая, выходим — защита от ложных вызовов
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Старый 06.07.2011, 19:39   #8
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Так я вот и не понимаю что значит "выходим"=)
Mr_freeman вне форума Ответить с цитированием
Старый 07.07.2011, 00:11   #9
Alex&(R)
Пользователь
 
Аватар для Alex&(R)
 
Регистрация: 15.05.2011
Сообщений: 14
По умолчанию

Ну, в C/C++/C#/Java и т.п это return.
В Pascal - Exit.
Просто выход из функции (процедуры). Для функции возможно также передать значение.
Alex&(R) вне форума Ответить с цитированием
Старый 05.03.2013, 13:59   #10
Liba
 
Регистрация: 28.11.2012
Сообщений: 4
Радость

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Кстати если кому то нужно, могу написать все комментарии к коду.
Можно пожалуйста если не трудно. Буду сильно благодарен!
Liba вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из раздела Комбинаторные алгоритмы и алгоритмы на гра-фах в Паскале Klik_1602 Помощь студентам 1 04.01.2011 01:18
Алгоритмы с ветвлениями.(Delphi) flyfry Помощь студентам 2 29.03.2010 14:42
Delphi 7. Линейные алгоритмы. Юрий2009 Помощь студентам 1 30.04.2009 17:51
Delphi 7. Линейные алгоритмы. Юрий2009 Помощь студентам 3 28.04.2009 18:52