In the previous example the tunnel was horizontal so the value of y for the tunnel was always constant. To make the tunnel route more complicated without having duplicate code we define a function called tunnelvertical(eastposition). For any value of the east position (x value) this function will return the vertical position of the tunnel.
def tunnelvertical(eastposition): y = abs(100 - (eastposition - XMIN)) if y < 10: return 10 if y > 72: return 72 return y
XMIN is a constant we have previously defined in the code showing where the tunnel starts. The shape of this tunnel is horizontal at ground level, then slopes down until it reaches level 10, goes horizontal for a while, then slopes up until it reaches ground level again and finishes off horizontal.
Here is the full code
import mcpi.minecraft as minecraft import mcpi.block as block mc=minecraft.Minecraft.create() XMIN = -400 # x value at one end of tunnel. XMAX = -200 # x value at other end of tunnel. Must be greater than XMIN GROUND = 72 # y position of tunnel at each end FLOOR = 10 # minimum value of y at bottom of tunnel ZPOS = -222 # z position for full length of tunnel TAIL = 10 # length of horizontal at each end of tunnel # constants for tunnelvertical function kx = (XMAX + XMIN) / 2 ky = GROUND + TAIL - (XMAX - XMIN) / 2 # tunnelvertical returns a vertical position of the tunnel # for each value of the x position (eastposition) def tunnelvertical(eastposition): y = abs(eastposition - kx) + ky if y < FLOOR: return FLOOR if y > GROUND: return GROUND return y # set the z coordinate for the tunnel which doesn't change for the full length z = ZPOS # Initial loop to create a route made of solid glass with a stone base for x in range(XMIN,XMAX+1): y = tunnelvertical(x) mc.setBlocks(x,y,z-2,x,y+6,z+2,block.GLASS) mc.setBlocks(x,y,z-1,x,y,z+1,block.STONE) # Second loop to convert solid glass into a tunnel for x in range(XMIN+1,XMAX): y = tunnelvertical(x) # replace centre glass with air to make it a tunnel mc.setBlocks(x,y+1,z-1,x,y+5,z+1,block.AIR) # place a torch every 4 positions to light the tunnel if x % 4 == 0: mc.setBlock(x,y+1,z+1,block.TORCH.id,5)