コードの写し書きを、「python ではじめるアルゴリズム入門」(翔泳社)からしているのですが、
打ち手の評価を行う minmax 関数内の下記の check 関数を用いて3目並んだ時点での
終了条件の記述の挙動がいまひとつわからず... minmax関数での、勝ちを 1, 負けを -1,
引き分けを 0 打ち手の評価値としていることは理解できるのですが、そのうえで、評価値を
どこにどのように return されるのでしょうか?
python
1def minmax(p1, p2, turn): 2 if check(p2): #3目並びをは判定する check 関数を呼び出し 3 if turn: 4 return 1 #勝ち 5 else: 6 return -1 #負け 7 board = p1 | p2 8 if board == 0b111111111: 9 return 0 #引き分け 10 11 12#以下省略
minmax関数の呼び出し元の play 関数内で参照すると、 r の内包表記の一部として return されている
のですが、ここの挙動が具体的によくわからず、何か手がかりをご教示いただければ幸いです。
python
1 2def play(p1, p2, turn): 3#先行部分省略 4 w = [i for i in range(9) if (board & (1 << i)) == 0] #打てる領域(="0") を9bitのビット列から順次探索 5 r = [minmax(p2, p1 | (1 << i ), True) for i in w] # 領域の評価 6 j = w[r.index(max(r))] #評価の一番高いものを確定し、 7 play(p2, p1 | (1 << j ), not turn) #打ち手とする 8#以下省略 9
python
1import random 2import math 3 4goal = [ 5 0b111000000, 0b000111000, 0b000000111, 0b100100100, 6 0b010010010, 0b001001001, 0b100010001, 0b001010100 7] 8 9#3つ並んだか判定 10 11def check(player): 12 for mask in goal: 13 if player & mask == mask: 14 return True 15 return False 16 17def minmax(p1, p2, turn): 18 if check(p2): 19 if turn: 20 return 1 21 else: 22 return -1 23 24 board = p1 | p2 25 if board == 0b111111111: 26 return 0 27 28 w = [i for i in range(9) if (board & (1<< i )) == 0] 29 30 if turn: 31 return min([minmax(p2, p1 | (1 << i ), not turn) for i in w]) 32 else: 33 return max([minmax(p2, p1 | (1 << i ), not turn) for i in w]) 34 35 36def play(p1, p2, turn): 37 38 if check(p2): 39 print("settled", [bin(p1), bin(p2)]) 40 return 41 42 board = p1 | p2 43 print("current_board: ", bin(board)) 44 45 if board == 0b111111111: 46 print([bin(p1), bin(p2), "draw"]) 47 return 48 w = [i for i in range(9) if (board & (1 << i)) == 0] 49 r = [minmax(p2, p1 | (1 << i ), True) for i in w] 50 j = w[r.index(max(r))] 51 play(p2, p1 | (1 << j ), not turn) 52 53play(0, 0, True) 54
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 15:17 編集
2020/05/02 15:30
2020/05/02 16:57
2020/05/05 03:21