powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ruby to Delphi
10 сообщений из 10, страница 1 из 1
Ruby to Delphi
    #40047029
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Абсолютно не знаком с Ruby, реально ли сконвертировать этот небольшой код на Delphi (консольное приложение)?
Код: ruby
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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
# https://gist.github.com/jamis/856138
# An implementation of a "weave" maze generator. Weave mazes are those
# with passages that pass both over and under other passages. The
# technique used in this program was described to me by Robin Houston,
# and works by first decorating the blank grid with the over/under
# crossings, and then using Kruskal's algorithm to fill out the rest
# of the grid. (Kruskal's is very well-suited to this approach, since
# it treats the cells as separate sets and joins them together.)
# --------------------------------------------------------------------
# NOTE: the display routine used in this script requires a terminal
# that supports ANSI escape sequences. Windows users, sorry. :(
# --------------------------------------------------------------------

# --------------------------------------------------------------------
# 1. Allow the maze to be customized via command-line parameters
# --------------------------------------------------------------------

width   = (ARGV[0] || 10).to_i
height  = (ARGV[1] || width).to_i
density = (ARGV[2] || 50).to_i
seed    = (ARGV[3] || rand(0xFFFF_FFFF)).to_i
delay   = (ARGV[4] || 0.01).to_f

srand(seed)

# --------------------------------------------------------------------
# 2. Set up constants to aid with describing the passage directions
# --------------------------------------------------------------------

N, S, E, W, U = 0x1, 0x2, 0x4, 0x8, 0x10
DX            = { E => 1, W => -1, N =>  0, S => 0 }
DY            = { E => 0, W =>  0, N => -1, S => 1 }
OPPOSITE      = { E => W, W =>  E, N =>  S, S => N }

# --------------------------------------------------------------------
# 3. Data structures and methods to assist the algorithm
# --------------------------------------------------------------------

EW, NS, SE, SW, NE, NW = [0x80, 0x82, 0x8C, 0x90, 0x94, 0x98].map { |v| "\xE2\x94#{v.chr}" }
NSE, NSW, EWS, EWN     = [0x9C, 0xA4, 0xAC, 0xB4].map { |v| "\xE2\x94#{v.chr}" }

TILES = {
  0       => ["\e[47m   \e[m", "\e[47m   \e[m"],
  N       => ["#{NS} #{NS}", "#{NE}#{EW}#{NW}"],
  S       => ["#{SE}#{EW}#{SW}", "#{NS} #{NS}"],
  E       => ["#{SE}#{EW}#{EW}", "#{NE}#{EW}#{EW}"],
  W       => ["#{EW}#{EW}#{SW}", "#{EW}#{EW}#{NW}"],
  N|S     => ["#{NS} #{NS}", "#{NS} #{NS}"],
  N|W     => ["#{NW} #{NS}", "#{EW}#{EW}#{NW}"],
  N|E     => ["#{NS} #{NE}", "#{NE}#{EW}#{EW}"],
  S|W     => ["#{EW}#{EW}#{SW}", "#{SW} #{NS}"],
  S|E     => ["#{SE}#{EW}#{EW}", "#{NS} #{SE}"],
  E|W     => ["#{EW}#{EW}#{EW}", "#{EW}#{EW}#{EW}"],
  N|S|E   => ["#{NS} #{NE}", "#{NS} #{SE}"],
  N|S|W   => ["#{NW} #{NS}", "#{SW} #{NS}"],
  E|W|N   => ["#{NW} #{NE}", "#{EW}#{EW}#{EW}"],
  E|W|S   => ["#{EW}#{EW}#{EW}", "#{SW} #{SE}"],
  N|S|E|W => ["#{NW} #{NE}", "#{SW} #{SE}"],
  N|S|U   => ["#{NSW} #{NSE}", "#{NSW} #{NSE}"],
  E|W|U   => ["#{EWN}#{EW}#{EWN}", "#{EWS}#{EW}#{EWS}"]
}

def display_maze(grid)
  print "\e[H" # move to upper-left
  grid.each do |row|
    2.times do |i|
      row.each { |cell| print TILES[cell][i] }
      puts
    end
  end
end

class Tree
  attr_accessor :parent

  def initialize
    @parent = nil
  end

  def root
    @parent ? @parent.root : self
  end

  def connected?(tree)
    root == tree.root
  end

  def connect(tree)
    tree.root.parent = self
  end
end

grid = Array.new(height) { Array.new(width, 0) }
sets = Array.new(height) { Array.new(width) { Tree.new } }

# build the list of edges
edges = []
height.times do |y|
  width.times do |x|
    edges << [x, y, N] if y > 0
    edges << [x, y, W] if x > 0
  end
end

edges = edges.sort_by{rand}

# --------------------------------------------------------------------
# 4. Build the over/under locations
# --------------------------------------------------------------------

print "\e[2J" # clear the screen

1.upto(height-2) do |cy|
  1.upto(width-2) do |cx|
    next unless rand(100) < density

    nx, ny = cx, cy-1
    wx, wy = cx-1, cy
    ex, ey = cx+1, cy
    sx, sy = cx, cy+1

    next if grid[cy][cx] != 0 ||
      sets[ny][nx].connected?(sets[sy][sx]) ||
      sets[ey][ex].connected?(sets[wy][wx])

    sets[ny][nx].connect(sets[sy][sx])
    sets[ey][ex].connect(sets[wy][wx])

    if rand(2) == 0
      grid[cy][cx] = E|W|U
    else
      grid[cy][cx] = N|S|U
    end

    grid[ny][nx] |= S
    grid[wy][wx] |= E
    grid[ey][ex] |= W
    grid[sy][sx] |= N

    edges.delete_if do |x, y, dir|
      (x == cx && y == cy) ||
      (x == ex && y == ey && dir == W) ||
      (x == sx && y == sy && dir == N)
    end

    display_maze(grid)
    sleep(delay)
  end
end

puts
puts "--- PRESS ENTER TO BEGIN ---"
STDIN.gets

print "\e[2J" # clear the screen

# --------------------------------------------------------------------
# 5. Kruskal's algorithm
# --------------------------------------------------------------------

until edges.empty?
  x, y, direction = edges.pop
  nx, ny = x + DX[direction], y + DY[direction]

  set1, set2 = sets[y][x], sets[ny][nx]

  unless set1.connected?(set2)
    display_maze(grid)
    sleep(delay)

    set1.connect(set2)
    grid[y][x] |= direction
    grid[ny][nx] |= OPPOSITE[direction]
  end
end

display_maze(grid)

# --------------------------------------------------------------------
# 6. Show the parameters used to build this maze, for repeatability
# --------------------------------------------------------------------

puts "#{$0} #{width} #{height} #{density} #{seed}"



Может кто помочь (хотя бы частично)?
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047322
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047349
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

Спасибо, поиском умею пользоваться ;)
Но меня интересует конкретная реализация, что в спойлере выше.

Постепенно приходит понимание (бегло читая описания языка), но пока остановился на
Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Tree
  attr_accessor :parent

  def initialize
    @parent = nil
  end

  def root
    @parent ? @parent.root : self
  end

  def connected?(tree)
    root == tree.root
  end

  def connect(tree)
    tree.root.parent = self
  end
end


Что это за конструкция и как ее транслировать на Delphi, может кто подсказать?
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047362
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing

Что это за конструкция и как ее транслировать на Delphi, может кто подсказать?

Ну давай попробуем

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
type
  TTree = class
  private
    FParent: TTree;
  public
    function Root: TTree;
    function Connected(ATree: TTree): boolean;
  public
    property Parent: TTree read FParent write FParent;
  end;

function TTree.Root;
begin
  if Assigned(Parent) then Result := Parent.Root else Result := Self;
end;

function TTree.Connected;
begin
  Result := Assigned(ATree) and (Self.Root = ATree.Root);
end;



P.S. Этот Ruby вижу первый раз в жизни
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047425
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer,
Хм, спасибо :)
Только тогда еще, видимо,
Код: ruby
1.
2.
3.
  def connect(tree)
    tree.root.parent = self
  end


добавить как
Код: pascal
1.
2.
3.
4.
procedure TTree.Connect(ATree: TTree);
begin
  ATree.Root.Parent := Self;
end;


Остается еще
Код: ruby
1.
  attr_accessor :parent

- его-то куда и как?
И добавить конструктор, в котором cделать Parent := nil , или это уже лишнее?
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047440
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Только тогда еще, видимо

Нет, не видимо.
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047451
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer,

Но почему? Ведь так игнорируется метод connect(tree) , которые далее используется в коде.
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047526
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer,

Спасибо за подсказку с классом, все получилось сконвертировать.
Но метод TTree.Connect(ATree: TTree); все равно добавил, без него никак :)

...
Рейтинг: 0 / 0
Ruby to Delphi
    #40047573
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Но почему? Ведь так игнорируется метод connect(tree) , которые далее используется в коде.

Ну так свойство Parent не просто так опубликовано.
...
Рейтинг: 0 / 0
Ruby to Delphi
    #40048305
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

Ну так свойство Parent не просто так опубликовано.

Ага, понял. Вместо set1.Connect(set2) просто пишем set2.Root.Parent := set1 .
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ruby to Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]