Created
November 23, 2020 08:18
-
-
Save windfall-shogi/9680509c566f3c660999f4dab47f75df to your computer and use it in GitHub Desktop.
google colabでusiエンジンを動かすための方向性を示すためのコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
""" | |
google colabでusiプロトコルの対局エンジンを動かすためのプロトタイプ | |
TODO: | |
いろいろとデバッグ | |
時間設定と自分の使用した時間の管理 | |
読み筋などの表示 | |
対局結果の取得 | |
""" | |
import sys | |
# python-shogi | |
import shogi | |
from shogi import CSA | |
# 同じディレクトリに | |
# https://github.com/yaneurao/Ayane/blob/master/source/shogi/Ayane.py | |
# があるものとする | |
from Ayane import UsiEngine | |
__author__ = 'Yasuhiro' | |
__date__ = '2020/11/23' | |
def main(): | |
usi_engine = UsiEngine() | |
# usi_engine.debug_print = True | |
usi_engine.set_engine_options({ | |
"Hash": "128", | |
"Threads": "4", | |
"NetworkDelay": "0", | |
"NetworkDelay2": "0" | |
}) | |
usi_engine.connect("YaneuraOu") | |
ct = CSA.TCPProtocol(sys.argv[1], 4081) | |
ct.login(sys.argv[2], sys.argv[3]) | |
game_summary = ct.wait_match() | |
sfen = game_summary['summary']['sfen'] | |
my_color = game_summary['my_color'] | |
# python-shogiの代わりにcshogiを利用 | |
board = shogi.Board(sfen) | |
ct.agree() | |
# ponderで予測した指し手 | |
ponder_usi = None | |
ponder_hit = False | |
while True: | |
print(board) | |
if board.turn == my_color: | |
if not ponder_hit: | |
usi_engine.usi_position(sfen) | |
# 時間設定が必要 | |
usi_engine.usi_go('') | |
usi_engine.wait_bestmove() | |
next_usi = usi_engine.think_result.bestmove | |
ponder_usi = usi_engine.think_result.ponder | |
if next_usi == 'resign': | |
ct.resign() | |
break | |
elif next_usi == 'win': | |
# 勝ち宣言 | |
ct.command('%KACHI') | |
ct.read_line() | |
break | |
else: | |
move = shogi.Move.from_usi(next_usi) | |
ct.move(board.pieces[move.to_square], my_color, move) | |
sfen += ' ' + next_usi | |
else: | |
usi_engine.usi_position(sfen) | |
usi_engine.usi_go('ponder') | |
(turn, usi, spend_time, message) = ct.wait_server_message(board) | |
if message is not None: | |
print( | |
'MESSAGE: {0}'.format(CSA.SERVER_MESSAGE_SYMBOLS[message])) | |
if message == CSA.WIN: | |
break | |
elif message == CSA.LOSE: | |
break | |
elif message == CSA.CENSORED: | |
break | |
elif message == CSA.CHUDAN: | |
break | |
else: | |
if turn != board.turn: | |
raise ValueError('Invalid turn') | |
sfen += ' ' + usi | |
ponder_hit = usi == ponder_usi | |
if ponder_hit: | |
usi_engine.send_command('ponderhit') | |
else: | |
usi_engine.usi_stop() | |
move = shogi.Move.from_usi(usi) | |
board.push(move) | |
usi_engine.disconnect() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment