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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 13:36   #1
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию Улучшение процедуры перемешивания

И снова я. Помогите улучшить процедуру перемешивание фрагментов картинки.
Код:
procedure Mixer;
var
    x1,y1: integer;
    x2,y2: integer;
    r: integer;
    i: integer;
begin
    x1:=5;
    y1:=5;
    randomize;
    for i:= 1 to 250 do
    begin
        repeat
            x2:=x1;
            y2:=y1;
            r:=random(5)+1;
            case r of
                1: dec(x2);
                2: inc(x2);
                3: dec(y2);
                4: inc(y2);
            end;
        until (x2>=1) and (x2<=5) and (y2>=1) and (y2<=5);
        Kletka[y1,x1] := Kletka[y2,x2];
        Kletka[y2,x2] := 0;
        x1:=x2;
        y1:=y2;
    end;
    ex:= x1;
    ey:= y1;
end;
Просто часто бывает, что большой кусок изображения остается не тронутым.

Последний раз редактировалось ZvEr_HaCkEr; 03.05.2011 в 14:11.
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 03.05.2011, 14:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) небольшой косяк тут:
d:=random(5)+1;
в результате d получается от 1 до 5 (включительно): [1..5]
а дальше строчки в case реагируют только на d от 1 до 4-х...

2) если я правильно понял идею, то я бы ещё в цикле получения перемещения (в проверку условия) добавил проверку на то, что перемещение не равно обратному на предыдущем шаге (ну, если сдвинули влево, чтобы следующим ходом не сдвинули обратно, вправо - т.е. не вернули на исходное место).

3) более конкрентно можно говорить, если Вы выложите небольшой работающий тестовый проект, где видно, что кусок изображения остаётся нетронутым...
Потому как всё мною сказанное выше - это плод моих умозрительных предположений... Проверить сказанное я не могу (точнее лень реализовыывать проект с нуля! Тем более ,что у Вас он уже есть! )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2011, 14:16   #3
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Вот,потыкайте несколько раз новая игра, и сами все увидите.
Вложения
Тип файла: rar Новая папка (3).rar (727.2 Кб, 15 просмотров)
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 03.05.2011, 14:28   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, потыкал...
и не подверждаю!
из (примерно) 10 нажатий - ~5-6 - абсолютно перемешаная картинка.
пара раз - по два-три квадратика сопадают, образуя картинку.
и только один раз сопвално две большие группы (одна примерно из 6 квадратов, другая - из 3-4x)

вот визуализация работы Вашего алгоритма на форме (см. аттач).
Mixer1.rar

а способ улучшить - если стоит задача перемешать так, чтобы НИ ОДНОЙ группы, более чем из одного квадрата не совпало - тогда надо повторять процесс перемешивания до тех пор, пока функция проверки, что квадраты совпали не вернёт false... (только надо будет эту функцию реализовать...)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2011, 14:34   #5
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Спасибо, буду разбираться.
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 03.05.2011, 14:42   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Матан чистой воды, "чётность числа инверсий". Тыкаем фишки рандомно, считаем это число. Чётное - ок, можно собрать обратно, нечётное - нельзя.

http://ru.wikipedia.org/wiki/Пятнашки
http://slovari.yandex.ru/~книги/БСЭ/...ия%20и%20игры/
http://www.gamedev.ru/flame/forum/?id=12159#m8
пыщь
JTG вне форума Ответить с цитированием
Старый 03.05.2011, 14:52   #7
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Матан чистой воды, "чётность числа инверсий". Тыкаем фишки рандомно, считаем это число. Чётное - ок, можно собрать обратно, нечётное - нельзя.
?
Код:
fishki : array[1..H, 1..W] of byte =
(( 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, 0));
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 03.05.2011, 15:20   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вот как-то так. И это, лучше всегда нумеруй массивы с 0

ЗЫ: реализацию подсчёта числа инверсий с геймдева не проверял
Вложения
Тип файла: rar Генератор пятнашек.rar (200.0 Кб, 23 просмотров)
пыщь

Последний раз редактировалось JTG; 03.05.2011 в 15:23.
JTG вне форума Ответить с цитированием
Старый 03.05.2011, 15:43   #9
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Спасибо за генератор. У меня получилось так:
Код:
function Finish: boolean;
var
    row,col: integer;
    i: integer;
begin
    row :=1; col :=1;
    Finish := True;
    for i:=1 to 35 do
    begin
       if fishki[row,col] <> i then
       begin
            Finish:= False;
            break;
       end;
       if col < 6
          then inc(col)
       else begin
          col :=1;
          inc(row);
       end;
    end;
end;
ZvEr_HaCkEr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Улучшение скрипта Eldrich JavaScript, Ajax 4 14.02.2011 17:06
Улучшение кода Rusl92 Помощь студентам 4 23.09.2010 19:15
Delphi7 Шифр перемешивания. Реализация randomiaiz Помощь студентам 0 13.06.2010 19:49
Хеш-таблица. Непонятно с решением коллизии методом перемешивания внутренними цепочками Познающий Помощь студентам 9 05.12.2009 02:48
Алгоритм "перемешивания" массива в Delphi MusicMan Помощь студентам 4 26.04.2008 21:06