-
Notifications
You must be signed in to change notification settings - Fork 0
/
zoo.py
144 lines (129 loc) · 4.45 KB
/
zoo.py
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
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
from constants import directions
from util import calc_move
from util import gen_rand_coords
from random import randint
def move_monsters(world, monsters, player, m_grid, active_monsters, p_grid, powerups):
changes = {
'world': [],
'monsters': [],
'is_dead': False
}
px = player['x']
py = player['y']
heartrate = player['heartrate']
for a in active_monsters:
m = monsters[a]
mx = m['x']
my = m['y']
mcode = world[my][mx]
new_pos = calc_move(mcode, {'x': mx, 'y': my})
nx = new_pos['x']
ny = new_pos['y']
ncode = world[ny][nx]
#Check if new location points back here
if abs(ncode - mcode) == 2:
ncode = (ncode + [-1,1][randint(0,1)]) % 4
world[ny][nx] = ncode
changes['world'].append({
'x': nx,
'y': ny,
'direction': directions[ncode]
})
# check if it can move there
if m_grid[ny][nx] == None:
# moving allowed! (i.e. nothing in the way)
m_grid[my][mx] = None # off of old spot
m_grid[ny][nx] = m # onto new spot
# save new position
m['x'] = nx
m['y'] = ny
# remove any powerups stepped on
p_grid[ny][nx] = None
new_powerups = []
for pu in powerups:
if not (pu['x'] == nx and pu['y'] == ny):
new_powerups.append(pu)
powerups = new_powerups
else:
mcode = (mcode + [-1,1][randint(0,1)]) % 4
world[my][mx] = mcode
changes['world'].append({
'x': mx,
'y': my,
'direction': directions[mcode]
})
mx = m['x']
my = m['y']
# calculate proximity
if abs(mx - px) <= 2 and abs(my - py) <= 2:
if mx == px and my == py:
# on the same square
heartrate += 1
changes['is_dead'] = True
elif abs(mx - px) <= 1 and abs(my - py) <= 1:
# superclose
heartrate += 5
else:
# nearby
heartrate += 2
if heartrate == player['heartrate']:
heartrate -= 10
player['heartrate'] = heartrate if heartrate > 50 else 50
player['heartbeats'] -= player['heartrate']
changes['player'] = player
return {
'm_grid': m_grid,
'changes': changes,
'world': world,
'monsters': monsters,
'p_grid': p_grid,
'powerups': powerups
}
def spawn_monster(monsters, active_monsters, player, m_grid, powerups, p_grid):
# get free monsters
free_monsters = []
for key in monsters.keys():
if key not in active_monsters:
free_monsters.append(key)
if len(free_monsters) > 0:
while (True):
coords = gen_rand_coords()
x = coords['x']
y = coords['y']
# check if space is free
if (y not in m_grid or x not in m_grid[y]) and not (player['x'] == x and player['y'] == y):
# if so, spawn random free monster there and break
new_monst = free_monsters[randint(
0,
len(free_monsters) - 1)]
monsters[new_monst]['x'] = x
monsters[new_monst]['y'] = y
active_monsters.append(new_monst)
# remove any powerups stepped on
p_grid[y][x] = None
new_powerups = []
for pu in powerups:
if not (pu['x'] == x and pu['y'] == y):
new_powerups.append(pu)
powerups = new_powerups
break
# else loop again
# when monster has spawned, return updated lists
return {
'monsters': monsters,
'active_monsters': active_monsters,
'p_grid': p_grid,
'powerups': powerups
}
def move_player(world, player, m_grid):
px = player['x']
py = player['y']
# move player
new_pos = calc_move(world[py][px], {'x': px, 'y': py})
player['x'] = new_pos['x']
player['y'] = new_pos['y']
died = False
# see if player lands on monster
if m_grid[player['y']] is not None and m_grid[player['y']][player['x']] is not None:
died = True
return {'player':player, 'died':died}