use WerewolfEnv

This commit is contained in:
better629 2024-04-08 19:38:37 +08:00
parent 05b0f5782b
commit f54bb159b5
9 changed files with 67 additions and 200 deletions

View file

@ -1,51 +1,12 @@
import asyncio
import random
import fire
from metagpt.ext.werewolf.roles import Guard, Moderator, Seer, Villager, Werewolf, Witch
from metagpt.ext.werewolf.roles.human_player import prepare_human_player
from metagpt.ext.werewolf.werewolf_game import WerewolfGame
from metagpt.logs import logger
def init_game_setup(
shuffle=True,
add_human=False,
use_reflection=True,
use_experience=False,
use_memory_selection=False,
new_experience_version="",
):
roles = [Villager, Villager, Werewolf, Werewolf, Guard, Seer, Witch]
if shuffle:
# random.seed(2023)
random.shuffle(roles)
if add_human:
assigned_role_idx = random.randint(0, len(roles) - 1)
assigned_role = roles[assigned_role_idx]
roles[assigned_role_idx] = prepare_human_player(assigned_role)
players = [
role(
name=f"Player{i+1}",
use_reflection=use_reflection,
use_experience=use_experience,
use_memory_selection=use_memory_selection,
new_experience_version=new_experience_version,
)
for i, role in enumerate(roles)
]
if add_human:
logger.info(f"You are assigned {players[assigned_role_idx].name}({players[assigned_role_idx].profile})")
game_setup = ["Game setup:"] + [f"{player.name}: {player.profile}," for player in players]
game_setup = "\n".join(game_setup)
return game_setup, players
async def start_game(
investment: float = 3.0,
n_round: int = 5,
@ -57,7 +18,10 @@ async def start_game(
new_experience_version: str = "",
):
game = WerewolfGame()
game_setup, players = init_game_setup(
game_setup, players = game.env.init_game_setup(
role_uniq_objs=[Villager, Werewolf, Guard, Seer, Witch],
num_werewolf=2,
num_villager=2,
shuffle=shuffle,
add_human=add_human,
use_reflection=use_reflection,
@ -65,10 +29,12 @@ async def start_game(
use_memory_selection=use_memory_selection,
new_experience_version=new_experience_version,
)
logger.info(f"game_setup\n{game_setup}")
players = [Moderator()] + players
game.hire(players)
game.invest(investment)
game.start_project(game_setup)
game.run_project(game_setup)
await game.run(n_round=n_round)