3目並べを行うコードを見て、写し書いているのですが、
w = [i for i in range(9) if (board & (1 << i)) == 0] #置ける場所を探す
こちらの行の "if (board & (1 << i)) == 0" が何を規定しているのか内容がわからず。
i for i in range(9)部分では、3 x 3 の盤面を9個の要素があるリストの枠として規定しているのだと
思いますが、そのあとの if 文では何を絞り込んでいるのでしょうか? 特に整数 1 に対して ビット演算シフト
をしている理由、またそれが 0 と同等かどうか見極めている意味がわかりません。
どなたかご教示いただければ大変助かります。
python
1import random 2 3# 終了条件 4 5goal = [ 6 0b111000000, 0b000111000, 0b000000111, 0b100100100, 7 0b010010010, 0b001001001, 0b100010001, 0b001010100 8] 9 10#3つ並んだか判定 11 12def check(player): 13 for mask in goal: 14 if player & mask == mask: 15 print("tested") 16 return True 17 return False 18 19#交互に置く 20 21def play(p1, p2): 22 print("play_ ", bin(p1), bin(p2)) 23 if check(p2): #3つ並んでいたら出力して終了 24 print("settled", [bin(p1), bin(p2)]) 25 return 26 board = p1 | p2 #現在の盤面状況 27 print("board ", bin(board)) 28 if board == 0b111111111: #すべて置いたら引き分けで終了 29 print([bin(p1), bin(p2), "draw"]) 30 return 31 32 w = [i for i in range(9) if (board & (1 << i)) == 0] #置ける場所を探す 33 print("move_ ", w) 34 r = random.choice(w) 35 print("rchoice ", r) 36 play(p2, p1 | (1 << r )) #再帰:手番を入れ替えて次を探す 37 38play(0, 0) 39
回答1件
あなたの回答
tips
プレビュー