2020幻影围棋 第三天围棋规则模块(一)
生活随笔
收集整理的這篇文章主要介紹了
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是這個命名元組的名稱,后面接了他的四個屬性。
基于這個數據結構我們可以構造一個氣追蹤器類,用于記錄和更新棋盤上棋子的氣。
首先來看這個靜態方法,這個靜態方法用于根據當前棋面生產出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, diffColorReachedfindReached方法用深搜的方法得到一個群的集合,以及群周圍一圈位置的集合。
LibertyTrakcer的構造函數:
總結
以上是生活随笔為你收集整理的2020幻影围棋 第三天围棋规则模块(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令之read命令
- 下一篇: 网络编程传输层——UDP通信