Skip to content

Instantly share code, notes, and snippets.

@windfall-shogi
Created November 23, 2020 08:18
Show Gist options
  • Save windfall-shogi/9680509c566f3c660999f4dab47f75df to your computer and use it in GitHub Desktop.
Save windfall-shogi/9680509c566f3c660999f4dab47f75df to your computer and use it in GitHub Desktop.
google colabでusiエンジンを動かすための方向性を示すためのコード
#! /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