From d8c05a659348eeae8ffdfb5540c3088a50cc9e9b Mon Sep 17 00:00:00 2001 From: fheinrich <fheinrich@techfak.uni-bielefeld.de> Date: Fri, 15 Dec 2023 14:09:20 +0100 Subject: [PATCH] If a player is not created with a specified location, a random emtpy tile is chosen. --- .../game_content/layouts/basic.layout | 22 +++++++++---------- overcooked_simulator/main.py | 9 +++++--- .../overcooked_environment.py | 14 ++++++++---- overcooked_simulator/player.py | 8 +++++-- overcooked_simulator/simulation_runner.py | 15 +++++++++++++ 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/overcooked_simulator/game_content/layouts/basic.layout b/overcooked_simulator/game_content/layouts/basic.layout index d26d3931..da7352dd 100644 --- a/overcooked_simulator/game_content/layouts/basic.layout +++ b/overcooked_simulator/game_content/layouts/basic.layout @@ -1,11 +1,11 @@ -___________ -_CCUCTCLCC_ -_C_______C_ -_C_______C_ -_W_________ -_C_________ -_P_________ -_C_______C_ -_C_______X_ -_CCBBCCCCC_ -___________ +__________________ +_CCUCTCLCC________ +_C_______C________ +_C_______C________ +_W________________ +_C________________ +_P________________ +_C_______C________ +_C_______X________ +_CCBBCCCCC________ +__________________ diff --git a/overcooked_simulator/main.py b/overcooked_simulator/main.py index 05d6f0c0..bd969d3c 100644 --- a/overcooked_simulator/main.py +++ b/overcooked_simulator/main.py @@ -1,6 +1,5 @@ import sys -import numpy as np import pygame from overcooked_simulator import ROOT_DIR @@ -13,8 +12,12 @@ def main(): simulator = Simulator(ROOT_DIR / "game_content" / "layouts" / "basic.layout", 600) player_one_name = "p1" player_two_name = "p2" - simulator.register_player(Player(player_one_name, np.array([350.0, 200.0]))) - simulator.register_player(Player(player_two_name, np.array([100.0, 200.0]))) + # simulator.register_player(Player(player_one_name, np.array([350.0, 200.0]))) + # simulator.register_player(Player(player_two_name, np.array([100.0, 200.0]))) + for i in range(90): + simulator.register_player(Player(f"p{i+3}")) + simulator.register_player(Player(player_one_name)) + simulator.register_player(Player(player_two_name)) # TODO maybe read the player names and keyboard keys from config file? keys1 = [ diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index d5d85442..35b78092 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -2,6 +2,7 @@ from __future__ import annotations from typing import TYPE_CHECKING +import numpy.typing as npt import yaml from overcooked_simulator.game_items import ItemInfo @@ -81,7 +82,7 @@ class Environment: ), # Stove with pot: U because it looks like a pot } - self.counters: list[Counter] = self.create_counters(self.layout_path) + self.counters, self.free_positions = self.create_counters(self.layout_path) self.score: int = 0 self.world_width: int = 800 self.world_height: int = 600 @@ -107,8 +108,9 @@ class Environment: Args: layout_file: Path to the layout file. """ - current_y = self.counter_side_length / 2 - counters = [] + current_y: float = self.counter_side_length / 2 + counters: list[Counter] = [] + free_positions: list[npt.NDArray] = [] with open(layout_file, "r") as layout_file: lines = layout_file.readlines() @@ -122,9 +124,13 @@ class Environment: if counter_class is not None: counter = counter_class(pos) counters.append(counter) + else: + free_positions.append(np.array([current_x, current_y])) current_x += self.counter_side_length current_y += self.counter_side_length - return counters + + + return counters, free_positions def perform_action(self, action: Action): """Performs an action of a player in the environment. Maps different types of action inputs to the diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py index ce7a7497..b1b8afdb 100644 --- a/overcooked_simulator/player.py +++ b/overcooked_simulator/player.py @@ -14,9 +14,13 @@ class Player: """ - def __init__(self, name: str, pos: npt.NDArray[float]): + def __init__(self, name: str, pos: Optional[npt.NDArray[float]] = None): self.name: str = name - self.pos: npt.NDArray[float] = np.array(pos, dtype=float) + if pos is not None: + self.pos: npt.NDArray[float] = np.array(pos, dtype=float) + else: + self.pos = None + self.holding: Optional[Item] = None self.radius: int = 18 diff --git a/overcooked_simulator/simulation_runner.py b/overcooked_simulator/simulation_runner.py index 6c9cf367..dbb3d4c4 100644 --- a/overcooked_simulator/simulation_runner.py +++ b/overcooked_simulator/simulation_runner.py @@ -1,3 +1,4 @@ +import random import time from threading import Thread @@ -73,6 +74,13 @@ class Simulator(Thread): # print(f"Added player {player.name} to the game.") self.env.players[player.name] = player + if player.pos is None: + if len(self.env.free_positions) > 0: + free_idx = random.randint(0, len(self.env.free_positions) - 1) + player.move_abs(self.env.free_positions[free_idx]) + del self.env.free_positions[free_idx] + else: + print("No free positions left in kitchens.") def register_players(self, players: list[Player]): """Registers multiple players from a list @@ -86,6 +94,13 @@ class Simulator(Thread): def run(self): """Starts the simulator thread. Runs in a loop until stopped.""" + + for p in self.env.players.values(): + print(p.pos) + assert all( + p.pos is not None for p in self.env.players.values() + ), "At least one player position not initialized" + overslept_in_ns = 0 while not self.finished: -- GitLab