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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020幻影围棋 第三天围棋规则模块(一)

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

圍棋規則其實很簡單,首先每個棋子會有氣,相連的一片棋子共用氣,那么基于這個規則我們可以構造這樣一個Group類:

class Group(namedtuple('Group',['id', 'stones', 'liberties', 'color'] )):"""++++++++..++++..+++*++++上面那些點就構成了一個群群: 一個群就是一大片連著的相同顏色的棋子:stones 群內棋子的集合:liberties 群周圍相鄰且沒有棋子的點的集合:color 群內棋子的顏色"""def __eq__(self, other):return self.stones == other.stones and self.liberties == other.liberties and self.color == other.color

這個群是一個命名元組類,Group是這個命名元組的名稱,后面接了他的四個屬性。
基于這個數據結構我們可以構造一個氣追蹤器類,用于記錄和更新棋盤上棋子的氣。

class LibertyTracker(object):@staticmethoddef newTrackerFromBaseBoard(board=gf.Board.getStaticBaseBoard())def __init__(self, groupIndexMap=None, groups=None, librtyCacheMap=None, maxGroupId=1)def __deepcopy__(self, memodict={})def addStone(self, color, point, phantom=True)def _handleCaptures(self, capturedStones)def _createGroup(self, color, point, liberties)def _delGroup(self, groupId)def _captureGroup(self, groupId, phantom)def _mergeGroup(self, group1Id, group2Id)def _updateLiberties(self, groupId, add=None, remove=None)

首先來看這個靜態方法,這個靜態方法用于根據當前棋面生產出LibertyTrakcer:

@staticmethoddef newTrackerFromBaseBoard(board=gf.Board.getStaticBaseBoard()):""":param board 默認為基礎棋盤。從基礎棋盤上創建自由度追蹤器: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#在另一張圖上標注這里已經有棋子了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

該方法會遍歷棋盤上的棋子,用findReached方法:

def findReached(point, baseBoard=gf.Board.baseBoard):"""深搜返回當前點相同顏色(WHITE,BLACK,EMPTY)所連成的鏈以及相鄰不同顏色的集合(WHITE,BLACK,EMPTY):param baseBoard:基礎棋盤(二維數組):param point:當前點(元組對象):return: sameColorChain: 相同顏色連成的一片點的集合 diffColorReached: 相鄰不同顏色的點的集合"""if isinstance(point, gf.Point):point = point.toTuple()color = baseBoard[point]sameColorChain = set([point])diffColorReached = set()frontier = [point]while frontier:cur = frontier.pop()sameColorChain.add(cur)for p in NEIGHBORS[cur]:if baseBoard[p] == color and not p in sameColorChain:frontier.append(p)elif baseBoard[p] != color:diffColorReached.add(p)return sameColorChain, diffColorReached

findReached方法用深搜的方法得到一個群的集合,以及群周圍一圈位置的集合。
LibertyTrakcer的構造函數:

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。