Lass uns Othello mit Python spielen.
Die Platine wird in einem eindimensionalen Array der Größe 64 gehalten, und die Werte sind wie folgt.
--0: Freier Speicherplatz ―― 1: Kurokoma (ausgedrückt durch *) ―― 2: Shirakoma (ausgedrückt durch o)
python3
import numpy as np
def create_board():
a = np.zeros(64, dtype=int)
a[27] = a[36] = 1
a[28] = a[35] = 2
return a
def print_board(a):
print(' a b c d e f g h')
for i in range(8):
print(i+1, end=' ')
print(' '.join('.*o'[j] for j in a[i*8:][:8]))
a = create_board()
print_board(a)
>>>
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . . . . .
4 . . . * o . . .
5 . . . o * . . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
Erstellen Sie eine Funktion, die Ihr Stück w (1 oder 2) an Position p (0 bis 63) bringt. Da die acht vertikalen, horizontalen und diagonalen Daten eindimensionale Daten sind, schauen Sie in die Richtung, die um [-9, -8, -7, -1, 1, 7, 8, 9] von der aktuellen Position abweicht. Dies wird mit einer Kombination von [-1, 0, 1] und [-8, 0, 8] überprüft (ausgenommen 0 und 0 Paare). Wenn Sie das Array (b) für jede Richtung herausnehmen und kumulativ mit 0-1 multiplizieren, ob es sich um das gegnerische Stück (b == 3-w) handelt, werden die Stücke, die genommen werden können, durch 1 dargestellt. Wenn Sie also die Summe (Summe) nehmen , Sie können die Anzahl der Stücke n sehen, die genommen werden können. Setzen wir es auf Position 20 ("e3").
python3
def put_piece(a, p, w, puton=True, chk=True):
t, x, y = 0, p%8, p//8
for di, fi in zip([-1, 0, 1], [x, 7, 7-x]):
for dj, fj in zip([-8, 0, 8], [y, 7, 7-y]):
if not di == dj == 0:
b = a[p+di+dj::di+dj][:min(fi, fj)]
n = (b==3-w).cumprod().sum()
if b.size <= n or b[n] != w: n = 0
t += n
if puton:
b[:n] = w
if puton:
if chk: assert(a[p] == 0 and t > 0)
a[p] = w
return t
put_piece(a, 20, 1)
print_board(a)
>>>
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . * . . .
4 . . . * * . . .
5 . . . o * . . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
Um eine gute Hand zu finden, fügen Sie die folgenden Punkte mit dem entsprechenden Gewicht hinzu.
――Sie können viel bekommen. ――Es gibt weniger Orte, an denen der Gegner getroffen werden kann
python3
def best(a, w):
from math import exp
r, b, c = [], a.copy(), 1+exp(-np.count_nonzero(a)/16)
for i in range(64):
if b[i] != 0: continue
t = put_piece(b, i, w, True, False)
if t == 0:
b[i] = 0
continue
u = sum(b[j]==0 and put_piece(b, j, 3-w, False) > 0 for j in range(64))
r.append((t-c*u+np.random.rand()*0.5, i))
b = a.copy()
return sorted(r)[-1][1] if r else -1
p zu bestehen, q zu beenden.
python3
if __name__ == '__main__':
a = create_board()
w = 1
while np.count_nonzero(a) < 64:
print_board(a)
s = input('> ')
if not s or s=='q': break
if s != 'p':
try:
x, y = ord(s[0])-97, int(s[1])-1
put_piece(a, x+8*y, w)
except:
continue
p = best(a, 3-w)
if p >= 0:
put_piece(a, p, 3-w)
print_board(a)
n1, n2 = (a==1).sum(), (a==2).sum()
print('%d - %d %s' % (n1, n2,
'You win' if n1 > n2 else
'You lose' if n1 < n2 else 'Draw'))
>>>
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . . . . .
4 . . . * o . . .
5 . . . o * . . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
> e3
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . * o . .
4 . . . * o . . .
5 . . . o * . . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
> f4
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . * o . .
4 . . . * * o . .
5 . . . o o o . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
> g3
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . . * * * .
4 . . o o o o . .
5 . . . o o o . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
> c5
a b c d e f g h
1 . . . . . . . .
2 . . . . . . . .
3 . . . o * * * .
4 . . o o o o . .
5 . . * o o o . .
6 . . . . . . . .
7 . . . . . . . .
8 . . . . . . . .
>
Sie sollten es etwas weiter lesen.
bash
docker run -it --rm tsutomu7/reversi python reversi.py
Wenn Sie dies mit einem Browser tun, gehen Sie bitte wie folgt vor.
bash
firefox http://localhost:8888 &
docker run -it --rm -p 8888:8888 tsutomu7/reversi
das ist alles
Recommended Posts