diff --git a/rose/common/config.py b/rose/common/config.py index a0acb4d9..d08b2aa7 100644 --- a/rose/common/config.py +++ b/rose/common/config.py @@ -39,6 +39,7 @@ score_move_forward = 10 score_move_backward = -10 +score_pickup = 10 score_jump = 5 score_brake = 4 diff --git a/rose/server/score.py b/rose/server/score.py index 0c1e777a..6a2d812c 100644 --- a/rose/server/score.py +++ b/rose/server/score.py @@ -27,54 +27,64 @@ def process(players, track): if player.x < config.matrix_width - 1: player.x += 1 - # Now handle obstacles, preferring players in their own lane. + obstacle = track.get(player.x, player.y) - sorted_players = sorted(six.itervalues(players), - key=lambda p: 0 if p.in_lane() else 1) - positions = set() + if obstacle == obstacles.NONE: + # Move forlward + player.score += config.score_move_forward - for player in sorted_players: - player.score += config.score_move_forward - obstacle = track.get(player.x, player.y) - if obstacle == obstacles.CRACK: - if player.action != actions.JUMP: - track.clear(player.x, player.y) - player.y += 1 - player.score += config.score_move_backward * 2 - else: - player.score += config.score_jump elif obstacle in (obstacles.TRASH, obstacles.BIKE, obstacles.BARRIER): - if player.action not in (actions.LEFT, actions.RIGHT): + # Move back + track.clear(player.x, player.y) + player.y += 1 + player.score += config.score_move_backward + + elif obstacle == obstacles.CRACK: + if player.action == actions.JUMP: + # Move forlward + player.score += config.score_move_forward + player.score += config.score_jump + else: + # Move back track.clear(player.x, player.y) player.y += 1 - player.score += config.score_move_backward * 2 + player.score += config.score_move_backward + elif obstacle == obstacles.WATER: - if player.action != actions.BRAKE: + if player.action == actions.BRAKE: + # Move forlward + player.score += config.score_move_forward + player.score += config.score_brake + else: + # Move back track.clear(player.x, player.y) player.y += 1 - player.score += config.score_move_backward * 2 - else: - player.score += config.score_brake + player.score += config.score_move_backward + elif obstacle == obstacles.PENGUIN: if player.action == actions.PICKUP: + # Move forlward track.clear(player.x, player.y) player.score += config.score_move_forward + player.score += config.score_pickup + else: + # Move forlward no reward + player.score += config.score_move_forward - # Here we can end the game when player gets out of - # the track bounds. For now, just keep the player at the same - # location. - player.y = min(config.matrix_height - 1, max(2, player.y)) - - # Finally forget action - player.action = actions.NONE + # Filter for players with the same x and y + all_collisions = filter(lambda p: + p.name != player.name and + p.x == player.x and + p.y == player.y, six.itervalues(players)) + next_collision = next(all_collisions, None) - # Fix up collisions + # if we have a collision and we are not in our lane, try to move back + if next_collision and not player.in_lane(): + log.info('player %s collision at %d,%d with %s', + player.name, player.x, player.y, next_collision.name) - if (player.x, player.y) in positions: - log.info('player %s collision at %d,%d', - player.name, player.x, player.y) player.score += config.score_move_backward if player.y < config.matrix_height - 1: player.y += 1 @@ -83,9 +93,15 @@ def process(players, track): elif player.x < config.matrix_width - 1: player.x += 1 + # Here we can end the game when player gets out of + # the track bounds. For now, just keep the player at the same + # location. + player.y = min(config.matrix_height - 1, max(2, player.y)) + + # Finally forget action + player.action = actions.NONE + log.info('process_actions: name=%s lane=%d pos=%d,%d score=%d ' 'response_time=%0.6f', player.name, player.lane, player.x, player.y, player.score, player.response_time) - - positions.add((player.x, player.y))