Files
@ 4e67f9e9f027
Branch filter:
Location: OneEye/src/go/engine.py - annotation
4e67f9e9f027
2.3 KiB
text/x-python
Engine.listRelevantMoves
7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 7f1984280936 7f1984280936 4e67f9e9f027 4e67f9e9f027 7f1984280936 4e67f9e9f027 4e67f9e9f027 7f1984280936 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 4e67f9e9f027 7f1984280936 7f1984280936 7f1984280936 4e67f9e9f027 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 4e67f9e9f027 4e67f9e9f027 4e67f9e9f027 7f1984280936 7f1984280936 7f1984280936 4e67f9e9f027 7f1984280936 7f1984280936 7f1984280936 7f1984280936 7f1984280936 | import core
def transitionSequence(state1, state2, diff, limit=0):
return []
class SpecGo(core.Go):
def __init__(self):
super().__init__()
def load(self,state):
for (r,row) in enumerate(state):
for (c,x) in enumerate(row):
self.board[r][c]=x
def listRelevantMoves(self,diff):
"""There can be 3 different changes in the diff: additions, deletions and replacements.
Additions can be taken as relevant right away.
Deletions and replacements had to be captured, so we add their liberties.
Also any non-missing stones of partially deleted (or replaced) groups had to be replayed, so add them too.
Needs to handle: Take n, return 1. Snapback.
There's no end to what could be theoretically relevant, but such sequences are long and we will pretend they won't happen."""
res=(set(),set())
for d in diff:
(r,c,action,color)=d
colorKey=(1-color)<<1 # {-1,1}->{1,0}
if action!="-" and (r,c) not in res[colorKey]:
res[colorKey].append((r,c))
# this is rather sloppy but correct. the time will show if it is effective enough
if action!="+" and (r,c) not in res[colorKey] and (r,c) not in res[1-colorKey]:
self._helper.clear()
self._helper.floodFill(color if action=="-" else 1-color, r, c)
res[colorKey].union(self._helper.getContinuousArea())
for (ri,ci) in self._helper.getContinuousArea():
res[colorKey].add((ri,ci))
res[1-colorKey].add((ri,ci))
if ri>0:
res[colorKey].add((ri-1,ci))
res[1-colorKey].add((ri-1,ci))
if ri<self.boardSize:
res[colorKey].add((ri+1,ci))
res[1-colorKey].add((ri+1,ci))
if ci>0:
res[colorKey].add((ri,ci-1))
res[1-colorKey].add((ri,ci-1))
if ci<self.boardSize:
res[colorKey].add((ri,ci+1))
res[1-colorKey].add((ri,ci+1))
return res
class Engine:
def __init__(self):
self._g=SpecGo()
self._moveList=(set(),set())
def load(self,state1,diff):
self._g.load(state1)
self._moveList=self._g.listRelevantMoves(diff)
def iterativelyDeepen(self,state2):
for i in range(1,10):
seq=self.dfs(state2,i)
if seq: return seq
def dfs(self,state2,limit):
g=self._g
for (r,c) in self._moveList[g.toMove]:
g.doMove(g.toMove,r,c)
if g.board==state2: return [(r,c)]
if limit>1:
seq=self.dfs(state2,limit-1)
if seq:
seq.append((r,c))
return seq
g.undoMove(m)
return False
eng=Engine()
|