2020幻影围棋 围棋规则模块(二)
生活随笔
收集整理的這篇文章主要介紹了
2020幻影围棋 围棋规则模块(二)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
氣追蹤器的編寫
氣追蹤器類用于更新和記錄棋盤上每顆棋子的氣,以及群的信息。下面是其追蹤器的幾個(gè)屬性:
def __init__(self, groupIndexMap=None, groups=None, librtyCacheMap=None, maxGroupId=1):"""一個(gè)"自由度追蹤器"類,:param groupIndexMap: 一個(gè)棋盤(群的索引, 二維數(shù)組),上面用不同的數(shù)字(ID)標(biāo)明不同的群 例如1 1 1 11 2 2 11 2 1 1:param groups: 一個(gè)字典, 根據(jù)群的ID返回群:param librtyCacheMap: 記錄每個(gè)群的自由度(周圍相鄰且為EMPTY的點(diǎn)的數(shù)量, 二維數(shù)組):param maxGroupId: 記錄ID最大的群的ID"""self.groupIndexMap = groupIndexMap if groupIndexMap is not None else -np.ones([SIZE, SIZE], dtype=np.int16)self.groups = groups or {}self.libertyCacheMap = librtyCacheMap if librtyCacheMap is not None else np.zeros([SIZE, SIZE], dtype=np.uint8)self.maxGroupId = maxGroupId氣追蹤器通過一個(gè)工廠方法生成對象,這個(gè)工廠方法會從棋盤上的局勢來設(shè)置groupIndexMap和libertyCacheMap的值。
@staticmethoddef newTrackerFromBaseBoard(board=gf.Board.getStaticBaseBoard()):""":param board 默認(rèn)為基礎(chǔ)棋盤。從基礎(chǔ)棋盤上創(chuàng)建自由度追蹤器:return: LibertyTracker"""baseBoard = np.copy(board)curGroupId = 0libTracker = LibertyTracker()for color in (WHITE, BLACK):while color in baseBoard:curGroupId += 1foundColor = np.where(baseBoard == color)# point的值為第一個(gè)點(diǎn)point = foundColor[0][0], foundColor[1][0]chain, reached = findReached(point=point, baseBoard=baseBoard)# 相鄰且為EMPTY的點(diǎn)的集合liberties = set(r for r in reached if baseBoard[r] == EMPTY)newGroup = Group(curGroupId, chain, liberties, color)libTracker.groups[curGroupId] = newGroupfor c in chain:libTracker.groupIndexMap[c] = curGroupId#在另一張圖上標(biāo)注這里已經(jīng)有棋子了placeStones(baseBoard, FILL, chain)libTracker.maxGroupId = curGroupIdlibertyCounts = np.zeros([SIZE, SIZE], dtype=np.uint8)for group in libTracker.groups.values():# 一個(gè)群的自由度libNum = len(group.liberties)for s in group.stones:libertyCounts[s] = libNumlibTracker.libertyCacheMap = libertyCountsreturn libTracker氣追蹤器的deepcopy函數(shù):
def __deepcopy__(self, memodict={}):"""深層拷貝:param memodict::return: LibertyTracker"""newGroupIndexMap = np.copy(self.groupIndexMap)newLibertyCacheMap = np.copy(self.libertyCacheMap)newGroups = {group.id: Group(group.id, set(group.stones), set(group.liberties), group.color)for group in self.groups.values()}return LibertyTracker(newGroupIndexMap, newGroups, newLibertyCacheMap, maxGroupId=self.maxGroupId)氣追蹤器還有其它的方法沒有在這里介紹,可以用于普通圍棋的行棋,這里貼上Gitee地址感興趣的可以看看:
go_rules.py
Condition類的編寫
"""對棋面進(jìn)行分析的類baseBoard: 基礎(chǔ)棋盤, 這里直接為我們的基礎(chǔ)棋盤"""def __init__(self, baseBoard=None, libTracker=None, ourColor=None, opponentColor=None):self.baseBoard = baseBoard if baseBoard is not None else gf.Board.getStaticBaseBoard()self.libTracker = libTracker if libTracker is not None else LibertyTracker.newTrackerFromBaseBoard(self.baseBoard)self.ourColor = ourColor if ourColor is not None else gf.GameStatus.ourColorself.opponentColor = opponentColor if opponentColor is not None else gf.GameStatus.opponentColordef __deepcopy__(self, memodict={}):condition = Condition()condition.baseBoard = np.copy(self.baseBoard)condition.libTracker = copy.deepcopy(self.libTracker)condition.ourColor = copy.copy(self.ourColor)condition.opponentColor = copy.copy(self.opponentColor)return conditionCondition類只有兩個(gè)方法,用于判斷是否為禁著點(diǎn):
def isMoveSuicidal(self, move):"""判斷該行棋點(diǎn)是否為禁著點(diǎn):param move: 行棋的位置(元組對象,或者Point對象):return: 如果是禁著點(diǎn), 返回True, 否則返回False"""if isinstance(move, gf.Point):move = move.toTuple()potentialLibs = set()for p in NEIGHBORS[move]:neighborGroupId = self.libTracker.groupIndexMap[p]if neighborGroupId == MISSING_GROUP_ID:return FalseneighborGroup = self.libTracker.groups[neighborGroupId]if neighborGroup.color == self.ourColor:potentialLibs |= neighborGroup.libertieselif len(neighborGroup.liberties) == 1:return FalsepotentialLibs -= set([move])return not potentialLibsisMoveSuicidal方法會計(jì)算下棋點(diǎn)的潛在氣,也就是如果該點(diǎn)下了后能夠提子,雖然該點(diǎn)本身氣為0,但是可以下。
def isMoveLegal(self, move):"""判斷下棋點(diǎn)是否合法:param move: 下棋點(diǎn)(元組對象, 或者point對象):return:如果該下棋點(diǎn)合法,則返回True, 否則返回False"""if isinstance(move, gf.Point):move = move.toTuple()if move is None:return Trueif self.baseBoard[move] != EMPTY:return False# if move == self.ko:# if self.koTimes >= gf.GameStatus.koTimes:# return False# else:# return Trueif self.isMoveSuicidal(move):return Falsereturn TrueisMoveLegal是對isMoveSuicidal的進(jìn)一步封裝。
總結(jié)
以上是生活随笔為你收集整理的2020幻影围棋 围棋规则模块(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse快捷键及各种设置
- 下一篇: pikachu~~~XSS