Skip to content

Instantly share code, notes, and snippets.

@doraneko94
Last active January 27, 2018 23:58
Show Gist options
  • Save doraneko94/d660cc8070c10120675796d709b1c43b to your computer and use it in GitHub Desktop.
Save doraneko94/d660cc8070c10120675796d709b1c43b to your computer and use it in GitHub Desktop.
The code of analyzing Osero (reversi). Prease import functions.py.
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
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