Our journey begins here...
!wget "https://www.kenney.nl/content/3-assets/26-cartography-pack/cartographypack.zip"
!mkdir cartographypack
!unzip cartographypack.zip -d cartographypack
--2022-02-04 13:56:37-- https://www.kenney.nl/content/3-assets/26-cartography-pack/cartographypack.zip Resolving www.kenney.nl (www.kenney.nl)... 149.210.216.123 Connecting to www.kenney.nl (www.kenney.nl)|149.210.216.123|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 4199252 (4.0M) [application/zip] Saving to: ‘cartographypack.zip’ cartographypack.zip 100%[===================>] 4.00M 16.6MB/s in 0.2s 2022-02-04 13:56:37 (16.6 MB/s) - ‘cartographypack.zip’ saved [4199252/4199252] Archive: cartographypack.zip creating: cartographypack/Spritesheet/ inflating: cartographypack/Spritesheet/spritesheet_default.png inflating: cartographypack/Spritesheet/spritesheet_default.xml inflating: cartographypack/Spritesheet/spritesheet_retina.png inflating: cartographypack/Spritesheet/spritesheet_retina.xml creating: cartographypack/Textures/ inflating: cartographypack/Textures/parchmentAncient.png inflating: cartographypack/Textures/parchmentBasic.png inflating: cartographypack/Textures/parchmentCrinkled.png inflating: cartographypack/Textures/parchmentFolded.png inflating: cartographypack/Textures/parchmentFoldedCrinkled.png creating: cartographypack/Vector/ inflating: cartographypack/Vector/cartographyPack_vector.svg inflating: cartographypack/Vector/cartographyPack_vector.swf inflating: cartographypack/Kenney.url inflating: cartographypack/License.txt inflating: cartographypack/Patreon.url inflating: cartographypack/Preview.png inflating: cartographypack/Sample.png creating: cartographypack/PNG/ creating: cartographypack/PNG/Default/ inflating: cartographypack/PNG/Default/arrowCorner.png inflating: cartographypack/PNG/Default/arrowCornerSquare.png inflating: cartographypack/PNG/Default/arrowCrossing.png inflating: cartographypack/PNG/Default/arrowEnd.png inflating: cartographypack/PNG/Default/arrowHead.png inflating: cartographypack/PNG/Default/arrowSmall.png inflating: cartographypack/PNG/Default/arrowSplit.png inflating: cartographypack/PNG/Default/arrowStraight.png inflating: cartographypack/PNG/Default/banner.png inflating: cartographypack/PNG/Default/bridge.png inflating: cartographypack/PNG/Default/bridgeRope.png inflating: cartographypack/PNG/Default/bush.png inflating: cartographypack/PNG/Default/cactus.png inflating: cartographypack/PNG/Default/cactusLarge.png inflating: cartographypack/PNG/Default/campfire.png inflating: cartographypack/PNG/Default/castle.png inflating: cartographypack/PNG/Default/castleTall.png inflating: cartographypack/PNG/Default/castleWide.png inflating: cartographypack/PNG/Default/castleWideLow.png inflating: cartographypack/PNG/Default/chest.png inflating: cartographypack/PNG/Default/church.png inflating: cartographypack/PNG/Default/churchLarge.png inflating: cartographypack/PNG/Default/compass.png inflating: cartographypack/PNG/Default/dock.png inflating: cartographypack/PNG/Default/elementCircle.png inflating: cartographypack/PNG/Default/elementCross.png inflating: cartographypack/PNG/Default/elementDiamond.png inflating: cartographypack/PNG/Default/elementShield.png inflating: cartographypack/PNG/Default/elementSquare.png inflating: cartographypack/PNG/Default/fence.png inflating: cartographypack/PNG/Default/flag.png inflating: cartographypack/PNG/Default/gate.png inflating: cartographypack/PNG/Default/graveyard.png inflating: cartographypack/PNG/Default/house.png inflating: cartographypack/PNG/Default/houseChimney.png inflating: cartographypack/PNG/Default/houses.png inflating: cartographypack/PNG/Default/houseSmall.png inflating: cartographypack/PNG/Default/houseTall.png inflating: cartographypack/PNG/Default/houseViking.png inflating: cartographypack/PNG/Default/lake.png inflating: cartographypack/PNG/Default/lakeRound.png inflating: cartographypack/PNG/Default/lighthouse.png inflating: cartographypack/PNG/Default/mill.png inflating: cartographypack/PNG/Default/mine.png inflating: cartographypack/PNG/Default/palm.png inflating: cartographypack/PNG/Default/palmLarge.png inflating: cartographypack/PNG/Default/pathCorner.png inflating: cartographypack/PNG/Default/pathCrossing.png inflating: cartographypack/PNG/Default/pathEnd.png inflating: cartographypack/PNG/Default/pathSplit.png inflating: cartographypack/PNG/Default/pathStraight.png inflating: cartographypack/PNG/Default/pyramid.png inflating: cartographypack/PNG/Default/rocks.png inflating: cartographypack/PNG/Default/rocksA.png inflating: cartographypack/PNG/Default/rocksB.png inflating: cartographypack/PNG/Default/rocksMountain.png inflating: cartographypack/PNG/Default/rocksTall.png inflating: cartographypack/PNG/Default/runis.png inflating: cartographypack/PNG/Default/ship.png inflating: cartographypack/PNG/Default/skull.png inflating: cartographypack/PNG/Default/stable.png inflating: cartographypack/PNG/Default/tent.png inflating: cartographypack/PNG/Default/textureBricks.png inflating: cartographypack/PNG/Default/textureStone.png inflating: cartographypack/PNG/Default/textureWater.png inflating: cartographypack/PNG/Default/tipi.png inflating: cartographypack/PNG/Default/tower.png inflating: cartographypack/PNG/Default/towerLow.png inflating: cartographypack/PNG/Default/towerTall.png inflating: cartographypack/PNG/Default/towerWatch.png inflating: cartographypack/PNG/Default/treePine.png inflating: cartographypack/PNG/Default/treePineLarge.png inflating: cartographypack/PNG/Default/treePines.png inflating: cartographypack/PNG/Default/treePinesSmall.png inflating: cartographypack/PNG/Default/treePineTall.png inflating: cartographypack/PNG/Default/treePineTallLarge.png inflating: cartographypack/PNG/Default/treePineTallLow.png inflating: cartographypack/PNG/Default/treeTall.png inflating: cartographypack/PNG/Default/vulcano.png inflating: cartographypack/PNG/Default/wall.png inflating: cartographypack/PNG/Default/watchtower.png inflating: cartographypack/PNG/Default/waterWheel.png inflating: cartographypack/PNG/Default/well.png creating: cartographypack/PNG/Retina/ inflating: cartographypack/PNG/Retina/arrowCorner.png inflating: cartographypack/PNG/Retina/arrowCornerSquare.png inflating: cartographypack/PNG/Retina/arrowCrossing.png inflating: cartographypack/PNG/Retina/arrowEnd.png inflating: cartographypack/PNG/Retina/arrowHead.png inflating: cartographypack/PNG/Retina/arrowSmall.png inflating: cartographypack/PNG/Retina/arrowSplit.png inflating: cartographypack/PNG/Retina/arrowStraight.png inflating: cartographypack/PNG/Retina/banner.png inflating: cartographypack/PNG/Retina/bridge.png inflating: cartographypack/PNG/Retina/bridgeRope.png inflating: cartographypack/PNG/Retina/bush.png inflating: cartographypack/PNG/Retina/cactus.png inflating: cartographypack/PNG/Retina/cactusLarge.png inflating: cartographypack/PNG/Retina/campfire.png inflating: cartographypack/PNG/Retina/castle.png inflating: cartographypack/PNG/Retina/castleTall.png inflating: cartographypack/PNG/Retina/castleWide.png inflating: cartographypack/PNG/Retina/castleWideLow.png inflating: cartographypack/PNG/Retina/chest.png inflating: cartographypack/PNG/Retina/church.png inflating: cartographypack/PNG/Retina/churchLarge.png inflating: cartographypack/PNG/Retina/compass.png inflating: cartographypack/PNG/Retina/dock.png inflating: cartographypack/PNG/Retina/elementCircle.png inflating: cartographypack/PNG/Retina/elementCross.png inflating: cartographypack/PNG/Retina/elementDiamond.png inflating: cartographypack/PNG/Retina/elementShield.png inflating: cartographypack/PNG/Retina/elementSquare.png inflating: cartographypack/PNG/Retina/fence.png inflating: cartographypack/PNG/Retina/flag.png inflating: cartographypack/PNG/Retina/gate.png inflating: cartographypack/PNG/Retina/graveyard.png inflating: cartographypack/PNG/Retina/house.png inflating: cartographypack/PNG/Retina/houseChimney.png inflating: cartographypack/PNG/Retina/houses.png inflating: cartographypack/PNG/Retina/houseSmall.png inflating: cartographypack/PNG/Retina/houseTall.png inflating: cartographypack/PNG/Retina/houseViking.png inflating: cartographypack/PNG/Retina/lake.png inflating: cartographypack/PNG/Retina/lakeRound.png inflating: cartographypack/PNG/Retina/lighthouse.png inflating: cartographypack/PNG/Retina/mill.png inflating: cartographypack/PNG/Retina/mine.png inflating: cartographypack/PNG/Retina/palm.png inflating: cartographypack/PNG/Retina/palmLarge.png inflating: cartographypack/PNG/Retina/pathCorner.png inflating: cartographypack/PNG/Retina/pathCrossing.png inflating: cartographypack/PNG/Retina/pathEnd.png inflating: cartographypack/PNG/Retina/pathSplit.png inflating: cartographypack/PNG/Retina/pathStraight.png inflating: cartographypack/PNG/Retina/pyramid.png inflating: cartographypack/PNG/Retina/rocks.png inflating: cartographypack/PNG/Retina/rocksA.png inflating: cartographypack/PNG/Retina/rocksB.png inflating: cartographypack/PNG/Retina/rocksMountain.png inflating: cartographypack/PNG/Retina/rocksTall.png inflating: cartographypack/PNG/Retina/ruins.png inflating: cartographypack/PNG/Retina/ship.png inflating: cartographypack/PNG/Retina/skull.png inflating: cartographypack/PNG/Retina/stable.png inflating: cartographypack/PNG/Retina/tent.png inflating: cartographypack/PNG/Retina/textureBricks.png inflating: cartographypack/PNG/Retina/textureStone.png inflating: cartographypack/PNG/Retina/textureWater.png inflating: cartographypack/PNG/Retina/tipi.png inflating: cartographypack/PNG/Retina/tower.png inflating: cartographypack/PNG/Retina/towerLow.png inflating: cartographypack/PNG/Retina/towerTall.png inflating: cartographypack/PNG/Retina/towerWatch.png inflating: cartographypack/PNG/Retina/treePine.png inflating: cartographypack/PNG/Retina/treePineLarge.png inflating: cartographypack/PNG/Retina/treePines.png inflating: cartographypack/PNG/Retina/treePinesSmall.png inflating: cartographypack/PNG/Retina/treePineTall.png inflating: cartographypack/PNG/Retina/treePineTallLarge.png inflating: cartographypack/PNG/Retina/treePineTallLow.png inflating: cartographypack/PNG/Retina/treeTall.png inflating: cartographypack/PNG/Retina/vulcano.png inflating: cartographypack/PNG/Retina/wall.png inflating: cartographypack/PNG/Retina/watchtower.png inflating: cartographypack/PNG/Retina/waterWheel.png inflating: cartographypack/PNG/Retina/well.png
!ls cartographypack/PNG/Default/path*
cartographypack/PNG/Default/pathCorner.png cartographypack/PNG/Default/pathCrossing.png cartographypack/PNG/Default/pathEnd.png cartographypack/PNG/Default/pathSplit.png cartographypack/PNG/Default/pathStraight.png
from glob import glob
import os
from IPython.display import display, HTML
html = ""
for img_path in glob("cartographypack/PNG/Default/path*"):
html += f'<img src="{ img_path }" style="float:left;">'
display(HTML(html))
from random import choice
pieces = glob("cartographypack/PNG/Default/path*")
html = ""
for i in range(100):
piece = choice(pieces)
html += f'<img src="{ piece }" style="float:left;">'
display(HTML(html))
In order to generate patterns in a non-random way, we might want to move around through our canvas in a non-linear way, to make the patterns a bit more complex.
Each character on our "canvas" has a specific position and thus is connected to a x
and y
coordinate.
How can we do that?
We will use a list-of-lists
... or in other words:
we make one big list, that contains a # of rows (the y
axis, or height of the canvas), with a # of characters (the x
axis, or width of the canvas).
To make this list-of-lists
, we will use a loop-in-a-loop
:
width = 10
height = 10
canvas = []
for y in range(height):
row = []
for x in range(width):
row.append(x)
canvas.append(row)
print(canvas)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
Let's print the canvas row for row, to make it easier to see it as a x-y canvas:
for row in canvas:
print(row)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
And let's bring it back into an plain text pattern: turn this list-of-lists
into a multiline string
:
# canvas is our list-of-lists
# canvas_string is the plain text version that we want to create
canvas_string = ''
for row in canvas:
row_string = ''
for character in row:
row_string += str(character)
canvas_string += row_string + "\n"
print(canvas_string)
0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789
Let's save this as a function that we can reuse later!
def plain(canvas):
canvas_string = ''
for row in canvas:
row_string = "".join(row)
canvas_string += row_string + "\n"
return canvas_string
Now, we can work with the x
and y
axes of the canvas, by slicing the canvas
:
canvas[0][0]
0
canvas[1][9]
9
Now let's write a short algorithm, to generate a map.
We will start by writing the rules of our algorithm.
Let's first think of these rules without writing them in code.
How would you like to generate a pattern?
For example:
Characters
.
is used as background░
as light shade▒
as darker shadeRules
░
always appears in horizontal ánd vertical blocks of 3.....
..░..
.░░░.
..░..
.....
▒
surrounds the blobs of light shade on the left side of each light shadow .....
.▒░..
▒░░░.
.▒░..
.....
Let's try this!
First we create a new canvas and fill it with .
's.
width = 100
height = 25
canvas = []
for y in range(height):
row = []
for x in range(width):
row.append('.')
canvas.append(row)
print(plain(canvas))
.................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... .................................................................................................... ....................................................................................................
Now let's add the light shade...
from random import randrange
light_shade = '░'
for y in range(height):
for x in range(width):
# To work with a degree of chance,
# we "roll the dice" and only add a ░
# when the number is lower then 5
random_number = randrange(0, 100, 1)
if random_number < 3:
# If so, then we add a ░
canvas[y][x] = light_shade
# Check is there is a character on the left, right,
# top and bottom AT ALL, before adding them...
if x - 1 >= 0:
canvas[y][x - 1] = light_shade
if x + 1 < width:
canvas[y][x + 1] = light_shade
if y - 1 >= 0:
canvas[y - 1][x] = light_shade
if y + 1 < height:
canvas[y + 1][x] = light_shade
else:
continue
print(plain(canvas))
.░░░...░.....................................................░░░........░.................░......... ..░...░░░.....................................................░....░...░░░...............░░░........ .░.....░..........................................................░░░...░.................░░........ ░░░.....................░............░.............................░......................░░░....... .░.....................░░░..........░░░.........░...............░..........................░........ ..............░....░....░............░.........░░░.............░░░..........░.....░................. .............░░░..░░░..............░░░░.........░...............░..........░░░.░.░░░................ ..............░....░.............░░░░░.........................░░░..........░.░░░░░░................ ................................░░░░............................░..............░..░................. .........░......░...............░░░..................░............░................................. ........░░░....░░░.........░.....░..................░░░..........░░░...........░....░.........░..... .........░......░.........░░░........................░......░.....░...........░░░..░░░....░..░░░.... ...........................░...............................░░░.................░....░....░░░░.░..... ....░................░...............................░......░░.......................░....░░░░...... ...░░░..............░░░..................░.....░....░░░.....░░░....................░░░░.....░....... ....░................░.░...░............░░░...░░░....░░░.....░..░........░........░░░░.....░░░░..... ......░...............░░░.░░░........░...░.....░......░.......░░░░......░░░........░........░░░░.... .....░░░...........░...░...░........░░░......................░░░░........░..................░.░..... ......░...........░░░....░...........░.....░..................░............................░░░...... ...................░....░░░.....░..░......░░░....░...........░..............................░....... ........░................░.....░░░░░░......░.░..░░░.........░░░..░.............................░.... .......░░░....................░.░..░........░░░..░...........░..░░░...........................░░░... ........░....................░░░....░........░░.......░..........░....................░........░.... ░.............................░....░░░.......░░░.....░░░.............................░░░............ ░░..................................░.........░.......░...............................░.............
Now let's add the darker shade...
from random import randrange
light_shade = '░'
darker_shade = '▒'
for y in range(height):
for x in range(width):
# First we check if the current character is a light shade
if canvas[y][x] == light_shade:
# If that is the case, we need to look around, to see if we need to place a shade on the left, right, top or bottom
# Check is there is a left character AT ALL
if x - 1 >= 0:
# If so, then we check if the left character is a '.'
if canvas[y][x - 1] == '.':
# If so, then we replace it with a dark shade
canvas[y][x - 1] = '▒'
else:
continue
print(plain(canvas))
▒░░░..▒░....................................................▒░░░.......▒░................▒░......... .▒░..▒░░░....................................................▒░...▒░..▒░░░..............▒░░░........ ▒░....▒░.........................................................▒░░░..▒░................▒░░........ ░░░....................▒░...........▒░............................▒░.....................▒░░░....... ▒░....................▒░░░.........▒░░░........▒░..............▒░.........................▒░........ .............▒░...▒░...▒░...........▒░........▒░░░............▒░░░.........▒░....▒░................. ............▒░░░.▒░░░.............▒░░░░........▒░..............▒░.........▒░░░▒░▒░░░................ .............▒░...▒░............▒░░░░░........................▒░░░.........▒░▒░░░░░░................ ...............................▒░░░░...........................▒░.............▒░.▒░................. ........▒░.....▒░..............▒░░░.................▒░...........▒░................................. .......▒░░░...▒░░░........▒░....▒░.................▒░░░.........▒░░░..........▒░...▒░........▒░..... ........▒░.....▒░........▒░░░.......................▒░.....▒░....▒░..........▒░░░.▒░░░...▒░.▒░░░.... ..........................▒░..............................▒░░░................▒░...▒░...▒░░░░▒░..... ...▒░...............▒░..............................▒░.....▒░░......................▒░...▒░░░░...... ..▒░░░.............▒░░░.................▒░....▒░...▒░░░....▒░░░...................▒░░░░....▒░....... ...▒░...............▒░▒░..▒░...........▒░░░..▒░░░...▒░░░....▒░.▒░.......▒░.......▒░░░░....▒░░░░..... .....▒░..............▒░░░▒░░░.......▒░..▒░....▒░.....▒░......▒░░░░.....▒░░░.......▒░.......▒░░░░.... ....▒░░░..........▒░..▒░..▒░.......▒░░░.....................▒░░░░.......▒░.................▒░▒░..... .....▒░..........▒░░░...▒░..........▒░....▒░.................▒░...........................▒░░░...... ..................▒░...▒░░░....▒░.▒░.....▒░░░...▒░..........▒░.............................▒░....... .......▒░...............▒░....▒░░░░░░.....▒░▒░.▒░░░........▒░░░.▒░............................▒░.... ......▒░░░...................▒░▒░.▒░.......▒░░░.▒░..........▒░.▒░░░..........................▒░░░... .......▒░...................▒░░░...▒░.......▒░░......▒░.........▒░...................▒░.......▒░.... ░............................▒░...▒░░░......▒░░░....▒░░░............................▒░░░............ ░░.................................▒░........▒░......▒░..............................▒░.............
:---)