"""Fresh-process duplicate-deal comparison against RLCard's original rule bot. Example: .venvs/doudizhu/bin/python games/doudizhu/tests/compare.py --output /tmp/ddz.json The new bot occupies each seat once; the other seats use independent rule bots. """ import argparse import json import pathlib import sys import time import rlcard ROOT = pathlib.Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / 'referee')) from play import player, game parser = argparse.ArgumentParser() parser.add_argument('--start', type=int, default=101) parser.add_argument('--deals', type=int, default=20) parser.add_argument('--output', type=pathlib.Path) args = parser.parse_args() if not 1 <= args.deals <= 100: parser.error('--deals must be between 1 and 100') results, started = [], time.monotonic() for seed in range(args.start, args.start + args.deals): for seat in range(3): bots = [] try: for s in range(3): bots.append(player(str(ROOT / 'field' / ('strategic' if s == seat else 'rule')))) scores, replay = game(rlcard.make('doudizhu'), bots, seed) results.append({'seed': seed, 'seat': seat, 'won': scores[seat] > 0, 'points': scores[seat], 'fallbacks': sum(replay['fallbacks'])}) finally: for bot in bots: bot.close() print(json.dumps({'games': len(results), 'wins': sum(r['won'] for r in results)}), flush=True) summary = {'games': len(results), 'wins': sum(r['won'] for r in results), 'mean_points': sum(r['points'] for r in results) / len(results), 'fallbacks': sum(r['fallbacks'] for r in results), 'seconds': time.monotonic() - started} print(json.dumps(summary)) if args.output: args.output.write_text(json.dumps({'summary': summary, 'games': results}, indent=2))