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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2012, 18:47   #1
Christor
Пользователь
 
Регистрация: 11.05.2012
Сообщений: 15
Стрелка Пребразование алгоритма построения лабиринта

На форуме нашёл алгоритм построения лабиринта
Код:
uses Crt,Graph;
const
  szw=30;
  szh=30;
  cellsz=10;
type
  point=record
    x,y: integer;
  end;
var
  maze: array [0..szw-1,0..szh-1] of integer;
  todo: array [0..szw*szh-1] of point;
  todonum: integer;
  gd,gm:integer;
const
  dx: array [0..3] of integer=(0, 0, -1, 1);
  dy: array [0..3] of integer=(-1, 1, 0, 0);
procedure init;
var
  x,y,n,d: integer;
begin
  for x:=0 to szw-1 do
  for y:=0 to szh-1 do
    if (x=0) or (x=szw-1) or (y=0) or (y=szh-1) then
      maze[x,y]:=32
    else maze[x,y]:=63;
  Randomize;
  x := Random(szw-2)+1;
  y := Random(szh-2)+1;
  maze[x,y]:= maze[x,y] and not 48;
  for d:=0 to 3 do
    if (maze[x + dx[d], y + dy[d]] and 16) <> 0 then
    begin
      todo[todonum].x:=x + dx[d];
      todo[todonum].y:=y + dy[d];
      Inc(todonum);
      maze[x + dx[d], y + dy[d]] := maze[x + dx[d], y + dy[d]] and not 16;
    end;
   while todonum > 0 do
   begin
       n:= Random(todonum);
       x:= todo[n].x;
       y:= todo[n].y;
       Dec(todonum);
       todo[n]:= todo[todonum];
       repeat
           d:=Random (4);
       until not ((maze[x + dx[d],y + dy[d]] and 32) <> 0);
       maze[x,y] := maze[x,y] and not ((1 shl d) or 32);
       maze[x + dx[d], y + dy[d]] := maze[x + dx[d],y + dy[d]] and not (1 shl (d xor 1));
       for d:=0 to 3 do
           if (maze[x + dx[d], y + dy[d]] and 16) <> 0 then
           begin
             todo[todonum].x := x + dx[d];
             todo[todonum].y := y + dy[d];
             Inc(todonum);
             maze[x + dx[d], y + dy[d]] := maze[x + dx[d], y + dy[d]] and not 16;
           end;
   end;
   maze[1,1] := maze[1,1] and not 1;
   maze[szw-2,szh-2] := maze[szw-2,szh-2] and not 2;
end;
procedure Draw;
var x,y: integer;
begin
  for x:=1 to szw-2 do
  for y:=1 to szh-2 do
  begin
   if ((maze[x,y] and 1) <> 0) then
       Line(x * cellsz, y * cellsz, x * cellsz + cellsz, y * cellsz);
   if ((maze[x,y] and 2) <> 0) then
       Line(x * cellsz, y * cellsz + cellsz, x * cellsz + cellsz, y * cellsz + cellsz);
   if ((maze[x,y] and 4) <> 0) then
       Line(x * cellsz, y * cellsz, x * cellsz, y * cellsz + cellsz);
   if ((maze[x,y] and 8) <> 0) then
       Line(x * cellsz + cellsz, y * cellsz, x * cellsz + cellsz, y * cellsz + cellsz);
  end;
end;
begin
  gd:=detect;
  initgraph(gd,gm,'C:\tp7\bgi');
  init;
  draw;
  readln;
end.
Алгоритм хорош. Лабиринт получается что нужно! Но беда в том, что я не могу понять принцип, т.к. не силён в битовых операциях(ещё не преподавали). Хотел сам разобраться. Что-то понял (действие процедуры Draw), но этого не хватает. Понять принцип нужно срочно. Можно ли преобразовать код так, чтоб не было действий с битами? Или, если возможно, разжуйте этот код(действия над битами знаю на базовом уровне). Буду очень благодарен!
Christor вне форума Ответить с цитированием
Старый 13.06.2012, 14:46   #2
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Christor Посмотреть сообщение
На форуме нашёл алгоритм построения лабиринта
Код:
uses Crt,Graph;
const
  szw=30;
  szh=30;
  cellsz=10;
type
  point=record
    x,y: integer;
  end;
var
  maze: array [0..szw-1,0..szh-1] of integer;
  todo: array [0..szw*szh-1] of point;
  todonum: integer;
  gd,gm:integer;
const
  dx: array [0..3] of integer=(0, 0, -1, 1);
  dy: array [0..3] of integer=(-1, 1, 0, 0);
procedure init;
var
  x,y,n,d: integer;
begin
  for x:=0 to szw-1 do
  for y:=0 to szh-1 do
    if (x=0) or (x=szw-1) or (y=0) or (y=szh-1) then
      maze[x,y]:=32
    else maze[x,y]:=63;
  Randomize;
  x := Random(szw-2)+1;
  y := Random(szh-2)+1;
  maze[x,y]:= maze[x,y] and not 48;
  for d:=0 to 3 do
    if (maze[x + dx[d], y + dy[d]] and 16) <> 0 then
    begin
      todo[todonum].x:=x + dx[d];
      todo[todonum].y:=y + dy[d];
      Inc(todonum);
      maze[x + dx[d], y + dy[d]] := maze[x + dx[d], y + dy[d]] and not 16;
    end;
   while todonum > 0 do
   begin
       n:= Random(todonum);
       x:= todo[n].x;
       y:= todo[n].y;
       Dec(todonum);
       todo[n]:= todo[todonum];
       repeat
           d:=Random (4);
       until not ((maze[x + dx[d],y + dy[d]] and 32) <> 0);
       maze[x,y] := maze[x,y] and not ((1 shl d) or 32);
       maze[x + dx[d], y + dy[d]] := maze[x + dx[d],y + dy[d]] and not (1 shl (d xor 1));
       for d:=0 to 3 do
           if (maze[x + dx[d], y + dy[d]] and 16) <> 0 then
           begin
             todo[todonum].x := x + dx[d];
             todo[todonum].y := y + dy[d];
             Inc(todonum);
             maze[x + dx[d], y + dy[d]] := maze[x + dx[d], y + dy[d]] and not 16;
           end;
   end;
   maze[1,1] := maze[1,1] and not 1;
   maze[szw-2,szh-2] := maze[szw-2,szh-2] and not 2;
end;
procedure Draw;
var x,y: integer;
begin
  for x:=1 to szw-2 do
  for y:=1 to szh-2 do
  begin
   if ((maze[x,y] and 1) <> 0) then
       Line(x * cellsz, y * cellsz, x * cellsz + cellsz, y * cellsz);
   if ((maze[x,y] and 2) <> 0) then
       Line(x * cellsz, y * cellsz + cellsz, x * cellsz + cellsz, y * cellsz + cellsz);
   if ((maze[x,y] and 4) <> 0) then
       Line(x * cellsz, y * cellsz, x * cellsz, y * cellsz + cellsz);
   if ((maze[x,y] and 8) <> 0) then
       Line(x * cellsz + cellsz, y * cellsz, x * cellsz + cellsz, y * cellsz + cellsz);
  end;
end;
begin
  gd:=detect;
  initgraph(gd,gm,'C:\tp7\bgi');
  init;
  draw;
  readln;
end.
Алгоритм хорош. Лабиринт получается что нужно! Но беда в том, что я не могу понять принцип, т.к. не силён в битовых операциях(ещё не преподавали). Хотел сам разобраться. Что-то понял (действие процедуры Draw), но этого не хватает. Понять принцип нужно срочно. Можно ли преобразовать код так, чтоб не было действий с битами? Или, если возможно, разжуйте этот код(действия над битами знаю на базовом уровне). Буду очень благодарен!


вот пример проги на дельфах
http://netsoftware.ucoz.ru/news/post.../2012-05-16-66

там по книге Маозгового сделан там же найдешь ссылку на книгу


узнаю вот это
Код:
dx: array [0..3] of integer=(0, 0, -1, 1);
  dy: array [0..3] of integer=(-1, 1, 0, 0);
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось denisbrain; 13.06.2012 в 14:58.
denisbrain вне форума Ответить с цитированием
Старый 13.06.2012, 20:23   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

На каждую ячейку приходится по 6 признаков: 4 - рисовать ли стороны ячейки и два вспомогательных - используются в вычислениях (как именно - не разбирался).
Соответственно, вместо них можно использовать 6 булевых массивов. Ну либо массив структур с 6-ю булевыми полями.
s-andriano вне форума Ответить с цитированием
Старый 04.02.2013, 19:39   #4
Penetration
Новичок
Джуниор
 
Регистрация: 21.09.2012
Сообщений: 1
По умолчанию HnK

Хм. Если что, хоть тема стара, но вот еще алгоритм. Называется Hunt And Kill и довольно прост. Исходник щас не могу скинуть, но если надо... В целом должно и названия хватить - интернет поможет) Я за два дня разобрался полностью, пофиксив баги. Ну, первый разобранный мною алгоритм для лабиринта ...
Penetration вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа для схематичного построения робота(механизма) различной сложности (Элементы для построения желательно поместить в БД). brutalis Помощь студентам 1 16.05.2012 20:30
Компонента для лабиринта Китос Компоненты Delphi 5 02.01.2012 19:02
Поиск выхода из лабиринта Foxtrot_1 Помощь студентам 1 20.09.2010 13:16
Пребразование строки в дату Superlotles Помощь студентам 2 21.11.2009 15:20
Выход из лабиринта karamelka87 Общие вопросы C/C++ 9 27.01.2009 23:49