Giter Club home page Giter Club logo

chinesechess_muzero_app's Introduction

项目说明

一款基于强化学习算法Muzero的**象棋ui程序。 因基于跨平台的flutter/dart(界面)+rust(算法后端)开发,所以理论上可用于任意平台,但由于测试平台在win10,且多数ucci引擎只有windows版本,所以目前适配最好的平台只有windows(目前代码已改成只能在windows下运行)。 写这个是因为目前网上看到的所有**象棋软件(包括引擎本身或者引擎加载软件)都是缺胳膊少腿的,用起来束手束脚,所以打算自己写一个。也正好看看flutter+rust能擦出什么样的火花。

软件截图(目前仍是半成品)

image

功能

  • 沉浸式体验---无边框,且带有个可隐藏或显示的工具条(类似qq靠边停靠效果)

  • 在windows平台下可任意像素级放大缩小(不知为何,主流的棋软都不实现这个功能)

  • 可加载基于ucci协议的**象棋引擎

  • [] 可自定义连线方案,连线各象棋游戏平台进行自动下棋 (可能需要OpenAi加持)

  • [] 带有一款内置的基于muzero算法的**象棋引擎

  • [] 可将三方的ucci引擎和内置引擎进行打擂比赛

  • [] 可将三方的ucci引擎辅助内置引擎进行训练

todo

  • 打造可拖动的tabView组件
  • 点击引擎按钮时,快速点击时按钮没动画
  • onLoadEngine以mixin的方式放到controller中,不要在EngineLoadButton中
  • switch (player) str淘汰掉
  • process反馈:“ stream did not contain valid UTF-8?”
  • 若engine异常退出,程序不能关掉
  • 是否应该用thread 代替 Tokio来降低内存占用?
  • 展开时并放大缩小时,1.距离边界的width会被重置到最边上,且border不固定。须修复;
  • [] 拓展时随便点击哪里都可以拖动(还有个yOffset问题)、 缩小dock时鼠标聚焦后可挪出一点点、
  • [] 浮动工具栏须在窗口放大缩小时 等比率调整位置和大小、透明acrylic
  • [] 重启读取配置

ui issue

可否内置divider\垂直按钮、tooltip\选中话框\下拉菜单会空?

编译说明

本程序仅在windows测试,使用了frb作为核心框架来绑定flutter和rust。 1.安装Flutter SDK 2.安装Rust SDK 3.安装cmake和flutter+rust桌面app所需要的库corrison,然后进入windows/rust.cmake,将corrison的获取方式改为 find_package(Corrosion REQUIRED)并注释掉下方通过github获取的方式。 4.安装llvm和安装编译所需其他工具链:

winget install -e --id LLVM.LLVM
cargo install flutter_rust_bridge_codegen just
dart pub global activate ffigen

5.更新必要的flutter包:

flutter pub add -d build_runner
flutter pub add -d freezed
flutter pub add freezed_annotation

关于freeze的介绍 6.justtfile中 gen流程最后添加这句话:

 gen:
     ..
     flutter pub run build_runner build --delete-conflicting-outputs

并运行 just生成rust绑定代码(只有rust代码有变动才需要) 7.flutter run (将生成flutter侧的绑定代码,并最总生成app)

(官方示例教程flutter_rust_bridge官方推荐模板

其他平台的安装设置

虽然本项目目标仅在windows下使用,但若对于其他平台感兴趣的,可参考: 安卓平台 web平台

常见问题

运行 just clean出现错误

flutter clean
error: Recipe `clean` could not be run because just could not find the shell: program not found

在windows平台编译时,请使用git bash,不要用power shell。

如何清除并重新生成?

rm -rf build && just clean && flutter pub get && just && flutter run

若仅更改了dart代码,则直接 flutter run 若还更改了rust代码,则 just && flutter run**

是否支持中文文件夹?

经测试,不支持。否则编译app时会发生各种奇怪的错误(文件名中最好也不要有“中划线”)。

多rust模块生成?

fzyzcjy/flutter_rust_bridge#481

如何隐藏运行时加载的ucci引擎窗口?

windows/runner/main.cpp中的

 if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
    CreateAndAttachConsole();
  }

替换为

if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
  CreateAndAttachConsole();
} else {
  AllocConsole();
  ShowWindow(GetConsoleWindow(), SW_HIDE);
}

参考:https://stackoverflow.com/questions/67082272/dart-how-to-hide-cmd-when-using-process-run

参考

**象棋ui程序、ucci引擎

Chinese Chess game by Flutter **象棋开源UCCI引擎理

连线器技术

强化学习

定式证明

自制基于明确逻辑的引擎思路

(这里的一回合是指从当前下棋一方开始的走完交替的两步棋,并不严格指代红先黑后) 1.枚举出我方所有“有效”走法;---有效是指走了后“本回合中”对方不存在某步棋可直接吃掉我方将的走法; 2.遍历1中的我方所有走法,针对每个走法,枚举出对方所有“有效”走法; 2.1 若当前局面下我方无“有效”子可下,则直接认输; 2.2 将我方的所有效走法(即列表中的对象)按照其之后对方可选有效走法的数量排序---越少越优先; 2.3 遍历2.2中排序后的我方走法,若是某个走法下对方无有效走法,则直接返回这个(即绝杀或困毙的赢棋走法); 2.4 遍历2.2中排序后的我方走法,针对【我方本回合叫将】且【对方本回合可吃掉该叫将走子(只可能是我方“单子”叫将)或对方反将】的走法,若接下来的回合我方可连叫(符合棋规情况下)直至绝杀的话,则直接返回该我方走法,否则剔除该走法; 2.5 遍历2.4中排序后的我方走法,剔除掉对方可连叫(符合棋规情况下)直至绝杀的我方走法; 3.对2.5之后剩下的我方候选走法,将“本回合后”的局面按以下标准按优先级(以下数字越小越优先)排序,选出最高分的走法: 3.1 排序优先级1的指标:本回合后,设所有我方(除了老将)的某棋子到对方将的直线距离为d,该棋子所有”有效“走法的走法数为c(这个c须剔除掉走后对方可吃掉该棋子的走法),则该棋子得分为s=(1/d)*c,我方这手棋的最低得分为依据对方不同走子后的局面得分后求Min(s)---将此最低得分作为这手棋的指标; 3.2 排序优先级2的指标:本回合仅我方走后,对方可选走法的数量(即2.2中所用的属性); 3.3 排序优先级3的指标:将本回合我方叫将的走法设置优先; 3.4 排序优先级4的指标:将本回合后我方没有被将军的局面设置优先;

chinesechess_muzero_app's People

Contributors

dbsxdbsx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

chinesechess_muzero_app's Issues

代理服务器问题

我有个可能比较傻的问题:
就是我一般翻墙是通过购买某服务商的订阅url,根据返回的服务器地址来+v2rayn这类软件使用代理的。使用时
我也是把环境变量http_proxy(s)设置为127.0.0.1:, 但现在我希望在虚拟机中安装linux,
其在刚安装时只有终端(没有ui)情况下,我希望将某个代理服务器设置为全局代理(这样下载会快很多)—因为日后要直接给host主机装,所以不考虑虚拟机采用host主机代理的方案。

网上看的教程也是在终端中设置 export http_proxy,具体格式为:http://USERNAME:PASSWORD@proxyhost:PROXYPORT/

这里的PROXYHOST:PROXYPORT应该就是填的我选择的某个代理服务器的IP和端口号吧,但是前面的USERNAME:PASSWORD
该怎么填的。 我查了半天资料也只是知道每个代理服务器有个uid,是密码有关的。其他就不知道了。

您好,我遇到了和您类似的问题,请问您解决了么,谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.