樽中酒不空
分类: C/C++
2019-05-20 16:41:59
# Clone github repo
git clone
cd leela-zero
git submodule update --init --recursive
cd msvc
Double-click the leela-zero2015.sln or leela-zero2017.sln corresponding
to the Visual Studio version you have.
# Build from Visual Studio 2015 or 2017
唯一遇到的麻烦就是github有时下载非常慢。 Leela zero本身是基于GTP协议的程序,如果不使用第三方客户端的话,启动后需要在命令行下手动输入命令下棋。出于调试和移植的目的,这里用MFC改写了一下,增加了一个简单的UI,然后调用leelaapp.c里面的代码,整合成了一个独立的demo程序,见:
。
目前简单实现了人机对弈和悔棋两个功能。
主要功能在LeelaApp这个class中,比如:
void LeelaApp::init() { // Set up engine parameters GTP::setup_default_parameters(); cfg_cpu_only = true; cfg_num_threads = std::min(SMP::get_num_cpus(), size_t{ MAX_CPUS }); cfg_num_threads = 2; cfg_allow_pondering = false; cfg_max_playouts = 100; cfg_timemanage = TimeManagement::FAST; cfg_timemanage = TimeManagement::OFF; cfg_max_visits = UCTSearch::UNLIMITED_PLAYOUTS; //cfg_max_visits = 3200; // Default to self-play and match values. //cfg_fpu_root_reduction = cfg_noise ? 0.0f : cfg_fpu_reduction; cfg_fpu_root_reduction = 0.25; //parse_commandline(argc, argv); // Disable IO buffering as much as possible std::cout.setf(std::ios::unitbuf); std::cerr.setf(std::ios::unitbuf); std::cin.setf(std::ios::unitbuf); setbuf(stdout, nullptr); setbuf(stderr, nullptr); init_global_objects(); maingame = std::make_unique(); /* set board limits */ maingame->init_game(BOARD_SIZE, KOMI); time_settings("0 10 1"); }
基本都是leela-zero的原始代码,只是改用MFC界面下调用。
根据这个demo程序,界面再优化一下,完善一下功能,可以做一个简单的围棋客户端了。
这里最大的问题是:leela-zero每次启动加载权重文件,如果有时间把权重文件分析好,放到内存缓存起来,这样每次启动客户端会节省很多时间。
这个程序是用VC2017写的,只是在leela zero的源码上增加啊界面,同样道理,使用Qt,C#等开发工具一样能实现同样效果。同样也可以在Android和iOS实现。