Beispiel #1
0
 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)  # 棋盘
Beispiel #2
0
    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