unknown
13 years ago
1 changed files with 168 additions and 0 deletions
@ -0,0 +1,168 @@ |
|||||
|
-- will make a pythagoras tree-like thing with a given depth (depth 0 are leaves) |
||||
|
-- this is a costy operation and takes lots of blocks (you can refill during the build) |
||||
|
-- we will always face to the tree and not move forward |
||||
|
-- orientation will define left/right/up/down |
||||
|
|
||||
|
-- basic movement (orientation-less) |
||||
|
local function bup() |
||||
|
while not turtle.up() do turtle.digUp() end |
||||
|
end |
||||
|
|
||||
|
local function bdown() |
||||
|
while not turtle.down() do turtle.digDown() end |
||||
|
end |
||||
|
|
||||
|
local function bforward() |
||||
|
while not turtle.forward() do turtle.dig() end |
||||
|
end |
||||
|
|
||||
|
local function bleft() |
||||
|
turtle.turnLeft() |
||||
|
bforward() |
||||
|
turtle.turnRight() |
||||
|
end |
||||
|
|
||||
|
local function bright() |
||||
|
turtle.turnRight() |
||||
|
bforward() |
||||
|
turtle.turnLeft() |
||||
|
end |
||||
|
|
||||
|
local function select_non_empty( ) |
||||
|
for i = 1, 9 do |
||||
|
if turtle.getItemCount(i) > 0 then |
||||
|
turtle.select(i) |
||||
|
return |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
turtle.select(1) |
||||
|
print("ERROR: I'm empty, plz refill me!") |
||||
|
while turtle.getItemCount(1) == 0 do sleep(2) end |
||||
|
end |
||||
|
|
||||
|
local function place() |
||||
|
select_non_empty() |
||||
|
turtle.place() |
||||
|
end |
||||
|
|
||||
|
-- basic orientation operations |
||||
|
local function toleft( orientation ) |
||||
|
return (orientation + 3) % 4 |
||||
|
end |
||||
|
|
||||
|
local function toback( orientation ) |
||||
|
return (orientation + 2) % 4 |
||||
|
end |
||||
|
|
||||
|
local function toright( orientation ) |
||||
|
return (orientation + 1) % 4 |
||||
|
end |
||||
|
|
||||
|
-- basic movement (with orientation) |
||||
|
local function forward( orientation ) |
||||
|
if orientation == 0 then bup() |
||||
|
elseif orientation == 1 then bright() |
||||
|
elseif orientation == 2 then bdown() |
||||
|
elseif orientation == 3 then bleft() |
||||
|
else print("Error, wrong orientation") |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
local function walk( orientation, n ) |
||||
|
if orientation == 0 then for i = 1, n do bup() end |
||||
|
elseif orientation == 1 then turtle.turnRight() for i = 1, n do bforward() end turtle.turnLeft() |
||||
|
elseif orientation == 2 then for i = 1, n do bdown(2) end |
||||
|
elseif orientation == 3 then turtle.turnLeft() for i = 1, n do bforward() end turtle.turnRight() |
||||
|
else print("Error, wrong orientation") |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
-- stops after the line |
||||
|
local function line( orientation, n ) |
||||
|
for i = 1, n do |
||||
|
place() |
||||
|
forward(orientation) |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
-- stops after the rect |
||||
|
local function fill( w, h, orientation ) |
||||
|
print(" fill "..w.."x"..h.." in orientation "..orientation) |
||||
|
if w == 1 then |
||||
|
line(orientation, h) |
||||
|
return |
||||
|
end |
||||
|
for i = 1, h do |
||||
|
if i % 2 == 1 then line(toright(orientation), w - 1) |
||||
|
else line(toleft(orientation), w - 1) end |
||||
|
place() |
||||
|
forward(orientation) |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
local function tree( depth, orientation ) |
||||
|
print("Start with "..depth.." in orientation "..orientation) |
||||
|
-- done with recursion |
||||
|
if depth == 0 then |
||||
|
place() |
||||
|
walk(toback(orientation), 1) |
||||
|
return |
||||
|
end |
||||
|
|
||||
|
local n = 2^depth |
||||
|
local half = n/2 |
||||
|
local w = n |
||||
|
local h = n + half |
||||
|
|
||||
|
-- big chunk, if needed move to left |
||||
|
fill(w, h, orientation) |
||||
|
if h % 2 == 1 then |
||||
|
walk(toleft(orientation), w - 1) |
||||
|
end |
||||
|
|
||||
|
walk(toleft(orientation), 1) |
||||
|
line(toleft(orientation), half) |
||||
|
|
||||
|
-- first branch (left) |
||||
|
tree(depth - 1, toleft(orientation)) |
||||
|
line(orientation, half) |
||||
|
|
||||
|
-- second branch (left) |
||||
|
tree(depth - 1, orientation) |
||||
|
|
||||
|
-- fill between branches |
||||
|
if half - 1 > 0 then |
||||
|
forward(toright(orientation)) |
||||
|
fill(half - 1, half - 1, toright(orientation)) |
||||
|
else |
||||
|
walk(toright(orientation), 1) |
||||
|
end |
||||
|
|
||||
|
-- walk to right branches |
||||
|
walk(toright(orientation), w) |
||||
|
|
||||
|
-- fill between branches |
||||
|
if half - 2 > 0 then |
||||
|
fill(half - 1, half - 2, orientation) |
||||
|
end |
||||
|
walk(orientation, 1) |
||||
|
|
||||
|
-- first branch |
||||
|
tree(depth - 1, orientation) |
||||
|
line(toright(orientation), half) |
||||
|
|
||||
|
-- second branch |
||||
|
tree(depth - 1, toright(orientation)) |
||||
|
line(toback(orientation), half - 1) |
||||
|
line(toleft(orientation), half) |
||||
|
|
||||
|
-- move back to pre-begin |
||||
|
walk(toback(orientation), h) |
||||
|
walk(toleft(orientation), w - 1) |
||||
|
walk(toback(orientation), 1) |
||||
|
end |
||||
|
|
||||
|
local args = { ... } |
||||
|
tree(args[1], 0) |
||||
|
|
Reference in new issue