Last active
January 27, 2018 23:58
-
-
Save doraneko94/d660cc8070c10120675796d709b1c43b to your computer and use it in GitHub Desktop.
The code of analyzing Osero (reversi). Prease import functions.py.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def check1(kifu, now): | |
state = kifu | |
for i in range(len(now)-1): | |
state = state[now[i]] | |
if len(now) % 2 == 0: | |
ban = -1 | |
else: | |
ban = 1 | |
key = 0 | |
for i in state.keys(): | |
if state[i] == 1 or state[i] == -1 or state[i] == 0: | |
if state[i] == ban: | |
state = kifu | |
now.pop(-1) | |
for j in range(len(now)-1): | |
state = state[now[j]] | |
state[now[-1]] = ban | |
key = 1 # 1 -> next, 2 -> continue | |
ban = ban * (-1) | |
break | |
return now, key, state | |
def check2(key1, choices, state, board, ban, kifu, now): | |
key0s = 0 | |
if len(choices) == 0: | |
choices.append("pass") | |
if key1 == 0: | |
key1 = 1 | |
else: | |
state["pass"] = win(board) | |
now.append("pass") | |
key0s = 1 | |
x = 999 | |
y = 999 | |
key1 = 0 | |
return x, y, key0s, key1 | |
else: | |
key1 = 0 | |
if len(choices) == len(state): | |
lo = 0 | |
for i in state.keys(): | |
if state[i] == ban * (-1): | |
lo += 1 | |
if lo > 0: | |
now.pop(-1) | |
state = kifu | |
for i in range(len(now)-1): | |
state = state[now[i]] | |
state[now[-1]] = ban * (-1) | |
elif lo == 0: | |
now.pop(-1) | |
state = 0 | |
key0s = 1 | |
x = 999 | |
y = 999 | |
elif choices == ["pass"]: | |
x = 999 | |
y = 999 | |
else: | |
if len(choices[len(state)]) < 2: | |
x = 0 | |
y = int(choices[len(state)][0]) | |
else: | |
x = int(choices[len(state)][0]) | |
y = int(choices[len(state)][1]) | |
return x, y, key0s, key1 | |
def board_set(kifu, now, scale): | |
if scale == 8: | |
board = [[0,0,0,0,0,0,0,0], | |
[0,0,0,0,0,0,0,0], | |
[0,0,0,0,0,0,0,0], | |
[0,0,0,1,-1,0,0,0], | |
[0,0,0,-1,1,0,0,0], | |
[0,0,0,0,0,0,0,0], | |
[0,0,0,0,0,0,0,0], | |
[0,0,0,0,0,0,0,0],] | |
if scale == 6: | |
board = [[0,0,0,0,0,0], | |
[0,0,0,0,0,0], | |
[0,0,1,-1,0,0], | |
[0,0,-1,1,0,0], | |
[0,0,0,0,0,0], | |
[0,0,0,0,0,0]] | |
if scale == 4: | |
board = [[0,0,0,0], | |
[0,1,-1,0], | |
[0,-1,1,0], | |
[0,0,0,0]] | |
state = kifu | |
for i in range(len(now)): | |
state = state[now[i]] | |
ban = 1 | |
for i in now[0:-1]: | |
if i == "pass": | |
x = 999 | |
y = 999 | |
elif len(i) < 2: | |
x = 0 | |
y = int(i) | |
else: | |
x = int(i[0]) | |
y = int(i[1]) | |
board = put(board, x, y, ban, state={}, now=[], new=0) | |
ban = ban * (-1) | |
return board | |
def choices(board, ban): | |
choices = [] | |
for i in range(len(board[0])): | |
for j in range(len(board)): | |
if board[j][i] == 0: | |
jp = j | |
ip = i | |
bkey = 0 | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp -= 1 | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp += 1 | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp -= 1 | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp += 1 | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
jp += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = j | |
ip = i | |
for k in range(len(board)-1): | |
if bkey == 1 : break | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
choices.append(str(i*10+j)) | |
bkey = 1 | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
return choices | |
def put(board, x, y, ban, state, now, new=1): | |
if new == 1: | |
bans = len(now) % 2 | |
if bans == 0 and ban == -1: | |
now.pop(-1) | |
elif bans == 1 and ban == 1: | |
now.pop(-1) | |
if x == 999: | |
if new == 1: | |
state["pass"] = {} | |
state = state["pass"] | |
now.append("pass") | |
else: | |
board[y][x] = ban | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp -= 1 | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y-(l+1)][x-(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp += 1 | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y+(l+1)][x+(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp += 1 | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y+(l+1)][x-(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp -= 1 | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y-(l+1)][x+(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y-(l+1)][x] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
jp += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y+(l+1)][x] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
ip -= 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y][x-(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
jp = y | |
ip = x | |
for k in range(len(board)-1): | |
ip += 1 | |
if jp < 0 or jp >= len(board) or ip < 0 or ip >= len(board[0]): | |
break | |
else: | |
if board[jp][ip] == 0: | |
break | |
elif board[jp][ip] == ban and k > 0: | |
for l in range(k): | |
board[y][x+(l+1)] = ban | |
break | |
elif board[jp][ip] == ban and k == 0: | |
break | |
if new == 1: | |
state[str(x*10+y)] = {} | |
state = state[str(x*10+y)] | |
now.append(str(x*10+y)) | |
if new == 0: | |
return board | |
if new == 1: | |
return board, state, now | |
def win(board): | |
bw = 0 | |
for i in range(len(board)): | |
for j in range(len(board[0])): | |
bw += board[j][i] | |
if bw < 0: | |
return -1 | |
elif bw > 0: | |
return 1 | |
else: | |
return 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import functions as fn | |
from time import sleep | |
scale = 6 | |
kifu = {} | |
now = [] | |
end = 0 | |
t = 0 | |
while end == 0: | |
board = fn.board_set(kifu, now, scale) | |
if scale == 4: | |
if kifu != {}: | |
if kifu['2'] == 1 or kifu['2'] == -1 or kifu['2'] == 0: | |
print(kifu['2']) | |
end = 1 | |
if scale == 6: | |
if kifu != {}: | |
if kifu['13'] == 1 or kifu['13'] == -1 or kifu['13'] == 0: | |
print(kifu['13']) | |
end = 1 | |
now, key, state = fn.check1(kifu, now) | |
if key == 0: | |
key0 = 0 | |
if now == []: | |
ban = 1 | |
else: | |
if len(now) % 2 == 0: | |
ban = -1 | |
else: | |
ban = 1 | |
key1 = 0 | |
while key0 == 0: | |
choices = fn.choices(board, ban) | |
x, y, key0s, key1 = fn.check2(key1, choices, state, board, ban, kifu, now) | |
key0 = key0s | |
if key0 == 0: | |
board, state, now = fn.put(board, x, y, ban, state, now) | |
ban = ban * (-1) | |
t += 1 | |
if t % 10000 == 0: | |
print(kifu) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment