Created
November 27, 2018 22:34
-
-
Save 3211133/256ef9846dba3b302bca02a58416d9b3 to your computer and use it in GitHub Desktop.
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
# -*- coding: utf-8 -*- | |
# oseroai.py - osero | |
import sys | |
import random | |
def main(): | |
while True: | |
times = int(input('何試合しますか:')) | |
while times: | |
盤面 = [[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]] | |
ターン = 1 | |
符号 = [[1,1], [1,0], [1,-1], [0,1], [0,-1], [-1,1], [-1,0], [-1,-1]] | |
勝利判定 = 0 | |
置いたマス = [] | |
while True: | |
#置ける駒を調べる | |
勝利判定 += 1 | |
置けるマス = [] | |
for x in range(8):#全てのxyの組み合わせで調べてる | |
for y in range(8): | |
if 盤面[x][y] == 2:#前回☆にしたところを×に戻してる | |
盤面[x][y] = 0 | |
if 盤面[x][y] == 0:#×の中で置けるマスを探す | |
for X, Y in 符号: | |
cx, cy = x + X, y + Y#隣のマスが盤内で敵コマだったら調査続行 | |
if (-1 < cx < 8 and -1 < cy < 8) and 盤面[cx][cy] == -1 * ターン and 盤面[x][y] != 2: | |
while True: | |
cx += X | |
cy += Y | |
if not (-1 < cx < 8 and -1 < cy < 8):#更に隣のマスが盤外だったら調査終了次へ | |
break | |
elif 盤面[cx][cy] == -1 * ターン:#更に隣のマスが敵コマだったらさらに隣のマスへ | |
continue | |
elif not 盤面[cx][cy] == ターン:#×とか☆とかだったら終了 | |
break | |
else:#自コマだったら置けるマスなので☆にする | |
勝利判定 = 0 | |
盤面[x][y] = 2 | |
置けるマス.append([x, y]) | |
break | |
else: | |
continue | |
#パス処理と試合終了処理 | |
if 勝利判定 == 1:#まだ片方だけだったらターン切り替えて終える | |
ターン *= -1 | |
continue | |
elif 勝利判定 == 2:#両方置けなかったら試合終了 | |
試合結果 = 0 | |
for x in range(8): | |
for y in range(8): | |
試合結果 += 盤面[x][y]#このとき盤面に2はないので全部足し上げると●と〇の差が求められる | |
if 試合結果 < 0: | |
print('○の勝ち') | |
試合結果 = -1 | |
elif 試合結果 > 0: | |
print('●の勝ち') | |
試合結果 = 1 | |
else: | |
print('引き分け') | |
break | |
#入力処理 | |
x, y = random.choice(置けるマス) | |
#ファイル関連 | |
filename = str(盤面).replace('[', '').replace(', ', '').replace(']', '').replace("-1", "-") | |
置いたマス.append([x, y, ターン, filename, 置けるマス]) | |
#ひっくり返す処理 | |
for X, Y in 符号:#33行目とやってることはほぼ同じ | |
cx, cy = x + X, y + Y | |
if not(-1 < cx < 8 and -1 < cy < 8) or not 盤面[cx][cy] == -1 * ターン: | |
continue | |
else:#隣が敵駒か | |
while True: | |
cx += X | |
cy += Y | |
if not(-1 < cx < 8 and -1 < cy < 8) or 盤面[cx][cy] == 0 or 盤面[cx][cy] == 2: | |
break | |
elif 盤面[cx][cy] == -1 * ターン: | |
continue | |
elif 盤面[cx][cy] == ターン:#ここの処理だけ違う | |
while True:#一個ずつ戻りながら自駒にしてる | |
cx -= X | |
cy -= Y | |
盤面[cx][cy] = ターン | |
if cx == x and cy == y:#入力したところまでいったら終了 | |
break | |
break | |
ターン *= -1#最後にターン切り替えて終了 | |
if 試合結果 != 0: | |
for x, y, ターン, filename, 置けるマス in 置いたマス: | |
print(filename) | |
print(置けるマス) | |
try: | |
with open("data/" + filename +".txt", mode = 'r') as f: | |
data = f.read() | |
except: | |
data = '0 ' * len(置けるマス) | |
datalist = data.split() | |
print(datalist) | |
datalist[置けるマス.index([x, y])] = int(datalist[置けるマス.index([x, y])]) + 試合結果 * ターン | |
print(datalist) | |
data ='' | |
for line in datalist: | |
data += str(line) + ' ' | |
with open("data/" + filename +".txt", mode = 'w') as f: | |
f.write(data) | |
times -= 1 | |
print(times) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment