Skip to content

szqjl/yifeiAI-gd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

176 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

掼蛋AI客户端

Python License

南京邮电大学掼蛋AI算法对抗平台的客户端实现,支持AI自动出牌决策、自我对弈、数据收集和平台信息监控。

📋 目录


📖 项目简介

项目目标

  • 开发符合南京邮电大学掼蛋AI平台的客户端
  • 实现AI自动出牌决策
  • 支持自我对弈和数据收集
  • 可扩展的架构设计
  • 平台动态信息监控

平台信息


🚀 快速开始

环境要求

  • Python 3.8+
  • Windows / Linux
  • 网络连接(用于平台信息监控)

安装步骤

  1. 克隆项目
git clone https://gitee.com/Philsz/yifei-ai-gd.git
cd YiFeiAI-GD
  1. 安装依赖
pip install -r requirements.txt
  1. 配置设置
# 复制配置文件模板
cp config.yaml.example config.yaml
# 编辑配置文件
vim config.yaml
  1. 运行程序
python main.py

依赖包

  • websockets / websocket-client - WebSocket通信
  • requests / httpx - HTTP请求(信息监控)
  • beautifulsoup4 / lxml - HTML解析(信息监控)
  • schedule / APScheduler - 定时任务(信息监控)
  • pyyaml - 配置文件解析

⚠️ 重要规则

🔴 核心规则(必须遵守)

1. 时间处理规则(强制要求)

所有涉及当前时间、实时时间的场景必须调用系统时间API,禁止使用硬编码时间。

✅ 正确做法
from datetime import datetime

# 获取当前时间
current_time = datetime.now()

# 获取当前时间戳
timestamp = datetime.now().timestamp()

# 格式化当前时间
formatted_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# 判断是否在静默时段
def is_quiet_hours():
    now = datetime.now()  # 必须调用系统时间
    hour = now.hour
    return 0 <= hour < 6

# 计算下次检查时间
def schedule_next_check(interval):
    next_time = datetime.now() + timedelta(seconds=interval)  # 基于当前时间计算
    return next_time
❌ 错误做法
# 禁止硬编码时间
current_time = "2025-01-01 12:00:00"  # ❌ 错误

# 禁止使用固定时间戳
timestamp = 1704067200  # ❌ 错误

# 禁止在代码中写死时间
if hour == 12:  # ❌ 错误,应该从系统时间获取
适用场景
  • ✅ 日志时间戳:datetime.now()
  • ✅ 信息抓取时间:datetime.now()
  • ✅ 静默时段判断:datetime.now().hour
  • ✅ 定时任务调度:基于datetime.now()计算
  • ✅ 数据记录时间:datetime.now()
  • ✅ 文件命名时间戳:datetime.now().strftime('%Y%m%d_%H%M%S')
  • ❌ 历史日期记录:可以使用固定日期(如"2025年10月5日"这样的具体历史时间)

2. JSON格式规则

  • 严格遵循平台JSON格式要求
  • 所有消息必须符合平台规范
  • 消息格式验证必须通过

3. 组队规则

  • 第1个和第3个连接的AI自动为一队
  • 第2个和第4个连接的AI自动为一队
  • 必须正确识别队友并配合

4. 响应时间规则

  • 决策响应时间建议 < 1秒
  • 避免超时导致判负

5. 信息监控规则

  • 检查间隔 ≥ 6小时
  • 每日 0:00-6:00 为静默时段,不进行检查
  • 遵守网站使用条款,不造成服务器压力

✨ 功能特性

核心功能

  • ✅ WebSocket通信(本地/局域网)
  • ✅ 完整牌型识别(Single/Pair/Trips等)
  • ✅ 牌型比较和压制判断
  • ✅ AI决策引擎(策略评估、出牌决策、配合策略)
  • ✅ 游戏状态管理
  • ✅ 错误处理和自动重连

扩展功能

  • ✅ 对局记录和数据收集
  • ✅ 平台信息监控(自动抓取平台动态)
  • ✅ 信息通知(控制台/日志/可选邮件)
  • ✅ 日志系统

📁 项目结构

guandan_ai_client/
├── main.py                 # 主程序入口
├── config.yaml             # 配置文件
├── requirements.txt        # 依赖包
├── README.md              # 说明文档(本文件)
│
├── docs/                    # 文档目录
│   ├── 掼蛋AI客户端架构方案.md
│   ├── 掼蛋AI比赛参赛指南.md
│   └── 掼蛋AI相关比赛汇总.md
│
├── src/
│   ├── communication/      # 通信模块
│   ├── game_logic/         # 游戏逻辑模块
│   ├── decision/           # 决策引擎模块
│   ├── data/               # 数据收集模块
│   ├── monitor/            # 信息监控模块
│   └── utils/              # 工具模块
│
├── tests/                  # 测试代码
├── data/                   # 数据目录
│   ├── replays/           # 回放文件
│   └── platform_info/     # 平台信息存储
└── logs/                   # 日志目录

详细结构说明请参考 架构方案文档


⚙️ 配置说明

基本配置

# config.yaml
platform:
  name: "南京邮电大学掼蛋AI平台"
  version: "v1006"
  url: "https://gameai.njupt.edu.cn/gameaicompetition/gameGD/index.html"

websocket:
  local_url: "ws://127.0.0.1:23456/game/{user_info}"
  network_url: "ws://[局域网IP]:23456/game/{user_info}"
  reconnect_interval: 5
  heartbeat_interval: 30
  timeout: 10

ai:
  strategy_level: "medium"  # basic/medium/advanced
  cooperation_enabled: true
  risk_tolerance: 0.5
  max_decision_time: 1.0  # 最大决策时间(秒)

info_monitor:
  enabled: true  # 是否启用信息监控
  check_interval: 21600  # 检查间隔(秒),默认6小时(≥6小时)
  quiet_hours:  # 静默时段,不进行检查
    enabled: true
    start: "00:00"  # 静默开始时间(24小时制)
    end: "06:00"    # 静默结束时间(24小时制)

配置说明


📖 使用指南

基本使用

  1. 启动客户端
python main.py
  1. 连接平台

    • 本地测试:使用 ws://127.0.0.1:23456/game/{user_info}
    • 局域网对战:使用 ws://[局域网IP]:23456/game/{user_info}
  2. 查看日志

    • 日志文件:logs/ai_client.log
    • 控制台输出:根据配置显示

信息监控

信息监控功能会自动在后台运行,定期检查平台动态:

  • 检查频率: 每6小时(≥6小时)
  • 静默时段: 每日 0:00-6:00 不进行检查
  • 通知方式: 控制台输出、日志记录
  • 信息存储: data/platform_info/ 目录

手动触发检查

from src.monitor.fetcher import PlatformInfoFetcher

fetcher = PlatformInfoFetcher()
updates = fetcher.check_updates()

📝 开发规范

代码规范

  • 遵循 PEP 8 Python代码规范
  • 使用类型提示(Type Hints)
  • 编写清晰的注释和文档字符串

文档规范

  • 文档尽量简洁:避免一次性生成过长文档导致超时
  • 先列提纲再填充:先创建文档框架和提纲并保存,再逐步填充内容
  • 定期保存:每3分钟保存一次,避免长时间编辑导致内容丢失
  • 遵守时间规范:文档中的时间信息应使用系统时间API,禁止硬编码时间

时间处理规范(重要)

必须使用系统时间API

from datetime import datetime, timedelta

# ✅ 正确:使用系统时间
current_time = datetime.now()
timestamp = datetime.now().timestamp()

# ✅ 正确:基于当前时间计算
next_check = datetime.now() + timedelta(hours=6)

# ✅ 正确:判断当前时间
if datetime.now().hour < 6:
    # 静默时段处理
    pass

# ❌ 错误:硬编码时间
fixed_time = "2025-01-01 12:00:00"  # 禁止

# ❌ 错误:使用固定时间戳
fixed_timestamp = 1704067200  # 禁止

时间处理工具函数示例

from datetime import datetime, timedelta

def get_current_time() -> datetime:
    """获取当前系统时间"""
    return datetime.now()

def get_current_timestamp() -> float:
    """获取当前时间戳"""
    return datetime.now().timestamp()

def format_time(dt: datetime = None) -> str:
    """格式化时间"""
    if dt is None:
        dt = datetime.now()  # 默认使用当前时间
    return dt.strftime('%Y-%m-%d %H:%M:%S')

def is_quiet_hours(current_time: datetime = None) -> bool:
    """判断是否在静默时段(0:00-6:00)"""
    if current_time is None:
        current_time = datetime.now()  # 必须调用系统时间
    hour = current_time.hour
    return 0 <= hour < 6

测试规范

  • 编写单元测试
  • 进行集成测试
  • 性能测试(响应时间<1秒)

提交规范

  • 代码必须通过所有测试
  • 遵循时间处理规则
  • 完整的日志记录
  • 清晰的提交信息

🔧 开发指南

开发环境搭建

  1. 安装Python

    • Python 3.8 或更高版本
    • 推荐使用虚拟环境
  2. 安装依赖

pip install -r requirements.txt
  1. 配置开发环境
    • 配置IDE(推荐VS Code或PyCharm)
    • 配置代码格式化工具
    • 配置代码检查工具

开发流程

  1. 阅读文档

  2. 开发功能

    • 按照架构设计实现各模块
    • 遵循开发规范
    • 编写测试代码
  3. 测试验证

    • 本地测试
    • 完整对局测试
    • 稳定性测试

常见问题

Q: 如何获取当前时间? A: 必须使用 datetime.now() 获取系统时间,禁止硬编码。

Q: 信息监控的检查频率是多少? A: 默认6小时(≥6小时),且每日0:00-6:00为静默时段不检查。

Q: 如何判断是否在静默时段? A: 使用 datetime.now().hour 获取当前小时,判断是否在0-6之间。

Q: 组队规则是什么? A: 第1、3个连接为一队,第2、4个连接为一队。


📚 参考资料

官方资源

游戏规则

  • 江苏省体育局掼蛋竞赛简易规则
  • v1006版本特殊规则(抗贡规则调整)

技术文档

技术参考

  • WebSocket协议文档
  • JSON格式规范
  • Python官方文档

📄 许可证

本项目采用 MIT 许可证。


🤝 贡献

欢迎提交Issue和Pull Request!

贡献指南

  1. Fork 本项目: https://gitee.com/Philsz/yifei-ai-gd
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 在Gitee上开启 Pull Request

仓库信息

注意: 提交代码前请确保:

  • ✅ 遵循时间处理规则(必须调用系统时间API)
  • ✅ 代码通过所有测试
  • ✅ 遵循代码规范
  • ✅ 更新相关文档

📞 联系方式


📌 重要提醒

⚠️ 必须遵守的规则

  1. 时间处理: 所有涉及当前时间的场景必须调用系统时间API(datetime.now()),禁止硬编码时间
  2. JSON格式: 严格按照平台JSON格式要求
  3. 组队规则: 正确识别队友(1-3一队,2-4一队)
  4. 响应时间: 决策响应时间建议<1秒
  5. 信息监控: 检查间隔≥6小时,静默时段(0:00-6:00)不检查

✅ 开发建议

  • 先实现基础功能,确保能正常连接和通信
  • 逐步优化,先实现基本策略,再逐步优化
  • 充分测试,本地完整测试后再提交
  • 保持联系,遇到问题及时联系主办方

最后更新: 2025年1月
文档版本: v1.0
平台版本: v1006

About

guandanAI

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages