def __init__(self, player0, player1): ''' 初始化, player0 和 player1 为两个参赛AI ''' self.rounds = c.ROUNDS # 总回合数 self.maxtime = c.MAXTIME # 总时间限制 self.winner = None # 胜利者 self.violator = None # 违规者 self.timeout = None # 超时者 self.player = [player0, player1] # 参赛AI self.currentRound = 0 # 当前轮数 self.change = False # 监控棋盘是否改变 self.next = (None, None) # 按照随机序列得到的下一个位置 self.log = [] # 日志, &d 决策 decision, &p 棋盘 platform, &e 事件 event self.board = c.Chessboard(c.ARRAY) # 棋盘
def __init__(self, states, match, livequeue, toSave, MAXTIME, ROUNDS): ''' 初始化 -> 参数: states 保存先后手方模块元信息的字典 -> 参数: match 比赛名称 -> 参数: livequeue 直播通信队列 -> 参数: toSave 是否保存为记录文件 -> 参数: MAXTIME 最大时间限制 -> 参数: ROUNDS 总回合数 ''' # 生成覆盖随机序列 from random import randrange c.ARRAY = tuple(randrange(720720) for _ in range(ROUNDS)) # 超时异常 class Timeout(Exception): pass # 返回值 class Result: def __init__(self, func): self.func = func self.result = Timeout() def call(self, *args, **kwargs): self.result = self.func(*args, **kwargs) # 超时退出的装饰器 import threading def timeoutManager(maxtime, isFirst): def decorator(func): def wrappedFunc(*args, **kwargs): result = Result(func) thread = threading.Thread(target=result.call, args=(*args, ), kwargs={**kwargs}) thread.setDaemon(True) thread.start() thread.join(maxtime - self.states[isFirst]['time']) if isinstance(result.result, Timeout): self.states[isFirst]['time'] = maxtime return result.result return wrappedFunc return decorator # 监测运行状态的装饰器 import traceback def stateManager(isFirst): def decorator(func): @timeoutManager(MAXTIME * 1.1, isFirst) def wrappedFunc(*args, **kwargs): try: begin = time.perf_counter() result = func(*args, **kwargs) end = time.perf_counter() self.states[isFirst]['time'] += end - begin except Exception as exception: result = None self.states[isFirst]['error'] = True self.states[isFirst][ 'exception'] = traceback.format_exc() self.exception[isFirst] = exception return result return wrappedFunc return decorator self.manager = stateManager # 构建一个日志类, 可以实现直播功能 class Log(list): def __init__(self, parent): list.__init__(self, []) self.parent = parent Log.add = Log._add if parent.livequeue != None else list.append def _add(self, log): self.append(log) self.parent.livequeue.put(self.parent) time.sleep(c.SLEEP) self.states = states # 参赛AI运行状态 self.match = match # 比赛名称 self.livequeue = livequeue # 直播工具 self.toSave = toSave # 保存记录文件 self.maxtime = MAXTIME # 最大时间限制 self.rounds = ROUNDS # 总回合数 self.winner = None # 胜利者 self.violator = None # 违规者 self.timeout = None # 超时者 self.error = None # 报错者 self.currentRound = 0 # 当前轮数 self.change = False # 监控棋盘是否改变 self.next = (None, None) # 按照随机序列得到的下一个位置 self.board = c.Chessboard(c.ARRAY) # 棋盘 self.log = Log(self) # 日志, &d 决策 decision, &p 棋盘 platform, &e 事件 event self.exception = {True: None, False: None} # exception