Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра Сапёр =), Кое-что не получается... 
:(
    Опции темы
Coderr
Дата 2.6.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Помните в сапёре виндовом если "под" кнопкой ничего "нет", а рядом расположено множество таких же пустых мест, то все кнопы открываются(Плохо объяснил, да?). Как вот так сделать? Идей нет совсем!  smile 
P.S. Вот тут картинки, кто не понял вопроса:

ДО :  

Это сообщение отредактировал(а) Coderr - 2.6.2006, 16:49

Присоединённый файл ( Кол-во скачиваний: 56 )
Присоединённый файл  Do.jpg 38,38 Kb
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
Дата 2.6.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



И ПОСЛЕ :  

Это сообщение отредактировал(а) Coderr - 2.6.2006, 17:00

Присоединённый файл ( Кол-во скачиваний: 51 )
Присоединённый файл  posle.jpg 40,57 Kb
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
_hunter
Дата 2.6.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



делай рекурсивный обход всех соседних кнопок 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Coderr
  Дата 2.6.2006, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Цитата(_hunter @ 2.6.2006,  17:01)
делай рекурсивный обход всех соседних кнопок

А по подробнее можно про РЕКУРСИЮ?  smile  
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
D4rk
Дата 2.6.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.5.2006
Где: Самара

Репутация: нет
Всего: нет



В-общем, алгоритм - как для обхода графа в глубину... Просмотрел кнопку -> выбрал любую непросмотренную соседнюю -> просмотрел -> выбрал любую непросмотренную соседнюю и т.д. пока не наткнешься на кнопку, у которой нет непросмотренных соседних кнопок -> возвращаешься к предыдущей кнопке и т.д. пока не вернешься в начало маршрута 
PM MAIL ICQ   Вверх
ConstantinXXX
Дата 2.6.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Coderr, Исходничек можеж кинуть суда конечно если не жалко. smile  Хочу тоже попробовать игрушки делать. smile Зарание спасибо. 
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
AriX
Дата 3.6.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 16.6.2003

Репутация: 5
Всего: 19



Я по-другому делал.
Проходишься по всему полю и ищешь поля, вокруг которых ничего нет и которые в данный момент открыты. Открываешь все 8 полей вокруг каждого нулевого поля. Причем, нужен еще флаг, который будет устанавливаться в true, если хотя бы одно нулевое открытое поле найдено. В конце цикла, проверяешь, равен ли флаг true. Если да, цикл начинается сначала. Нет - выходим. Вот и все.
Вот код, который был у меня (думаю, разобраться можно):
Код

    {Если ячейка с нулем, то открываем все рядом стоящие нули}
    BtnShowAround( Pressed );
    if Btns^[ GetIndex( CurX, CurY ) ].C = '0' then
    begin
      tCurX := CurX;
      tCurY := CurY;
      repeat
        Empt := 0;
        for CurY := 1 to N do
          for CurX := 1 to M do
          begin
            if (Btns^[ GetIndex( CurX, CurY ) ].C = '0') and (Btns^[ GetIndex( CurX, CurY ) ].Status = sPressed) then
            begin
              BtnShowAround( Pressed );
              Inc( Empt, Pressed );
            end;
          end;
      until Empt = 0;
 
PM MAIL   Вверх
Coderr
Дата 4.6.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Я тут вчера ночью подумали понял, что РЕКУРСИЯ это круто! Я ей ни разу до сееле не использовал и поэтому как-то не подумал про неё! ЩА буду писать процедуру! =) 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
Дата 8.6.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



МЛИН! Рекурсия-это круто! Но если слишком большое поле, то прога подвисает... Что делать? ProcessMessages опробован, но он вопроса не решает....  smile 
 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
FRAGNATIC
Дата 9.6.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



в таких случаях код выкладывают
Надо оптимизировать просто твою процедуру и всё =) 
PM MAIL   Вверх
Addmin
Дата 9.6.2006, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 3.2.2006
Где: сослан в Сибирь

Репутация: нет
Всего: 15



Или вынести рекурсию в отдельный поток. 


--------------------
PM MAIL   Вверх
TheCetus
Дата 9.6.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: 2
Всего: 2



алгоритмы уже есть... поиши на гугле растровые методы заливки Брезенхема... 
PM MAIL   Вверх
Coderr
Дата 26.6.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



В моём сапёре я задал тип My, состоящий из панели и картинки:
Код

type
  my = record
   Panel:Tpanel;
   image:TImage;
  end;

var
  Form1: TForm1;
  mine:array[0..9,0..9] of My;

картинка располагается на панели. Во время отжатия правой кнопки нада загрузить картинку в Image, который лежит на панели, над которой произошло нажатие. Я делаю так:
Код

var b:TPanel;
    i,j:integer;
begin
 b:=Sender as TPanel;
 BitBtn1.Glyph:=image5.Picture.Bitmap;
 for i:=0 to 9 do
  for j:=0 to 9 do
   if mine[i,j].Panel=b then break;

-не сработало!  smile поставил Label на форму для проверки координат:
Код

label2.Caption:=inttostr(i)+'+'+inttostr(j);

, запустил, нажал - на лейбле либо "0+0", либо "9+9". Как сделать, чтоб всё правильно определялось? 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
fess
Дата 28.6.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: 2
Всего: 3



Не знаю, насколько это эффективно, но при малых размерах должно быть быстро...
Примерная идея/алгоритм:
1. От данной кнопки стоишь линию вверх, вниз. влево, вправо (в том смысле, что помечаешь эти поля как-либо), до тех пор, пока у тебя пусто по этой прямой....

2.Затем, пробегаешь по всем клеткам, и если встречаешь точку на этой линии (помеченную в п.1 ) то делаешь тоже, что и пункте 1.

3. Считаешь, сколько помечено точек в пункте 2, запоминешь... выполняешь его ещё раз... снова считаешь сумму точек... если совпало, то открываешь помеченные, если нет - выполняешь далее пункт 2... и так до тех пор, пока сумма не совпадёт... 
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Coderr
Дата 29.6.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Нет! Нада найти координату панели, которой принадлежит имейдж, по которому произошло нажатие! 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.