145 lines
4.7 KiB
Python
145 lines
4.7 KiB
Python
"""
|
|
Author: freezed <freezed@users.noreply.github.com> 2018-04-04
|
|
Version: 0.1
|
|
Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/
|
|
|
|
This file is part of [_ocp3_ project](https://github.com/freezed/ocp3)
|
|
"""
|
|
from conf import (
|
|
elmt_val, MSG_COLLECT, MSG_LOSER, MSG_OK, MSG_WALL, MSG_WINNER,
|
|
HEAD_MESSAGES
|
|
)
|
|
from pygame.locals import K_UP, K_DOWN, K_RIGHT, K_LEFT
|
|
|
|
|
|
class Player:
|
|
"""
|
|
Managing the player movement
|
|
"""
|
|
|
|
def __init__(self, maze):
|
|
"""
|
|
Creates a player in the given maze
|
|
|
|
:param obj maze: Maze object
|
|
"""
|
|
self.maze = maze
|
|
self.current_position = maze.string.find(
|
|
elmt_val('symbol', 'name', 'player', 0)
|
|
)
|
|
self.old_position = None
|
|
|
|
# Element under player, default 'floor'
|
|
self.ground = elmt_val('symbol', 'name', 'floor', 0)
|
|
|
|
# Colleted items
|
|
self.stock = []
|
|
self.stock_num = 0
|
|
|
|
# Contextual messages to display on each turn
|
|
self.status_message = {}
|
|
self.status_message['title'] = HEAD_MESSAGES['title']
|
|
self.status_message['status'] = HEAD_MESSAGES['status']
|
|
self.status_message['items'] = HEAD_MESSAGES['items'].format(
|
|
self.stock_num, maze.MAX_ITEMS
|
|
)
|
|
|
|
def key_event(self, pressed_key):
|
|
"""
|
|
Sets value of the new position and passes it to `move_to()`
|
|
|
|
:param int pressed_key: direction (pygame const)
|
|
"""
|
|
if pressed_key == K_UP:
|
|
self.move_to(self.current_position - self.maze.COL_NB)
|
|
|
|
elif pressed_key == K_DOWN:
|
|
self.move_to(self.current_position + self.maze.COL_NB)
|
|
|
|
elif pressed_key == K_RIGHT:
|
|
self.move_to(self.current_position + 1)
|
|
|
|
elif pressed_key == K_LEFT:
|
|
self.move_to(self.current_position - 1)
|
|
|
|
# ++Add other treatment for key events here (help, menu, etc.)++
|
|
|
|
def move_to(self, next_position):
|
|
"""
|
|
Next position treatment
|
|
|
|
For each movement, it checks the next symbol on the maze and
|
|
apply the corresponding rule:
|
|
- set the new position
|
|
- updates messages
|
|
- collect item (if any)
|
|
- set symbol of the leaved position
|
|
- stop the game (win or lose)
|
|
|
|
:param int next_position: index in self.maze.string
|
|
"""
|
|
# in the string range
|
|
if next_position in self.maze.RANGE:
|
|
next_symbol = self.maze.string[next_position]
|
|
|
|
self.old_position = self.current_position
|
|
|
|
# 'floor' element
|
|
if next_symbol == elmt_val('symbol', 'name', 'floor', 0):
|
|
self.current_position = next_position
|
|
self.status_message['status'] = MSG_OK
|
|
|
|
# 'item' element
|
|
elif next_symbol in elmt_val('symbol', 'item', True):
|
|
self.current_position = next_position
|
|
self.stock.append(
|
|
elmt_val('name', 'symbol', next_symbol, 0)
|
|
)
|
|
self.stock_num += 1
|
|
self.status_message['status'] = MSG_COLLECT.format(
|
|
elmt_val('name', 'symbol', next_symbol, 0)
|
|
)
|
|
self.status_message['items'] \
|
|
= HEAD_MESSAGES['items'].format(
|
|
self.stock_num, self.maze.MAX_ITEMS
|
|
)
|
|
|
|
# 'guard' element
|
|
elif next_symbol == elmt_val('symbol', 'name', 'guard', 0):
|
|
self.maze.status = False
|
|
|
|
# all 'item' are collected : player wins
|
|
if sorted(self.stock) == sorted(
|
|
elmt_val('name', 'item', True)):
|
|
self.status_message['status'] = MSG_WINNER
|
|
|
|
# player lose
|
|
else:
|
|
missed_item_flist = ', '.join((item for item in elmt_val(
|
|
'name', 'item', True
|
|
) if item not in self.stock))
|
|
self.status_message['status'] = MSG_LOSER.format(
|
|
missed_item_flist
|
|
)
|
|
|
|
# for all other element (wall or nline)
|
|
else:
|
|
self.status_message['status'] = MSG_WALL
|
|
self.old_position = None
|
|
|
|
|
|
# out the string range
|
|
else:
|
|
self.status_message['status'] = MSG_WALL
|
|
self.old_position = None
|
|
|
|
# Replaces player symbol in maze.string by 'ground' value
|
|
self.maze.string = self.maze.string.replace(
|
|
elmt_val('symbol', 'name', 'player', 0), self.ground
|
|
)
|
|
|
|
# Sets the player's new position in maze.string
|
|
self.maze.set_symbol(
|
|
elmt_val('symbol', 'name', 'player', 0), self.current_position
|
|
)
|