Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/30: Рейтинг темы: голосов - 30, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
1

Игра в мозаику

28.08.2013, 01:00. Показов 5764. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите реализовать вот такой вот процесс: имеется 2 картинки (image) на форме. Одна из картинок квадрат, поделенный на 4 равные части, вторая картинка квадрат равной 1 из 4х частей большого квадрата. Маленький квадрат принадлежит лишь к одной из 4х частей большого. Нужно чтобы маленькая картинка при перетаскивании сама вставала (доводилась) на нужное место в большом квадрате и не вставала (не накладывалась) на остальные 3 части квадрата. То есть чтобы маленький квадрат как мозаика не подходил к 3м из 4х частей большого квадрата, но к одной из них он подходил. Схожее действие я видел в стандартном пасьянсе на вин- там карта не вставала если не были соблюдены условия, но чуть-чуть доводилась сама если все подходило. Сделать так, чтобы картинку можно было таскать я смогу, подскажите, пожалуйста, как сделать чтобы она вставала как я описал выше?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2013, 01:00
Ответы с готовыми решениями:

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

Собрать мозаику программно
Помогите плиз, у меня есть пазл, но мне нужно чтобы при нажатии на кнопку btnDef пазл собирался сам...

Построить мозаику калейдоскоп
Построить мозаику калейдоскоп.

Построить мозаику из n правильных n угольников
Построить мозаику из правильных n угольников заданного размера, закрасив их разными цветами или...

30
angstrom
28.08.2013, 01:15 2
"Разбить" первую картинку на 4 TRect-а и воспользоваться функцией PtInRect. Данная функция вернёт True, если Rect второй картинки пересечётся с нужным Rect-ом на первой. Далее дело техники, выставить координаты второй картинки на нужное место.
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 01:33  [ТС] 3
Цитата Сообщение от angstrom Посмотреть сообщение
"Разбить" первую картинку на 4 TRect-а
Надо было сразу писать что их будет 36 и мои познания крайне малы в делфи: я не особо понял о чем вы. Если не трудно приведите пожалуйста код хоть приблизительно или пошлите куда почитать подобные коды
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
28.08.2013, 01:33 4
IntersectRect
0
angstrom
28.08.2013, 01:41 5
В качестве первой картинки можно использовать TDrawGrid, тогда ничего уже делать не нужно, только проверять какой ячейке принадлежат "таскаемые" картинки.
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 13:46  [ТС] 6
Спасибо за tdrawgrid, сейчас сижу разбираюсь с ним, а не могли бы вы указать на какой-либо пример с элементами использования этого объекта в целях моей проги?
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
28.08.2013, 13:56 7
DrawGrid & Drag&Drop
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 14:18  [ТС] 8
Цитата Сообщение от FIL Посмотреть сообщение
Спасибо за пример, но если есть еще у вас или еще у кого кто будет просматривать эту тему, пожалуйста, кидайте ссылки на них сюда, заранее спасибо и тык по "+1 спасибо" с меня
0
angstrom
28.08.2013, 14:43 9
Вот упрощённый вариант такой программы
Вложения
Тип файла: rar turgenev.rar (119.5 Кб, 294 просмотров)
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 15:06  [ТС] 10
Цитата Сообщение от angstrom Посмотреть сообщение
Вот упрощённый вариант такой программы
Спасибо, но не нашел .res файла у вас, чтобы запустить. А так по тексту очень помогло, сижу изучаю
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.08.2013, 15:13 11
Цитата Сообщение от Turgenev Посмотреть сообщение
но не нашел .res файла у вас
А зачем он тебе? Пропусти, нажатием Оk и работай.
0
angstrom
28.08.2013, 15:13 12
res-файл создастся автоматически при открытии проекта.
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 16:33  [ТС] 13
Цитата Сообщение от angstrom Посмотреть сообщение
Вот упрощённый вариант такой программы
Попробовал сам разобраться(пересоздал заново и просто копировал и вставлял из вашего проекта), возникли проблемы при запуске: пишет что не видит файл с типами (types), когда идет надпись uses types

Добавлено через 43 секунды
Цитата Сообщение от angstrom Посмотреть сообщение
res-файл создастся автоматически при открытии проекта.
тоже так думал, но ничего нет. В чем может быть проблема?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.08.2013, 16:36 14
Ну вот та же программа со всеми файлами
Вложения
Тип файла: rar Перетаскивание картинок на место.rar (327.3 Кб, 183 просмотров)
1
angstrom
28.08.2013, 16:54 15
Цитата Сообщение от Turgenev Посмотреть сообщение
не видит файл с типами (types)
Откуда он там взялся, я не вписывал. Просто удали.
Цитата Сообщение от Turgenev Посмотреть сообщение
но ничего нет
Замечал такое для Дельфи версий XE.

Хотя Puporev уже выложил с res-файлом.
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
28.08.2013, 22:16  [ТС] 16
Запустил, разбираюсь, не могли бы вы подсказать по вот этому коду. Я понял до момента цикла for, то что i j выступают в роли разделительных линий картинки 2.jpg, но как это происходит и далее не пойму. Не могли бы вы предоставить небольшие пояснения?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure TForm1.FormCreate(Sender: TObject);
var
  I, J : Integer;
  jpg : TJpegImage;
  buf : array[0..35] of TPoint;
begin
  Randomize;
  DoubleBuffered := True;
 
  jpg := TJpegImage.Create;
  jpg.LoadFromFile('2.jpg');
  bmp := TBitmap.Create;
  bmp.Assign(jpg);
 
  for I := 0 to 5 do
    for J := 0 to 5 do
    begin
      Buf[I * 6 + J].X := (J * 20) + I * 60 + 830;
      Buf[I * 6 + J].Y := (J * 80) + I * 10 + 10;
    end;
 
  for I := 0 to 5 do
    for J := 0 to 5 do
    begin
      Image[I * 6 + J] := TImage.Create(Self);
      with Image[I * 6 + J] do
      begin
        Parent      := Form1;
        Tag         := {35 -} (I * 6 + J);
        Width       := 133;
        Height      := 100;
        Left        := Buf[Random(36)].X;
        Top         := Buf[Random(36)].Y;
        OnMouseDown := ImageMouseDown;
        OnMouseMove := ImageMouseMove;
        OnMouseUp   := ImageMouseUp;
        Canvas.CopyRect(Image[I * 6 + J].Canvas.ClipRect, bmp.Canvas, Rect(J * 133, I * 100, J * 133 + 133, I * 100 + 100));
        Canvas.Brush.Style := bsClear;
        Canvas.Rectangle(Image[I * 6 + J].Canvas.ClipRect);
      end;
    end;
0
angstrom
28.08.2013, 23:30 17
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TForm1.FormCreate(Sender: TObject);
var
  I, J : Integer;
  jpg : TJpegImage;
  buf : array[0..35] of TPoint;
begin
  Randomize;
  DoubleBuffered := True;
 
  jpg := TJpegImage.Create;
  jpg.LoadFromFile('2.jpg');
  bmp := TBitmap.Create;
  bmp.Assign(jpg);
 
  // Вычисляем координаты для будущих кусочков мозаики, правее основной картинки.
  // Всего 36
  for I := 0 to 5 do
    for J := 0 to 5 do
    begin
      Buf[I * 6 + J].X := (J * 20) + I * 60 + 830;
      Buf[I * 6 + J].Y := (J * 80) + I * 10 + 10;
    end;
 
  // Всего 36
  for I := 0 to 5 do
    for J := 0 to 5 do
    begin
      Image[I * 6 + J] := TImage.Create(Self); // Создать TImage
      with Image[I * 6 + J] do
      begin
        Parent      := Form1; // Указать владельца
        Tag         := (I * 6 + J); // Номер для опознавания
        Width       := 133;
        Height      := 100;
        Left        := Buf[Random(36)].X; // Присвоить случайную координату
        Top         := Buf[Random(36)].Y; // Присвоить случайную координату
        // События обработки мышки
        OnMouseDown := ImageMouseDown;
        OnMouseMove := ImageMouseMove;
        OnMouseUp   := ImageMouseUp;
        // Копировать кусок картинки
        Canvas.CopyRect(Image[I * 6 + J].Canvas.ClipRect, bmp.Canvas, Rect(J * 133, I * 100, J * 133 + 133, I * 100 + 100));
        Canvas.Brush.Style := bsClear;
        Canvas.Rectangle(Image[I * 6 + J].Canvas.ClipRect); // Рамка - она и похожа на разделительную линию
      end;
    end;
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
29.08.2013, 14:00  [ТС] 18
angstrom, огромное спасибо, я на такое и надеяться не мог
0
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 272
31.08.2013, 14:15  [ТС] 19
в ходе переделывания программы под себя возникла необходимость в следующем условии: if 'мозаика собрана' then 'действие'. Подскажите, пожалуйста, как сформировать условие 'мозаика собрана' для оператора if?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
31.08.2013, 14:27 20
Завести глобальную переменную-счетчик.
Попала картинка на место, +1, все попали
Delphi
1
if k=n then showmessage('Мозаика собрана')
1
31.08.2013, 14:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2013, 14:27
Помогаю со студенческими работами здесь

Требуется прикрутить счётчик ходов в мозаику
Имеется готовая игра-мозайка, требуется прикрутить счётчик ходов, у меня не получается( using...

Как сделать мозаику (drag/drop) ?
Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать) и...

Как из картинки сделать мозаику из кубиков (пикселей)?
Доброго времени суток! У меня такой вопрос: "Возможно ли в delphi сделать программу, которая будет...

Построить мозаику из правильных шестиугольников заданного размера, закрасив их разными цветами
Построить мозаику из правильных шестиугольников заданного размера, закрасив их разными цветами или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru