1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#!/bin/usr/env python
"""
Script to rudementarally model spiders colonising new terrain, and the effect
that could have on increasing the nutrient levels.
"""
import matplotlib.pyplot as plt
import numpy as np
import time
class Terrain:
""" Terrain class represents the terrain over which the model is run.
field: Shape of the terrain, and nutrient values
field_mask: mask for various attributes of the field (bit mask?)
"""
def __init__(self, size_x=10, size_y=10):
""" Create a new field of size_x by size_y """
self.field = np.zeros(shape=(size_x, size_y), dtype=int)
self.field_mask = np.ones(shape=(size_x, size_y), dtype=bool)
def print_terrain(self):
""" Display the field """
print(f"Terrain:\n"
f"{self.field}\n"
# f"Terrain mask:\n"
# f"{self.field_mask}\n"
)
def get_terrain(self):
""" Return the terrain """
return self.field
def update_nutrients(self, x, y, nutrients):
""" change nutrient values on the terrain """
self.field[x][y] += nutrients
def size(self):
""" return size of the terrain """
return self.field.shape
class Critter:
""" Basic class for a creature that can appear, modify the terrain, and
procreate or die. """
def __init__(self, nutrient_value=1, pos_x=0, pos_y=0, lifespan=10):
self.nutrient_value = nutrient_value
self.pos_x = pos_x
self.pos_y = pos_y
self.lifespan = lifespan # built in (max?) life
self.life = lifespan # dynamic life left
def live(self):
""" Live another tick, decrement lifespan, and resolve """
# print("Living another tick")
self.life -= 1
if not self.life:
self.life = 'dead'
return self.life
def get_lifespan(self):
""" return how long a creature is supposed to liv """
return self.lifespan
def get_position(self):
""" Return the position of the critter """
return self.pos_x, self.pos_y
def expire(self):
""" Death of the critter """
return self.nutrient_value
def immigrate():
""" check for immigrants """
pass
def actions():
""" actions taken """
pass
def update():
pass
def main():
""" main function, do stuff """
board = Terrain()
board.print_terrain()
spider1 = Critter()
print("\nSpider1 left", spider1.expire(), "nutrients behind.")
if __name__ == '__main__':
main()
|