囲碁クエストの対局結果を表示するプログラムをcolaboratoryで作成してみました。
1)囲碁クエストで対局
2)結果をgoogle driveにアップしてダウンロード
3)対戦データを文字列変数化
4)データーをプログラムにしやすいように変換
5)9x9の盤面データを作成して打ち手を置いていく
6)最後に結果表示
ここまでが最初のリストです。まだ取りの判定が入っていません。
検証用の対局後の画像
取りの判定は迷路の探索と同じアルゴリズム
打った石の周り(上下左右)に石があれば探索スタートです。
上下左右に同じ色の石を探索していき、空きがあれば探索終了
空きがなければ、探索した石を取って、その数を計算しています。
def get(board,p):
#検索して空きがなければ取りになる 自爆手はないものとする
if board[p] in [".","#"]:return 0,0,board
sp,dp=[p],[p]
koma=board[p]
while sp!=[]:
p=sp.pop(0)
for d in [-1,1,11,-11]:
np=p+d
b=board[np]
if b==koma and not(np in dp):sp+=[np];dp+=[np]
elif b==".":return 0,0,board
g=len(dp)
for p in dp:
board=board[:p]+"."+board[p+1:]
if koma=="o":return 0,g,board
else:return g,0,board
t1="(;GM[1]SZ[9]KM[7]RU[Chinese]RE[W+-2.0]"
t2="PB[sa... (1445)]"
t3="PW[fi... (1427)]"
t4=";B[df];W[gd];B[ec];W[fg];B[gc];W[dg];B[cg];W[ef];B[de];W[fd];B[fc];W[ed];B[dd];W[dh];B[ch];W[hc];B[hb];W[hd];B[di];W[ei];B[eh];W[ci];B[eg];W[fh];B[bi];W[bh];B[di];W[cf];B[bg];W[bf];B[ah];W[cc];B[dc];W[cd];B[ce];W[be];B[bc];W[bb];B[bd];W[cb];B[ae];W[ac];B[af];W[db];B[eb];W[ib];B[ha];W[ee];B[gb];W[ic];B[da];W[ci];B[ad];W[di];B[ab];W[ia];B[ba];W[];B[ca];W[];B[])"
#まずプレイヤー名の抽出
p1,_=t2[3:].split()
p2,_=t3[3:].split()
#指し手をデータに保存
te=t4[1:-1].replace("B[","").replace("W[","").replace("]","").split(";")
#print(te)
#さらにわかりやすく変換
tdata=[]
for t in te:
if t=="":tdata+=[(-1,-1)]
else:
tdata+=[(ord(t[0])-ord("a"),ord(t[1])-ord("a"))]
#print(tdata)
#ただ打ってみる
pg1=0
pg2=0
board="#"*11+"#.........#"*9+"#"*11
k="ox"
for n,t in enumerate(tdata):
x,y=t
if x==-1:continue
p=x+1+(y+1)*11
board=board[:p]+k[n%2]+board[p+1:]
for d in [-1,1,-11,11]:
g1,g2,board=get(board,p+d)
pg1+=g1
pg2+=g2
#結果表示
for y in range(11):
print(board[y*11:y*11+11].replace("#"," "))
print(p1,pg1)
print(p2,pg2)
実行結果
検証画面