Grid
Grid generation.
To create a grid using invasion percolation:
- Generate an NxN grid of random numbers.
- Mark the center cell as "filled" by negating its value.
- On each iteration:
- Find the lowest-valued cell adjacent to the filled region.
- Fill that in by negating its value.
- If several cells tie for lowest value, pick one at random.
- Stop when the filled region hits the edge of the grid.
Instead of repeatedly searching for cells adjacent to the filled region, the grid keeps a value-to-coordinates dictionary. When a cell is filled in, neighbors not already recorded are added.
The grid is saved as a list of lists. 0 shows unfilled cells, while positive numbers show the original value of filled cells.
Grid
dataclass
Keep track of generated grid.
Source code in src/snailz/grid.py
37 38 39 40 41 42 | |
Invperc
Represent a 2D grid that supports lazy filling.
Source code in src/snailz/grid.py
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 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | |
cells
property
Get the grid cell values.
Returns:
| Type | Description |
|---|---|
list[list[int]]
|
A 2D list of grid cell values |
__init__(depth, size)
Initialize the invasion percolation grid.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
depth
|
int
|
The maximum value for grid cells |
required |
size
|
int
|
The size of the grid (size x size) |
required |
Source code in src/snailz/grid.py
95 96 97 98 99 100 101 102 103 104 105 106 107 108 | |
__str__()
Convert to printable string representation.
Returns:
| Type | Description |
|---|---|
str
|
A string representation of the grid with '.' for unfilled cells |
str
|
and 'x' for filled cells, with each row on a separate line |
Source code in src/snailz/grid.py
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | |
fill()
Fill the grid one cell at a time using invasion percolation.
Starts at the center and fills outward, choosing lowest-valued adjacent cells, until reaching the border of the grid. After filling, inverts cell values.
Source code in src/snailz/grid.py
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | |
invert()
Flip cell values to final form.
Converts negative values (filled cells) to their positive values and leaves non-negative values as 0 (unfilled)
Source code in src/snailz/grid.py
151 152 153 154 155 156 157 158 159 | |
add_candidates(x, y)
Add unfilled cells adjacent to a filled cell as candidates for filling.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x
|
int
|
X-coordinate of the filled cell |
required |
y
|
int
|
Y-coordinate of the filled cell |
required |
Source code in src/snailz/grid.py
161 162 163 164 165 166 167 168 169 170 171 | |
add_one_candidate(x, y)
Add a single point to the set of candidates for filling.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x
|
int
|
X-coordinate of the candidate cell |
required |
y
|
int
|
Y-coordinate of the candidate cell |
required |
Note
Does nothing if the coordinates are outside the grid bounds or if the cell is already filled (negative value)
Source code in src/snailz/grid.py
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | |
choose_cell()
Choose the next cell to fill using the invasion percolation algorithm.
Returns:
| Type | Description |
|---|---|
tuple[int, int]
|
A tuple (x, y) of coordinates for the next cell to fill |
Note
Chooses the lowest-valued cell adjacent to already filled cells. If multiple cells tie for the lowest value, picks one at random. Updates the candidate set after selecting a cell.
Source code in src/snailz/grid.py
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | |
on_border(x, y)
Check if a cell is on the border of the grid.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x
|
int
|
X-coordinate of the cell |
required |
y
|
int
|
Y-coordinate of the cell |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True if the cell is on any edge of the grid, False otherwise |
Source code in src/snailz/grid.py
217 218 219 220 221 222 223 224 225 226 227 228 | |
grid_check(params)
Check grid generation parameters.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
dict[str, object]
|
Dictionary containing grid generation parameters |
required |
Raises:
| Type | Description |
|---|---|
ValueError
|
If parameters are missing, have wrong types, or have invalid values |
Source code in src/snailz/grid.py
45 46 47 48 49 50 51 52 53 54 55 56 | |
grid_generate(params)
Generate grid using invasion percolation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
dict[str, object]
|
Dictionary containing grid generation parameters (depth, seed, size) |
required |
Returns:
| Type | Description |
|---|---|
Grid
|
Grid object containing the generated grid and parameters |
Source code in src/snailz/grid.py
59 60 61 62 63 64 65 66 67 68 69 70 71 | |
grid_to_csv(grid, filename)
Write grid values as CSV without a header.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
grid
|
Grid
|
Grid object containing the grid data to write |
required |
filename
|
str | None
|
Path to output file, or None to write to standard output |
required |
Side effects
Either writes to the specified output file or prints to stdout
Source code in src/snailz/grid.py
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | |