Så kan et spil testes alene: vær vært og VIP selv, og lad bots være de andre spillere. Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
+35
-1
@@ -68,7 +68,15 @@ async def host(ws_base, code, seen: list, done: asyncio.Event):
|
||||
return
|
||||
|
||||
|
||||
async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: random.Random):
|
||||
async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: random.Random, stop_at_final=False):
|
||||
try:
|
||||
await _player(ws_base, code, name, n_players, done, rng, stop_at_final)
|
||||
except websockets.ConnectionClosed:
|
||||
print(f"[{name}] forbindelsen blev lukket (findes rummet?)")
|
||||
done.set()
|
||||
|
||||
|
||||
async def _player(ws_base, code, name, n_players, done, rng, stop_at_final):
|
||||
async with websockets.connect(f"{ws_base}/ws/play/{code}/") as ws:
|
||||
await ws.send(json.dumps({"action": "join", "name": name}))
|
||||
acted = set()
|
||||
@@ -80,10 +88,17 @@ async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: rando
|
||||
msg = json.loads(raw)
|
||||
if msg["type"] == "error":
|
||||
print(f"[{name}] fejl: {msg['code']} {msg['message']}")
|
||||
if msg["code"] == "unknown_room":
|
||||
done.set()
|
||||
return
|
||||
continue
|
||||
if msg["type"] != "state":
|
||||
continue
|
||||
st, me = msg["state"], msg["state"]["me"]
|
||||
if st["phase"] == "final" and stop_at_final:
|
||||
print(f"[{name}] slut: plads {next((r['place'] for r in st['final']['ranking'] if r['player_id'] == me['id']), '-')}")
|
||||
done.set()
|
||||
return
|
||||
key = (st["phase"], (st.get("round") or {}).get("number"), (st.get("round") or {}).get("question_number"))
|
||||
await asyncio.sleep(rng.uniform(0.05, 0.4))
|
||||
if st["phase"] == "lobby" and me["vip"] and len(st["players"]) >= n_players and key not in acted:
|
||||
@@ -116,8 +131,11 @@ async def main():
|
||||
ap.add_argument("--players", type=int, default=3)
|
||||
ap.add_argument("--audience", type=int, default=1)
|
||||
ap.add_argument("--seed", type=int, default=None)
|
||||
ap.add_argument("--code", help="join et eksisterende rum i stedet for at oprette et (du er selv vært/VIP)")
|
||||
args = ap.parse_args()
|
||||
rng = random.Random(args.seed)
|
||||
if args.code:
|
||||
return await join_existing(args, rng)
|
||||
code = create_room(args.base)
|
||||
print(f"Rum {code}")
|
||||
ws_base = args.base.replace("http", "ws", 1)
|
||||
@@ -151,5 +169,21 @@ async def main():
|
||||
return 0
|
||||
|
||||
|
||||
async def join_existing(args, rng):
|
||||
"""Bots fylder op i dit eget spil. De starter ikke spillet (det gør VIP'en, altså dig)."""
|
||||
ws_base = args.base.replace("http", "ws", 1)
|
||||
code, done = args.code.upper(), asyncio.Event()
|
||||
names = ["Bot-Bodil", "Bot-Kaj", "Bot-Lis", "Bot-Ib", "Bot-Mette", "Bot-Jørn", "Bot-Sus"][: args.players]
|
||||
tasks = [asyncio.create_task(player(ws_base, code, n, 99, done, rng, stop_at_final=True)) for n in names]
|
||||
print(f"{len(names)} bots joiner {code}. Start spillet fra din telefon eller storskærmen.")
|
||||
try:
|
||||
await asyncio.wait_for(done.wait(), timeout=3600)
|
||||
except asyncio.TimeoutError:
|
||||
return 1
|
||||
for t in tasks:
|
||||
t.cancel()
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(asyncio.run(main()))
|
||||
|
||||
Reference in New Issue
Block a user