From 51765051b113c6f9b03027a85d32a76b6d5f02e8 Mon Sep 17 00:00:00 2001 From: kdang Date: Tue, 16 Dec 2025 09:23:39 -0500 Subject: [PATCH] @chris --- __pycache__/catcher.cpython-311.pyc | Bin 0 -> 3193 bytes __pycache__/fruit.cpython-311.pyc | Bin 0 -> 4430 bytes catcher.py | 48 +++++++++++++++++++ fruit.py | 70 ++++++++++++++++++++++++++++ game.py | 42 ++++++----------- nav.py | 2 +- 6 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 __pycache__/catcher.cpython-311.pyc create mode 100644 __pycache__/fruit.cpython-311.pyc create mode 100644 catcher.py create mode 100644 fruit.py diff --git a/__pycache__/catcher.cpython-311.pyc b/__pycache__/catcher.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea740a9e5f5602f44178cf52170900b4260d78cb GIT binary patch literal 3193 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 literal 0 HcmV?d00001 diff --git a/catcher.py b/catcher.py new file mode 100644 index 0000000..b6b0a80 --- /dev/null +++ b/catcher.py @@ -0,0 +1,48 @@ +class CatcherPiece: + character = "-" + color = "white_on_indigo" + def __init__(self, position): + self.position = position + +class Catcher: + width = 7 + display = False + pieces = [] + name = "Player" + 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": + if 0 < x: + self.position = (x-1, y) + self.update_piece_positions() + if keystroke.name == "KEY_RIGHT": + if x + self.width < width: + self.position = (x+1, y) + self.update_piece_positions() + + 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) diff --git a/fruit.py b/fruit.py new file mode 100644 index 0000000..0b7ced6 --- /dev/null +++ b/fruit.py @@ -0,0 +1,70 @@ +class FruitPiece: + character = "@" + color = "green_on_indigo" + def __init__(self, position): + self.position = position + +class Fruit: + width = 2 + height = 2 + display = False + pieces = [] + character = "@" + color = "green_on_indigo" + + def __init__(self, position): + self.position = position + + def play_turn(self, game): + if not self.pieces: + self.create_pieces(game) + if game.turn_number % 2 == 0: + x, y = self.position + if y == 24: + game.remove_agent(self) + else: + catcher = game.get_agent_by_name('catcher') + new_position = (x, y + 1) + if new_position == catcher.position: + catcher.explode() + game.end() + else: + self.position = new_position + + def create_pieces(self, game): + x, y = self.position + self.pieces = [] + for i in range(self.width): + piece = FruitPiece((x + i, y)) + self.pieces.append(piece) + game.add_agent(piece) + for i in range(self.height): + piece = FruitPiece((x, y + i)) + self.pieces.append(piece) + game.add_agent(piece) + + def update_piece_positions(self): + if game.turn_number % 2 == 0: + self.set_color() + x, y = self.position + if y == HEIGHT - 1: + game.remove_agent(self) + else: + ship = game.get_agent_by_name('ship') + new_position = (x, y + 1) + if new_position == ship.position: + ship.explode() + game.end() + else: + self.position = new_position + +class FruitSpawner: + display = False + + def play_turn(self, game): + if self.should_spawn_fruit(game.turn_number): + asteroid = Fruit((randint(0, WIDTH - 1), 0)) + game.add_agent(fruit) + + def should_spawn_fruit(self, turn_number): + return randint(0, 1000) < turn_number \ No newline at end of file diff --git a/game.py b/game.py index 3e25746..7b47540 100644 --- a/game.py +++ b/game.py @@ -1,32 +1,20 @@ from random import randint from retro.game import Game +from retro.graph import Graph +from catcher import Catcher +from fruit import Fruit -class Agent: - RIGHT = (1, 0) - UP = (0, -1) - LEFT = (-1, 0) - DOWN = (0, 1) - character = ">" - direction = RIGHT - position = (15, 0) - name = "agent" - color = "white_on_black" - display = True +g = Graph() +g.get_or_create_edge(26, 10, 26, 22) +agents = g.get_agents() +for agent in agents: + agent.color = "white_on_indigo" - def handle_keystroke(self, keystroke, game): - x, y = self.position - if keystroke.name == "M": - self.direction = self.RIGHT - self.character = '>' - elif keystroke.name == "I": - self.direction = self.LEFT - self.character = '<' +agents = [ + Catcher((14, 24)), + Fruit((14, 2)), +] - def can_move(self, position, game): - on_board = game.on_board(position) - empty = game.is_empty(position) - -if __name__ == '__main__': - player = Agent() - game = Game([player], {'score': 0}, board_size:=(24, 20), framerate:=12) - game.play() +state = {'Score': 0} +game = Game(agents, state, board_size=(35, 25), framerate=24, color="white_on_indigo") +game.play() \ No newline at end of file diff --git a/nav.py b/nav.py index 9ccab28..518baf9 100644 --- a/nav.py +++ b/nav.py @@ -2,7 +2,7 @@ from random import randint from retro.game import Game HEIGHT = 25 -WIDTH = 25 +WIDTH = 2 class Spaceship: """A player-controlled agent which moves left and right, dodging asteroids.