Skip to content

Instantly share code, notes, and snippets.

@3211133
Created November 27, 2018 22:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3211133/256ef9846dba3b302bca02a58416d9b3 to your computer and use it in GitHub Desktop.
Save 3211133/256ef9846dba3b302bca02a58416d9b3 to your computer and use it in GitHub Desktop.
# -*- 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