日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020幻影围棋 围棋规则模块(二)

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020幻影围棋 围棋规则模块(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

氣追蹤器的編寫

氣追蹤器類用于更新和記錄棋盤上每顆棋子的氣,以及群的信息。下面是其追蹤器的幾個屬性:

def __init__(self, groupIndexMap=None, groups=None, librtyCacheMap=None, maxGroupId=1):"""一個"自由度追蹤器"類,:param groupIndexMap: 一個棋盤(群的索引, 二維數(shù)組),上面用不同的數(shù)字(ID)標(biāo)明不同的群 例如1 1 1 11 2 2 11 2 1 1:param groups: 一個字典, 根據(jù)群的ID返回群:param librtyCacheMap: 記錄每個群的自由度(周圍相鄰且為EMPTY的點的數(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

氣追蹤器通過一個工廠方法生成對象,這個工廠方法會從棋盤上的局勢來設(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的值為第一個點point = foundColor[0][0], foundColor[1][0]chain, reached = findReached(point=point, baseBoard=baseBoard)# 相鄰且為EMPTY的點的集合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():# 一個群的自由度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 condition

Condition類只有兩個方法,用于判斷是否為禁著點:

def isMoveSuicidal(self, move):"""判斷該行棋點是否為禁著點:param move: 行棋的位置(元組對象,或者Point對象):return: 如果是禁著點, 返回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 potentialLibs

isMoveSuicidal方法會計算下棋點的潛在氣,也就是如果該點下了后能夠提子,雖然該點本身氣為0,但是可以下。

def isMoveLegal(self, move):"""判斷下棋點是否合法:param move: 下棋點(元組對象, 或者point對象):return:如果該下棋點合法,則返回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 True

isMoveLegal是對isMoveSuicidal的進(jìn)一步封裝。

總結(jié)

以上是生活随笔為你收集整理的2020幻影围棋 围棋规则模块(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。