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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2011, 23:20   #1
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию игра - собери картинку

разбил картинку на 9 фрагментов и случайным образом их расположил(скрин). написал функции,которые возвращают строку--
8 5 7 9 0 8 7 3 0.
первая цифра - позиция свободного квадрата,в который можно перемещать фрагменты (они идут в последовательности 1 2 3
4 5 6
7 8 9)

2,3,4,5 цифры - позиции тех фрагментов которые можно перемещать (5 цифра не ноль только,если первая цифра =5)
6,7,8,9 цифры - реальные номера фрагментов(имаги от 1 до 9)
переменная take.number это позиция свободного квадрата(т.е. то первая цифра из той строки)
прикрепляю exe, и картинку,на которой можно попробовать
потаскайте там картинки,потому что не всегда не работает.попробуйте переместить картинки в свободный квадрат и вернуть ее на место,не получается. не понимаю почему
и вот код отпускания кнопки с фрагмента
posi - хранит топ и лефт картинки,чтоьы она вставала на прежнее место
Код:
 
procedure TForm2.Image7MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
   var i:integer;
begin
press[7]:=false;
case take.number of
1:
  begin
    if (((sender as timage).Left in [3..176])and((sender as timage).Top in [3..176])) then
      begin
        (sender as timage).Left:=8;
        (sender as timage).Top:=8;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
2:
  begin
    if (((sender as timage).Left>179)and((sender as timage).Left<352)and((sender as timage).Top>3)and((sender as timage).Top<176)) then
      begin
        (sender as timage).Left:=184;
        (sender as timage).Top:=8;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
3:
  begin
    if (((sender as timage).Left>355)and((sender as timage).Left<528)and((sender as timage).Top>3)and((sender as timage).Top<176)) then
      begin
        (sender as timage).Left:=360;
        (sender as timage).Top:=8;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
4:
  begin
    if (((sender as timage).Left>3)and((sender as timage).Left<176)and((sender as timage).Top>179)and((sender as timage).Top<352)) then
      begin
        (sender as timage).Left:=8;
        (sender as timage).Top:=184;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
5:
  begin
    if (((sender as timage).Left>179)and((sender as timage).Left<352)and((sender as timage).Top>179)and((sender as timage).Top<352)) then
      begin
        (sender as timage).Left:=184;
        (sender as timage).Top:=184;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
6:
  begin
    if (((sender as timage).Left>355)and((sender as timage).Left<528)and((sender as timage).Top>179)and((sender as timage).Left<352)) then
      begin
        (sender as timage).Left:=360;
        (sender as timage).Top:=184;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
7:
  begin
    if (((sender as timage).Left in [3..176])and((sender as timage).Top>355)and((sender as timage).Top<528)) then
      begin
        (sender as timage).Left:=8;
        (sender as timage).Top:=360;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
8:
  begin
    if (((sender as timage).Left>179)and((sender as timage).Left<352)and((sender as timage).Top>355)and((sender as timage).Top<528)) then
      begin
        (sender as timage).Left:=184;
        (sender as timage).Top:=360;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
9:
  begin
    if (((sender as timage).Left>355)and((sender as timage).left<528)and((sender as timage).Top>355)and((sender as timage).Top<528)) then
      begin
        (sender as timage).Left:=360;
        (sender as timage).Top:=360;
      end
          else
            begin
              (sender as timage).Left:=posi.left;
              (sender as timage).Top:=posi.top;
            end;
  end;
 
end;
 
for i:=1 to 4 do
  begin
    if realnumb[i]<>0 then
      TImage(form2.FindComponent('Image'+inttostr(realnumb[i]))).Enabled:=false;
  end;
timer1.Enabled:=true;
 
 
 
end;
 
 	
    		  spydark91
Вложения
Тип файла: rar вопрос.rar (934.6 Кб, 27 просмотров)
spydark91 вне форума Ответить с цитированием
Старый 03.08.2011, 01:02   #2
Leo08
Delphi master
Пользователь
 
Аватар для Leo08
 
Регистрация: 28.05.2011
Сообщений: 96
По умолчанию

Я так понимаю Вы делаете что-то типа игры "Пятнашки". Вот Вам три версии, раньше их писал. Там пример на кнопках, но можно переделать и под картинки.
Вложения
Тип файла: zip myexample.zip (706.2 Кб, 34 просмотров)
БЯЯЯГГАААААА
Leo08 вне форума Ответить с цитированием
Старый 03.08.2011, 14:24   #3
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

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

так как строка возвращает правелные цифры,то я не понимаю почему некоторые имаги обрабатываются правельно,другие нет
spydark91 вне форума Ответить с цитированием
Старый 03.08.2011, 14:32   #4
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

процедура,которая делает доступной соседние от свободного места имаги
Код:
procedure TForm2.enabl;
var
takestring:string;
long,i:integer;
begin
take:=form2.catchfree;{процедура возвращает позицию свободного квадрата(от 1 до 9,первая цифра в строке)}
takestring:=form2.findfriend(take.number);{возвращает строку из позиция-соседей свободной имаги}
long:=length(takestring);
for i:=1 to long do
begin
  coun[i]:=strtoint(takestring[i]);
  if coun[i]<>0 then
    begin
      realnumb[i]:=form2.postonumb(coun[i]);{процедура превращает позицию соседей имаги в реальные имена имаг,например позиция=2,а имя image7}
      TImage(form2.FindComponent('Image'+inttostr(form2.postonumb(coun[i])))).Enabled:=true;{делаем их доступными}
    end;
end;
memo1.Lines.Add(inttostr(take.number)+'  '+inttostr(coun[1])+'  '+inttostr(coun[2])+'  '+inttostr(coun[3])+'  '+inttostr(coun[4])+'  '+inttostr(realnumb[1])+'  '+inttostr(realnumb[2])+'  '+inttostr(realnumb[3])+'  '+inttostr(realnumb[4]));





end;
spydark91 вне форума Ответить с цитированием
Старый 06.08.2011, 01:16   #5
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

никто не поможет..?
spydark91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не показывает картинку Illusia HTML и CSS 2 10.07.2011 21:10
Уменьшить картинку Krasi PHP 10 10.08.2010 19:53
Как получить картинку при наведении на другую картинку (ссылку) seeker1 JavaScript, Ajax 8 04.07.2010 19:42
Уменьшить картинку fezilk24 Общие вопросы Delphi 2 12.06.2010 16:45
игра пятнашки и "собери картинку" tatiana74 Помощь студентам 5 22.02.2010 14:07