generated from mwc/project_game
111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
from random import randint
|
|
from .fruit import FruitPiece
|
|
|
|
class SliceEffectPiece:
|
|
character = "-"
|
|
color = "yellow_on_indigo"
|
|
z = 2
|
|
def __init__(self, position):
|
|
self.position = position
|
|
|
|
class SliceEffect:
|
|
display = False
|
|
|
|
def __init__(self, game):
|
|
self.pieces = []
|
|
self.turns_remaining = 8
|
|
width, height = game.board_size
|
|
for y in range(height - 3, height):
|
|
for x in range(width):
|
|
piece = SliceEffectPiece((x, y))
|
|
self.pieces.append(piece)
|
|
game.add_agent(piece)
|
|
|
|
def play_turn(self, game):
|
|
self.turns_remaining -= 1
|
|
if self.turns_remaining <= 0:
|
|
for piece in self.pieces:
|
|
game.remove_agent(piece)
|
|
game.remove_agent(self)
|
|
|
|
class CatcherPiece:
|
|
character = "-"
|
|
color = "white_on_indigo"
|
|
z = 1
|
|
def __init__(self, position):
|
|
self.position = position
|
|
|
|
class Catcher:
|
|
width = 6
|
|
display = False
|
|
pieces = []
|
|
name = "catcher"
|
|
color = "white_on_indigo"
|
|
|
|
def __init__(self, position):
|
|
self.position = position
|
|
|
|
def play_turn(self, game):
|
|
if not self.pieces:
|
|
self.create_pieces(game)
|
|
|
|
def handle_keystroke(self, keystroke, game):
|
|
x, y = self.position
|
|
width, height = game.board_size
|
|
if keystroke.name == "KEY_LEFT":
|
|
new_x = max(0, x - 3)
|
|
self.position = (new_x, y)
|
|
self.update_piece_positions()
|
|
self.check_fruit_collisions(game)
|
|
if keystroke.name == "KEY_RIGHT":
|
|
new_x = min(width - self.width, x + 3)
|
|
self.position = (new_x, y)
|
|
self.update_piece_positions()
|
|
self.check_fruit_collisions(game)
|
|
if str(keystroke) == 'z' and game.state['slices'] > 0:
|
|
game.state['slices'] -= 1
|
|
game.add_agent(SliceEffect(game))
|
|
self._slice_fruits(game)
|
|
|
|
def check_fruit_collisions(self, game):
|
|
agents_by_pos = game.get_agents_by_position()
|
|
seen = set()
|
|
for piece in self.pieces:
|
|
for agent in agents_by_pos.get(piece.position, []):
|
|
if isinstance(agent, FruitPiece) and agent.parent.alive and id(agent.parent) not in seen:
|
|
seen.add(id(agent.parent))
|
|
agent.parent.check_catcher_collision(game)
|
|
|
|
def _slice_fruits(self, game):
|
|
_, height = game.board_size
|
|
slice_rows = set(range(height - 3, height))
|
|
manager = game.get_agent_by_name("fruit_manager")
|
|
for fruit in list(manager.active_fruits):
|
|
if not fruit.alive:
|
|
continue
|
|
for piece in fruit.pieces.values():
|
|
if piece.position[1] in slice_rows:
|
|
game.state['score'] += 1
|
|
for p in fruit.pieces.values():
|
|
game.remove_agent(p)
|
|
game.remove_agent(fruit)
|
|
fruit.alive = False
|
|
break
|
|
|
|
def create_pieces(self, game):
|
|
x, y = self.position
|
|
self.pieces = []
|
|
for i in range(self.width):
|
|
piece = CatcherPiece((x + i, y))
|
|
self.pieces.append(piece)
|
|
game.add_agent(piece)
|
|
|
|
def update_piece_positions(self):
|
|
x, y = self.position
|
|
for i, piece in enumerate(self.pieces):
|
|
piece.position = (x + i, y)
|
|
|
|
def can_move(self, position, game):
|
|
on_board = game.on_board(position)
|
|
empty = game.is_empty(position)
|