[PYTHON] Spiel mit Othello (Reversi)

Was ist das?

Lass uns Othello mit Python spielen.

Board-Initialisierung und Anzeige

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 . . . . . . . .

Platziere ein Stück

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 . . . . . . . .

Finde die beste Position

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

Versuche zu spielen

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.

Ich habe Docker vorbereitet

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

Spiel mit Othello (Reversi)
Spiel mit dem Propheten
Spielen Sie mit 2016-Python
Spielen Sie mit CentOS 8
Spiel mit der Pyramide
Spiel mit Fathom
Spielen wir mit der 4. Dimension der 4. Dimension
Spielen wir mit Amedas Daten - Teil 1
Spielen Sie mit Push-Benachrichtigungen mit imap4lib
Machen wir Othello mit wxPython
Spielen wir mit Amedas Daten - Teil 4
Spielen Sie mit Jupyter Notebook (IPython Notebook)
[Python] Spielen Sie mit Discords Webhook.
Spielen wir mit Amedas Daten - Teil 3
Spielen wir mit Amedas Daten - Teil 2
Spielen Sie mit dem MD-Modul von ASE
Othello gemacht mit Python (wie GUI)
Spielen Sie mit A3RT (Textvorschlag)
Spielen Sie mit Poancare-Serien und SymPy
Machen wir Othellos KI mit Chainer-Teil 1-
Lass uns mit Python mit Python spielen [Anfänger]
Spielen Sie mit der Pythonista-UI-Implementierung [Action-Implementierung]
Spielen Sie mit dem PIR-Sensormodul [DSUN-PIR]
Othello-Spieleentwicklung mit Python
Spielen Sie mit Linux-Partitionen herum ~ Fortsetzung ~
Machen wir Othellos KI mit Chainer-Teil 2-
Funken spielen mit WSL Anaconda Jupyter (2)
Schreiben Sie Reversi AI mit Keras + DQN
Spielen Sie mit Turtle auf Google Colab
Spiele mit Dämonen, weil es ein Abschnitt ist
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
[Einführung in WordCloud] Spielen Sie mit Scraping ♬
Spielen Sie eine Audiodatei von Python mit Interrupt ab
Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Spielen Sie wie eine Web-App mit ipywidgets
Spielen Sie mit dem UI-Modul von pythonista3
[Ergänzung] [PySide] Spielen wir mit Qt Designer
Fraktal zum Erstellen und Spielen mit Python
Ich möchte mit aws mit Python spielen
Spielen Sie mit der Implementierung der Pythonista-Benutzeroberfläche [Bildschirmelemente]
Spielen Sie mit PDBBind von MoleculeNet und RDKitGridFeaturizer von DeepChem
Spielen Sie Audiodateien mit Interrupts mit PyAudio ab
Spielen Sie mit Dajare mithilfe der COTOHA-API
Laden Sie csv mit Pandas und spielen Sie mit Index
Othello App (iOS App) erstellt mit Python (Kivy)