summaryrefslogtreecommitdiff
path: root/GameEngine
diff options
context:
space:
mode:
Diffstat (limited to 'GameEngine')
-rw-r--r--GameEngine/PlayersCollection.py19
-rw-r--r--GameEngine/multiplayer.py30
2 files changed, 29 insertions, 20 deletions
diff --git a/GameEngine/PlayersCollection.py b/GameEngine/PlayersCollection.py
index 10fa990..6bba6aa 100644
--- a/GameEngine/PlayersCollection.py
+++ b/GameEngine/PlayersCollection.py
@@ -27,7 +27,7 @@ GAME_UNITS = 40
DISPLAY = None
class Players():
- def __init__(self, snake_size, num_players, display, window_width=640, window_height=480, game_units=40):
+ def __init__(self, snake_size, num_players, display, s_starts, window_width=640, window_height=480, game_units=40):
''' define array list of new Snake objects '''
global WINDOW_WIDTH
global WINDOW_HEIGHT
@@ -42,8 +42,8 @@ class Players():
self._index = 0
self.num_players = num_players
- self.players = [Snake(snake_size, player_id)
- for player_id in range(num_players)]
+ self.players = [Snake(snake_size, player_id, s_starts[i])
+ for i, player_id in enumerate(range(num_players))]
def __iter__(self):
return iter(self.players)
@@ -85,9 +85,10 @@ class Players():
player.draw()
class Snake():
- def __init__(self, initial_size, player_id):
+ def __init__(self, initial_size, player_id, start):
''' define initial size (length), direction, and position '''
self.player_id = player_id
+ self.start = start
self.size = initial_size
self.direction = None
self.head = None
@@ -99,12 +100,16 @@ class Snake():
self.score.reset()
self.deficit = 0
self.direction = Direction.RIGHT.value
- x = randint(0, (WINDOW_WIDTH-GAME_UNITS )//GAME_UNITS )*GAME_UNITS
- y = randint(0, (WINDOW_HEIGHT-GAME_UNITS )//GAME_UNITS )*GAME_UNITS
+ if self.start == None:
+ x = randint(0, (WINDOW_WIDTH-GAME_UNITS )//GAME_UNITS )*GAME_UNITS
+ y = randint(0, (WINDOW_HEIGHT-GAME_UNITS )//GAME_UNITS )*GAME_UNITS
+ else:
+ x = self.start[0]
+ y = self.start[1]
self.head = Point(x,y)
self.snake = [self.head]
for seg in range(self.size-1):
- self.snake.append(Point(self.head.x-(seg*GAME_UNITS), self.head.y))
+ self.snake.append(Point(self.head.x-((seg+1)*GAME_UNITS), self.head.y))
def move(self):
''' update snake coordinates by inserting new head '''
diff --git a/GameEngine/multiplayer.py b/GameEngine/multiplayer.py
index 9f6b651..b429316 100644
--- a/GameEngine/multiplayer.py
+++ b/GameEngine/multiplayer.py
@@ -27,9 +27,10 @@ class Playfield:
self._units = units
self._window_width = window_width
self._window_height = window_height
- self._player_count = -1 # number of registered players
+ self._player_count = -1 # number of registered players
+ self._player_starts = [] # starting player positions
''' for human feedback '''
- self._game_state = False # false is game over
+ self._game_state = False # false is game over
self._draw_on = True
self._clock = pg.time.Clock()
@@ -37,16 +38,17 @@ class Playfield:
pg.init()
self.display = pg.display.set_mode(
[self._window_width, self._window_height],
- pg.HWSURFACE) # display object (see explanation in engine.org)
+ pg.HWSURFACE) # display object (see explanation in engine.org)
self._players = None
self._goal = None
- def add_player(self):
+ def add_player(self, s_start=None):
'''
Returns the player's number to the callee.
If the player count is over four, returns None
'''
if self._player_count < 4 or self._game_state == True:
+ self._player_starts.append(s_start)
self._player_count += 1
return self._player_count
return None
@@ -68,12 +70,13 @@ class Playfield:
not result in immediate death
'''
head = self._players.players[player_id].head
- tail = self._players.players[player_id].snake
+ # tail = self._players.players[player_id].snake
+ tail = self._get_player_bodies()
danger_array = np.array([
- head.y-self._units < 0 or PlayersCollection.Point(head.x, head.y-self._units) in tail[1:], # up
- head.x+self._units >= self._window_width or PlayersCollection.Point(head.x+self._units, head.y) in tail[1:], # right
- head.y+self._units >= self._window_height or PlayersCollection.Point(head.x, head.y+self._units) in tail[1:], # down
- head.x-self._units < 0 or PlayersCollection.Point(head.x-self._units, head.y) in tail[1:], # left
+ head.y-self._units < 0 or PlayersCollection.Point(head.x, head.y-self._units) in tail, # up
+ head.x+self._units >= self._window_width or PlayersCollection.Point(head.x+self._units, head.y) in tail, # right
+ head.y+self._units >= self._window_height or PlayersCollection.Point(head.x, head.y+self._units) in tail, # down
+ head.x-self._units < 0 or PlayersCollection.Point(head.x-self._units, head.y) in tail, # left
])
return np.where(danger_array == False)[0]
@@ -82,8 +85,8 @@ class Playfield:
'''
Initializes player objects, starts the game
'''
- self._players = PlayersCollection.Players(self._s_size, self._player_count+1, self.display, game_units=self._units)
- self._goal = GoalCollection.Goal(self.display, game_units=self._units)
+ self._players = PlayersCollection.Players(self._s_size, self._player_count+1, self.display, self._player_starts, window_width=self._window_width, window_height=self._window_height, game_units=self._units)
+ self._goal = GoalCollection.Goal(self.display, self._window_width, self._window_height, game_units=self._units)
self._reset()
print(f'Game starting with {self._player_count+1} players.')
@@ -104,7 +107,7 @@ class Playfield:
''' update game state '''
for player_id, action in enumerate(actions):
- if np.random.uniform < noise:
+ if np.random.uniform() < noise:
# random action (noise)
random_choice = [0, 1, 2, 3]
random_choice.remove(self._players[player_id].direction)
@@ -128,6 +131,7 @@ class Playfield:
for player in self._players:
''' determine what obstacle was hit '''
hazards = self._get_player_bodies()
+ hazards.insert(0, 0) # FIXME (why is this required?)
hazards.remove(player.head)
if (player.head in hazards or player.in_wall()):
self._players.reward_killer(player)
@@ -148,7 +152,7 @@ class Playfield:
def _get_player_bodies(self):
''' return an array of all tail coordinates '''
- tails = [0]
+ tails = []
for player in self._players:
tails += player.snake
return tails