93 lines
2.4 KiB
Python
Executable File
93 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# mcpipy.com retrieved from URL below, written by jjinux
|
|
# http://jjinux.blogspot.com/2013/05/drawing-sierpinskis-triangle-in.html
|
|
|
|
"""Draw Sierpinski's triangle in Minecraft.
|
|
|
|
See: http://jjinux.blogspot.com/2013/05/drawing-sierpinskis-triangle-in.html
|
|
|
|
"""
|
|
|
|
import random
|
|
|
|
import mcpi.minecraft
|
|
import mcpi.block as block
|
|
import server
|
|
|
|
# It goes from -MAX_XZ to MAX_XZ.
|
|
MAX_XZ = 128
|
|
MAX_Y = 64
|
|
|
|
# These are the vertices of the triangle. It's a list of points. Each point
|
|
# is an (X, Y, X) tuple.
|
|
TRIANGLE_HEIGHT = MAX_Y - 1
|
|
TOP = (-MAX_XZ, TRIANGLE_HEIGHT, 0)
|
|
BOTTOM_LEFT = (MAX_XZ, TRIANGLE_HEIGHT, MAX_XZ)
|
|
BOTTOM_RIGHT = (MAX_XZ, TRIANGLE_HEIGHT, -MAX_XZ)
|
|
TRIANGLE_VERTICES = [TOP, BOTTOM_LEFT, BOTTOM_RIGHT]
|
|
|
|
BASE_BLOCK_ID = block.SANDSTONE.id
|
|
TRIANGLE_BLOCK_ID = block.SNOW.id
|
|
|
|
# This is the maximum number of iterations to let the algorithm run. The
|
|
# algorithm relies on randomness, so I'm just picking a sensible value.
|
|
MAX_ITERATIONS = MAX_XZ ** 2
|
|
|
|
PRINT_FREQ = 1000
|
|
|
|
|
|
def clear_board(minecraft):
|
|
minecraft.setBlocks(-MAX_XZ, 0, -MAX_XZ, MAX_XZ, MAX_Y, MAX_XZ, 0)
|
|
minecraft.setBlocks(-MAX_XZ, 0, -MAX_XZ, MAX_XZ, -MAX_Y, MAX_XZ, BASE_BLOCK_ID)
|
|
|
|
|
|
def draw_sierpinski_triangle(minecraft):
|
|
|
|
def random_in_range():
|
|
return random.randint(-MAX_XZ, MAX_XZ)
|
|
|
|
def int_average(a, b):
|
|
return int(round((a + b) / 2.0))
|
|
|
|
# Draw the triangle vertices.
|
|
|
|
for (x, y, z) in TRIANGLE_VERTICES:
|
|
minecraft.setBlock(x, y, z, TRIANGLE_BLOCK_ID)
|
|
|
|
# Pick a random point to start at.
|
|
|
|
current = (random_in_range(),
|
|
TRIANGLE_HEIGHT,
|
|
random_in_range())
|
|
|
|
for i in xrange(MAX_ITERATIONS):
|
|
|
|
if i % PRINT_FREQ == 0:
|
|
print("Drew %s blocks" % i)
|
|
|
|
# Pick a random vertex to "walk" toward.
|
|
|
|
destination = random.choice(TRIANGLE_VERTICES)
|
|
|
|
# Draw a block in the middle of the current location and the
|
|
# destination.
|
|
|
|
(c_x, c_y, c_z) = current
|
|
(d_x, d_y, d_z) = destination
|
|
current = (
|
|
int_average(c_x, d_x),
|
|
TRIANGLE_HEIGHT,
|
|
int_average(c_z, d_z)
|
|
)
|
|
(x, y, z) = current
|
|
minecraft.setBlock(x, y, z, TRIANGLE_BLOCK_ID)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
minecraft = mcpi.minecraft.Minecraft.create(server.address)
|
|
|
|
# Uncomment this if you need it.
|
|
# clear_board(minecraft)
|
|
|
|
draw_sierpinski_triangle(minecraft) |