/
game_objects.py
executable file
·155 lines (124 loc) · 4.2 KB
/
game_objects.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
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from random import randint
from itertools import count
from gevent import sleep, spawn
from gamemap import Tile, NoSendTile
class GameObject(object):
can_start = False
get_id = count().next
map_layer = 'base'
cls_drawdata = {'drawtype': 'image'}
tile_class = Tile
def __init__(self, layer, coords):
self.indef = self.get_id()
self.drawdata = {'indef': self.indef,
'map_layer': self.map_layer}
self.drawdata.update(self.cls_drawdata)
self.layer = layer
self.tiles = list()
self.create_tile = self._create_tile_generator()
for coord in coords:
self.tiles.append(self.create_tile(coord))
def _create_tile_generator(self):
return type('Tile_%d' % self.indef, (self.tile_class,), {
'game_object': self,
'indef': self.indef,
'layer': self.layer})
def coll(self, coll_obj, tile):
return True
def get_drawdata(self):
return self.drawdata
class EmptyObject(GameObject):
can_start = True
cls_drawdata = {'drawtype': 'empty'}
tile_class = NoSendTile
class Ground(GameObject):
map_layer = 'ground'
cls_drawdata = {'drawtype': 'image',
'image': 'ground'}
tile_class = NoSendTile
class Rabbit(GameObject):
can_start = True
cls_drawdata = {'drawtype': 'image',
'image': 'rabbit'}
def __init__(self, layer, coord):
super(Rabbit, self).__init__(layer, coord)
self.speed = 10.0
self.greenlet = spawn(self.step)
def coll(self, coll_obj, tile):
self.tiles.remove(tile)
coll_obj.len += 5
coll_obj.scores(2)
return True
def step(self):
while True:
free = self.layer.get_free_coord()
if free is not None:
self.tiles.append(self.create_tile(free))
sleep(self.speed)
class Wall(GameObject):
cls_drawdata = {'drawtype': 'wall'}
def __init__(self, layer, coord):
super(Wall, self).__init__(layer, coord)
def coll(self, coll_obj, tile):
coll_obj.len -= 1
return False
class StartPosition(GameObject):
can_start = True
map_layer = 'ground'
cls_drawdata = {'drawtype': 'image',
'image': 'start_position'}
start_pos = True
class Snake(GameObject):
alive = False
cls_drawdata = {'drawtype': 'snake'}
direct = (0, -1), (1, 0), (0, 1), (-1, 0)
def __init__(self, layer, color, scores):
self.rotation = 0
super(Snake, self).__init__(layer, ())
self.speed = 0.4
self.drawdata['color'] = color
self.scores = scores
def start(self, coord):
if not self.layer[coord].can_start():
return
self.alive = True
self.len = 3
info = str(self.rotation) + 'h'
self.tiles.append(self.create_tile(coord, info))
self.greenlet = spawn(self.step)
def kill(self):
self.alive = False
del self.tiles[:]
if hasattr(self, 'greenlet'):
self.greenlet.kill()
def del_last(self):
self.tiles.pop(0)
self.tiles[0].info = self.tiles[0].info[1] + '_'
def add_new(self, coord):
info = '_' + str((self.rotation + 2) % 4)
self.tiles.append(self.create_tile(coord, info))
if self.tiles[-2].info[1] == 'b' or self.tiles[-2].info[1] == 'h':
self.tiles[-2].info = 'b' + str(self.rotation)
else:
self.tiles[-2].info = self.tiles[-2].info[1] + str(self.rotation)
def test_coll(self, coord):
tile = self.layer[coord]
return tile.game_object.coll(self, tile)
def coll(self, coll_obj, tile):
coll_obj.len -= 1
coll_obj.scores(-1)
return False
def step(self):
while True:
if self.len < 2:
self.kill()
if self.len < len(self.tiles):
self.del_last()
old = self.tiles[-1].coord
dc = self.direct[self.rotation]
coord = old[0] + dc[0], old[1] + dc[1]
if self.test_coll(coord):
self.add_new(coord)
sleep(self.speed)