-
Notifications
You must be signed in to change notification settings - Fork 0
/
3moku_minimax2.py
57 lines (44 loc) · 1.78 KB
/
3moku_minimax2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import random
goal = [
0b111000000, 0b000111000, 0b000000111, 0b100100100,
0b010010010, 0b001001001, 0b100010001, 0b001010100
]
#ゲームが終了したかどうかチェックする
#3目並べならば、ゲーム終了の状態は9通り
def check(player):
for mask in goal:
if player & mask == mask:
return True
return False
def minmax(player1, player2, turn):
if check(player2):#ゲーム終了状態か
if turn:#自分の番なら勝ち
return 1
else:#相手の番なら負け
return -1
board = player1 | player2#盤面をセットする
if board == 0b111111111:#全て盤面が埋まっているか
return 0
w = [i for i in range(9) if board & (1 << i) == 0]#置ける場所を探す
if turn:
return min([minmax(player2,player1 | (1 << i), not turn) for i in w])
else:
return max([minmax(player2,player1 | (1 << i), not turn) for i in w])
def play(player1, player2, turn):
if check(player2):#ゲーム終了
print([bin(player1),bin(player2)])
board = player1 | player2
if board == 0b111111111:#マスがすべて埋まったとき
print([bin(player1),bin(player2)])
return
#ゲーム続行可能な時
w = [i for i in range(9) if board & (1 << i) == 0]#左方向にビットシフト。 1 << iなら1を左い方向にiだけシフトする。置ける場所を探す
#mini-max method。評価値を調べる
r = [minmax(player1,player2 | (1 << i), True) for i in w]
#評価が一番いいものを取得
i = [i for i, x in enumerate(r) if x == max(r)]
#評価値が最も高いものを選択
j = w[random.choice(i)]
play(player2, player1 | (1 << j), not turn)
if __name__ == '__main__':
play(0,0, True)