Giter VIP home page Giter VIP logo

calcitem / sanmill Goto Github PK

View Code? Open in Web Editor NEW
131.0 7.0 20.0 107.36 MB

Sanmill is an open-source, UCI-like Mill/Morris/Merrills/Mühle/Malom (and its variants) program with CUI, Flutter GUI and Qt GUI, sharing and freely distributing the code, tools and data needed to deliver this mill game. We do this because we are convinced that open software and open data are key ingredients to make rapid progress.

Home Page: https://play.google.com/store/apps/details?id=com.calcitem.sanmill

License: GNU General Public License v3.0

C 0.98% C++ 44.93% Shell 0.87% Batchfile 0.03% Makefile 1.43% Java 0.73% Dart 48.27% CMake 1.65% Python 0.04% JavaScript 0.04% Ruby 0.18% Swift 0.35% Objective-C 0.30% Objective-C++ 0.21%
ea15e84462 morris mill mills muhle malom flutter ai alpha-beta-pruning game board-game pvs mtdf stockfish muehle brettspiel nine-mens-morris minimax bitboard merrills

sanmill's Introduction

Overview

Graphic

Get it on GitHub Get it on Google Play Get it on F-Droid
Download on the App Store Get it from the Microsoft Store Get it from the Snap Store Get it on CafeBazaar

snapcraft

Codemagic build status

Translation status

Readme-Chinese

Sanmill is a free, powerful UCI-like N men's morris program with CUI, Flutter GUI and Qt GUI.

Nine men's morris is a strategy board game for two players dating at least to the Roman Empire. The game is also known as nine-man morris, mill, mills, the mill game, merels, merrills, merelles, marelles, morelles, and ninepenny marl in English.

image

Files

This distribution of Sanmill consists of the following files:

  • Readme.md, the file you are currently reading.

  • Copying.txt, a text file containing the GNU General Public License version 3.

  • src, a subdirectory containing the full source code, including a Makefile that can be used to compile Sanmill CUI on Unix-like systems.

  • src/ui/flutter_app, a subdirectory containing a Flutter frontend.

  • src/ui/qt, a subdirectory containing a Qt frontend.

How to Build

CUI

Sanmill CUI has support for 32 or 64-bit CPUs, certain hardware instructions, big-endian machines such as Power PC, and other platforms.

It should be easy to compile Sanmill directly from the source code on Unix-like systems with the included Makefile in the folder src. Generally, it is recommended to run make help to see a list of make targets with corresponding descriptions.

cd src
make help
make build ARCH=x86-64-modern

When reporting an issue or a bug, please tell us which version and compiler you used to create your executable. This information can be found by typing the following commands in a console:

./sanmill compiler

Qt Application

If you have started using Ubuntu or any Ubuntu-based Linux distribution, you must install Qt by running the following command as root:

sudo apt-get install qt5-default qtmultimedia5-dev qtcreator

Use Qt Creator to open src/ui/qt/CMakeLists.txt , or run

cd src/ui/qt
cmake .
cmake --build . --target mill-pro

and use Visual Studio to open src\ui\qt\mill-pro.sln to build Qt Application.

Flutter App

Run ./flutter-init.sh , and then use Android Studio or Visual Studio Code to open src/ui/flutter_app to build Flutter App.

We use compile-time environment configs to enable specific parts of the code:

  • test to prepare the app for Monkey and Appium testing. (References to external sites are going to be disabled.)
  • dev_mode to show the developer mode without needing to enable it first.
  • catcher to control the use of Catcher. (This is on by default and needs to be disabled when required.)

All environment configs can be combined and take a value of bool like:

flutter run --dart-define catcher=false dev_mode=true

For ease of use, some launch configs for Android Studio or Visual Studio Code are available. Just select the needed one in the Run and Debug or Run/Debug Configurations tab.

Understanding the code base and participating in the project

Sanmill's improvement over the last couple of years has been a great community effort. There are a few ways to help contribute to its growth.

Improving the code

If you want to help improve the code, there are several valuable resources:

  • In this wiki, many techniques used in Sanmill are explained with a lot of background information.

  • The latest source can always be found on GitHub.

  • Discussions about Sanmill take place in the Discussions.

Terms of use

Sanmill is free and distributed under the GNU General Public License version 3 (GPL v3). Essentially, this means you are free to do almost exactly what you want with the program, including distributing it among your friends, making it available for download from your website, selling it (either by itself or as part of some bigger software package), or using it as the starting point for a software project of your own.

The only real limitation is that whenever you distribute Sanmill in some way, you must always include the full source code or a pointer to where the source code can be found. If you make any changes to the source code, these changes must also be made available under the GPL.

For full details, read the copy of the GPL v3 found in the file named Copying.txt.

As additional permission under section 7, you are allowed to distribute the software through an app store, even if that store has restrictive terms and conditions that are incompatible with the GPL, provided that the source is also available under the GPL with or without this permission through a channel without those restrictive terms and conditions.

All unofficial builds and forks of the app must be clearly labeled as unofficial in the app's name (e.g. "Sanmill UNOFFICIAL", never just "Sanmill") or use a different name altogether. If any code changes are made, the fork should use a completely different name and app icon. All unofficial builds and forks MUST use a different application ID, in order to not conflict with a potential official release.

sanmill's People

Contributors

ahohnmyc avatar calcitem avatar cweiske avatar eugentoptic44 avatar f3rr31 avatar fnogcps avatar joker2770 avatar jsoref avatar leptopoda avatar magnitudee avatar mdddj avatar milotype avatar nariri avatar nathanbnm avatar santossi avatar sguinetti avatar skarmoutsosv avatar stalker314314 avatar tygyh avatar vitorhcl avatar weblate avatar xshiwei avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

sanmill's Issues

白方吃子不当

r2 s050 t00
(2,6) 00:00
(2,8) 00:00
(2,4) 00:01
(2,5) 00:00
(2,2) 00:02
(2,3) 00:01
(1,8) 00:02
(1,3) 00:02
(3,3) 00:04
(1,5) 00:03
(3,5) 00:05
(1,4) 00:04
(3,4) 00:07
(1,2) 00:04
-(1,8)  00:04
(3,6) 00:11
-(1,5)  00:13
(3,2) 00:04
(1,6) 00:15
-(3,2)  00:16
(3,8) 00:04
(3,1) 00:18
(1,1) 00:05
(2,1) 00:19
(2,7) 00:05
(1,7) 00:23
(3,7) 00:05
(2,8)->(1,8) 00:05
-(3,1)  00:05
(2,1)->(2,8) 00:33
(1,1)->(2,1) 00:05
(2,2)->(3,2) 00:37
-(1,8)  00:39
(2,3)->(2,2) 00:05
(3,3)->(2,3) 00:48
(1,2)->(1,1) 00:05
(2,8)->(1,8) 00:59
-(2,2)  01:01
(3,8)->(3,1) 00:05
-(3,2)  00:06
(1,6)->(1,5) 01:09
(1,1)->(1,2) 00:06
-(1,5)  00:07
(1,7)->(1,6) 01:13
-(1,2)  01:16
(1,3)->(1,2) 00:07
(1,8)->(1,1) 01:21
(1,2)->(2,2) 00:07
(3,4)->(3,3) 01:26
(2,7)->(2,8) 00:07
-(3,5)  00:07
(1,6)->(1,5) 01:35
(3,7)->(3,8) 00:08
(1,5)->(1,6) 01:41
-(3,8)  01:49
(2,8)->(1,8) 00:08
(1,1)->(1,2) 01:55
(1,8)->(2,8) 00:08
-(3,3)  00:08
(1,6)->(1,5) 02:01
(2,1)->(1,1) 00:08
(1,5)->(1,6) 02:12
-(2,2)  02:16
(2,8)->(2,1) 00:08
-(2,3)  00:08
(1,6)->(1,5) 02:19
(1,1)->(1,8) 00:08
(1,5)->(1,6) 02:21
-(1,8)  02:23
(2,1)->(1,1) 00:08
(1,6)->(1,5) 02:26
(3,1)->(2,1) 00:08
(1,5)->(1,6) 02:28
-(1,1)  02:29
(2,5)->(1,5) 00:08
(2,6)->(2,5) 02:32
(2,1)->(2,2) 00:08
(3,6)->(2,6) 02:35
-(2,2)  02:36
Player1 win!

提前认输异常

自对弈,选提前认输
白方胜时算黑方的,且显示player4/5 win.

摆子阶段最后一着如果成三则先吃子再进入走棋阶段的 Bug

SHA-1: 79effc7

  • rule: 摆子阶段最后一着如果成三则先吃子再进入走棋阶段

引入

r2 s050 t00
(2,2) 00:00
(2,4) 00:05

(2,8) 00:01
(2,1) 01:22

(3,2) 00:02
(1,2) 01:50

(2,6) 00:06
(2,7) 03:22

(1,8) 00:07
(3,8) 03:25

(3,6) 00:08
(1,6) 03:28

(3,4) 00:10
(3,3) 03:56

(1,3) 00:12
(3,5) 04:06

(1,5) 00:13
(2,5) 04:24

(1,4) 00:14
(3,7) 04:26

(1,7) 00:15
(3,1) 04:28

(1,1) 00:15
(2,3) 04:32
Player2 win!

最后几招可以看到, 必死但还是算出来没死 .

搜索时没有检测和棋

造成最后能赢的变成和棋

r2 s050 t00
(1,2) 00:00
(1,1) 13:17
(1,4) 07:01
(1,3) 15:02
(1,6) 08:19
(1,5) 15:39
(1,7) 08:40
(1,8) 15:58
(2,6) 08:46
(3,6) 15:59
(2,2) 08:48
(3,2) 16:00
(2,8) 08:49
(2,1) 16:01
(2,7) 08:50
-(3,6)  08:51
(3,7) 16:02
(3,4) 08:52
(3,1) 16:02
-(3,4)  16:03
(3,8) 08:53
(2,3) 16:03
(3,3) 08:54
(3,5) 16:03
(2,5) 08:54
(2,4) 16:03
(3,5)->(3,6) 16:04
(3,3)->(3,4) 08:54
(3,2)->(3,3) 16:04
-(3,4)  16:05
(2,5)->(3,5) 08:57
(3,3)->(3,2) 16:06
(3,5)->(3,4) 08:59
(3,2)->(3,3) 16:08
-(3,4)  16:11
(2,6)->(2,5) 09:09
(3,6)->(2,6) 16:12
(2,5)->(3,5) 09:11
(1,5)->(2,5) 16:20
-(1,6)  16:36
(3,5)->(3,4) 09:24
(3,3)->(3,2) 16:42
(3,4)->(3,3) 09:29
(2,5)->(1,5) 16:47
(3,3)->(3,4) 09:30
(3,2)->(3,3) 16:47
-(3,4)  16:48
(2,2)->(3,2) 09:31
(2,1)->(2,2) 16:48
-(1,2)  16:48
(1,7)->(1,6) 09:31
(2,2)->(1,2) 16:48
-(1,4)  16:48
(3,2)->(2,2) 09:31
(2,4)->(1,4) 16:48
-(1,6)  16:48
(2,8)->(2,1) 09:31
(2,6)->(1,6) 16:48
-(2,7)  16:48
(3,8)->(2,8) 09:31
-(3,3)  09:31
(3,7)->(3,6) 16:48
(2,2)->(3,2) 09:31
(2,3)->(2,2) 16:48
(2,8)->(3,8) 09:31
(3,6)->(2,6) 16:48
(3,8)->(2,8) 09:32
(3,1)->(3,8) 16:48
(3,2)->(3,3) 09:32
(3,8)->(3,1) 16:48
(3,3)->(3,2) 09:32
(3,1)->(3,8) 16:48
(3,2)->(3,3) 09:33
Threefold Repetition. Draw!

ids优势没有发挥

PVS

纯 rating:
无ids:8010
ids: 16753 棋谱不变 -3,4

COMPARE_RATING_1ST_VALUE_2ND
无ids: 7117
ids: 17002 自对弈不变

COMPARE_VALUE_1ST_RATING_2ND
无ids:8303
有ids: 18117 棋谱改变, -2,4

MTDF
纯 rating:
无ids: 7985
ids:15557

COMPARE_RATING_1ST_VALUE_2ND
无ids: 6483 棋谱改变,-1,3
有ids: 13663 棋谱改变,-1,1

COMPARE_VALUE_1ST_RATING_2ND
无ids:9016
有ids: 18996 棋谱改变,黑胜 -1,4

d加深对战结果

d+5 Vs d+0
25% : 70% : 5%, d+5作为黑方胜率 提升14%
0.7% : 91% : 8%, d+5作为白方胜率提升7%

d+6 Vs d+0
27% : 69% : 5%,, d+5作为黑方胜率 提升13%
2% : 92 : 6%, d+5作为白方胜率提升8%

开IDS会胜率升3%左右

IDS和无IDS对战
342:2313:124 12.30%:83.23%:4.46%
266:2297:77 10.07%:87.00%:2.91%

IDS自己对战
220:2167:75 8.93%:88.01%:3.04% 白方优势更加明显
非IDS自己对战,
11%:84%:5% 左右

不开IDS会快80.6%

开局库研究

目前开局不会利用禁点阻隔,例如 (2,6) (2,8) (1,6) 后最佳应该是 (1,4)

开局库

下6万多盘。
深度24时,黑方 19 不是最优,但如果走19, 那么白方如何应招?
19-23: 2.30% : 92.37% : 5.31% 表现更优
19-17: 14.38% : 79.75% : 5.86%
但是如果下深度24,会优选 19-17, 和概率统计不符。

Debug 1/5000 probability appears inHand/onBoard or board->locations[] confusion

现象:
未打开必败认输选项。在
void Game::generateMoves(Stack<move_t, MOVE_COUNT> &moves) 函数中,运行到 case ACTION_PLACE: 这个分支,在这断代码中一直 continue:

                if (boardLocations[square]) {
                    continue;
                }

因 boardLocations 已经全满了,但是当前状态还未跳转到 MOVING。

如下面附件表格记录的两个复现Case,
查看此时的 position 下的变量可知:

Case1:
黑方:inHand 异常变为 -1,正确应为0, onBoard 异常变为 13,正确应为12;
白方:board[28] 的值为13,超过12,异常。

Case2:
黑方: inHand 为 1,按 board 来看应该是0;
白方: onBoard 为10,按 board 来看应该是11;
看 board,发现白方在12、30位置都是 [0x29,重复了,为异常。]

概率:
对于 814ed29 版本, Debug 模式约 5000 次出现一次。
Release 下开5个实例,测试 8000 次未复现。

建立开局库

19 23 21 此时白方最佳选择是20,次佳选择是17
实验700-100盘,+19 23 +21 20 +27 11 +29, 下一步白方13堵,95%胜率,左上角31则也是95%胜率,可以作为备选,但可能是因为黑方下一步应招是先堵而非先成三。排第三是16, 86%胜率也不低。

    int table[2][4] = {
        {19, 21, 27, 29},
        {23, 20, 11,28} // 31 24 25 16 17 15 8 9 30 22 14 10 18 26 13 12 28
    };

吃子应该的策略

  • 尽量阻止对方下步成三,
  • 如果被吃的子在对方三连中, 尤其是非三连的相邻点上还有对方的子,更吃不得.

黑方调整depth后胜率变化

0dbce75
v0.5.2 原来 是1 7 9 12, 胜率 39%:57%


MillGame-1-5-7.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10760
Black	4485	4168
White	5922	5503
Draw	353	328

MillGame-1-6-8.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10629
Black	4485	4219
White	5789	5446
Draw	355	333

MillGame-1-6-8-12-14-16-16-16-16-16-14-14.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9616
Black	4149	4314
White	5136	5341
Draw	331	344


MillGame-1-8-10.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1301
Black	502	3858
White	751	5772
Draw	48	368



MillGame-1-8-11.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1266
Black	497	3925
White	720	5687
Draw	49	387


MillGame-1-10-12.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1185
Black	453	3822
White	685	5780
Draw	47	396

MillGame-1-8-11-12-13-15.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9966
Black	3983	3996
White	5621	5640
Draw	362	363


MillGame-1-6-8-12-13-15.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9503
Black	3997	4206
White	5245	5519
Draw	261	274

MillGame-1-9-11.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1265
Black	490	3873
White	727	5747
Draw	48	379

MillGame-1-9-12-12-14-16-16-17-16-15-14-14.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10064
Black	4072	4046
White	5647	5611
Draw	345	342


NeedMove赋予更高分数

VALUE_EACH_PIECE_NEEDREMOVE = 200,
VALUE_EACH_PIECE_NEEDREMOVE_2 = 200,

黑方8:3获胜,以往只能拿到36%的胜率.

IDS中途认为某着法会败但是更深反而不认为败

1019-lose.txt

(3,3) 这步,

Thread 2 start
Depth: 16
IDS:
==============================
==============================
==============================
50(50) : --------------- depth = 2/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   150     0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   150     0
[05] 10 (1,3)   150     0
[06] 14 (1,7)   150     0

0(-50) : --------------- depth = 3/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   150     0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   150     0
[05] 10 (1,3)   150     0
[06] 14 (1,7)   150     0

50(50) : --------------- depth = 4/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 16 (2,1)   100     0
[02] 22 (2,7)   100     0
[03] 24 (3,1)   100     0
[04] 26 (3,3)   100     0
[05] 10 (1,3)   100     0
[06] 14 (1,7)   100     0

0(-50) : --------------- depth = 5/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   0       0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   0       0
[05] 10 (1,3)   0       0
[06] 14 (1,7)   150     0

50(50) : --------------- depth = 6/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 22 (2,7)   100     0
[02] 26 (3,3)   50      0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

0(-50) : --------------- depth = 7/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 26 (3,3)   0       0
[02] 22 (2,7)   0       0
[03] 10 (1,3)   0       0
[04] 16 (2,1)   150     0
[05] 24 (3,1)   150     0
[06] 14 (1,7)   150     0

0(0) : --------------- depth = 8/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 26 (3,3)   50      0
[02] 22 (2,7)   50      0
[03] 10 (1,3)   50      0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

100(100) : --------------- depth = 9/16 ---------------
[00] 8  (1,1)   128     10
[01] 26 (3,3)   100     0
[02] 22 (2,7)   100     0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

100(0) : --------------- depth = 10/16 ---------------
[00] 8  (1,1)   100     10 *
[01] 26 (3,3)   100     0
[02] 22 (2,7)   100     0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

128(28) : --------------- depth = 11/16 ---------------
[00] 8  (1,1)   128     10 *
[01] 26 (3,3)   128     0
[02] 22 (2,7)   128     0
[03] 10 (1,3)   128     0
[04] 16 (2,1)   200     0
[05] 24 (3,1)   128     0
[06] 14 (1,7)   128     0

228(100) : --------------- depth = 12/16 ---------------
[00] 8  (1,1)   228     10 *
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 24 (3,1)   228     0
[05] 14 (1,7)   228     0
[06] 16 (2,1)   228     0

200(-28) : --------------- depth = 13/16 ---------------
[00] 8  (1,1)   10000   10
[01] 26 (3,3)   200     0
[02] 22 (2,7)   200     0
[03] 10 (1,3)   200     0
[04] 24 (3,1)   200     0
[05] 14 (1,7)   200     0
[06] 16 (2,1)   200     0

228(28) : --------------- depth = 14/16 ---------------
[00] 8  (1,1)   10000   10  # 这步认为会败
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 24 (3,1)   300     0
[05] 14 (1,7)   228     0
[06] 16 (2,1)   300     0

200(-28) : --------------- depth = 15/16 ---------------
[00] 8  (1,1)   328     10  # 这步又认为不会败
[01] 26 (3,3)   200     0
[02] 22 (2,7)   200     0
[03] 10 (1,3)   200     0
[04] 14 (1,7)   200     0
[05] 24 (3,1)   200     0
[06] 16 (2,1)   200     0


31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 8  (1,1)   300     10
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 14 (1,7)   228     0
[05] 24 (3,1)   228     0
[06] 16 (2,1)   228     0
Evaluated: 535212 / 3258952 = 16%
Pool 0000020CFC644070 - Used: 245760 (12%), Free: 1851392 (88%)

Computer: (3,3)

v0.6.1 和不同深度对战结果

执白对 d+3_ids: 673:673:49 48%:48%:4% 打平,胜率没有比d+2_ids变高
执白对 d+2_ids: 3002:2608:123 52%:45%:2% 胜率大降30%
执白对 d+2: 2505:3788:82 39%:59%:1%, 胜率下降15%
执白对ids,3813:7807:161 32%:66%:1% 胜率下降8%
执黑对ids: 1905:14647:1225 11%:88%:1% 胜率下降14%

开置换表后胜率下降3%-6%

哈希是 7172/978=7.33倍

和未开哈希的对战,执黑胜率升3%,执白胜率升6%

376:1240:65 22.36%:73.76%:3.86%
190:1520:65 10.70%:85.63%:3.66%

点开局时异常

 	ucrtbased.dll!00007ff96e7bb7ec()	Unknown
 	ucrtbased.dll!00007ff96e7bb737()	Unknown
>	NineChess.exe!std::vector<NineChessAi_ab::Node *,std::allocator<NineChessAi_ab::Node *> >::operator[](const unsigned __int64 _Pos) Line 1465	C++
 	NineChess.exe!NineChessAi_ab::bestMove() Line 1116	C++
 	NineChess.exe!AiThread::run() Line 134	C++

    _NODISCARD _Ty& operator[](const size_type _Pos) {
        auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(
            _Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0

        return _My_data._Myfirst[_Pos];
    }

iTouch 闪退

QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
isEngine2: AI(1) set Action:  "(1,4)"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
Depth: 13
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
Timeout

IDS Time:  101.72 s
rows: 8  current: -1
rows: 1  current: 0
"r2 s050 t00"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
rows: 2  current: -1
rows: 1  current: 0
"r2 s050 t00"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")

21:13:16: Starting remote process.
Thread 2 start
QMainWindowLayout(0x10381b000, name = "_layout") is laying out QStatusBar(0x2835a9680, name="statusBar") outside of the contents rect of NineChessWindow(0x16f7c7b90, name="NineChessWindowClass")
qt.qpa.glcontext: explicitly glFinishing and deactivating QOpenGLContext(0x283981fd0, nativeHandle=QVariant(Invalid), format=QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize -1, greenBufferSize -
1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::NoProfile), surface=0x281f978b0, screen="iPod touc
h built-in display")

d=23还没摆完棋就胜负已定

Thread 2 start
Thread 1 start
Depth: 23
Timeout
Computer: (3,1)

秒棋!
将在 23 步后领先 4 子


Depth: 23
Computer: (1,2)

将在 23 步后双方保持均势


Depth: 23
Computer: (1,1)

坏棋, 被拉回均势!
将在 23 步后双方保持均势


Depth: 23
Computer: (2,1)

将在 23 步后落后 1 子


Depth: 23
Computer: (1,4)

将在 23 步后领先 1 子


Depth: 23
Computer: (3,4)

落后幅度扩大
将在 23 步后落后 2 子


Depth: 23
Computer: (1,6)

领先幅度扩大
将在 23 步后领先 2 子


Depth: 23
Computer: (1,5)

将在 23 步后落后 2 子


Depth: 23
Computer: (1,8)

将在 23 步后领先 2 子


Depth: 23
Computer: (2,2)

落后幅度扩大
将在 23 步后落后 3 子


Depth: 23
Computer: (1,7)

领先幅度扩大
将在 23 步后领先 3 子


Depth: 23
Computer: -(2,1)

将在 23 步后领先 3 子


Depth: 23
Computer: (3,2)

落后幅度扩大
将在 23 步后落后 4 子


Depth: 23
Computer: -(3,1)

将在 23 步后落后 4 子


Depth: 23
Computer: (2,6)

领先幅度扩大
将在 23 步后领先 4 子


Depth: 23
Computer: (3,6)

落后幅度扩大
将在 23 步后落后 5 子


Depth: 23
Computer: (2,7)

领先幅度扩大
将在 23 步后领先 5 子


Depth: 23
Computer: (3,3)

将在 23 步后落后 5 子


Depth: 23
Computer: -(2,7)

落后幅度扩大
将在 23 步后落后 6 子


Depth: 23
Computer: (2,4)

领先幅度扩大
将在 23 步后领先 6 子


Depth: 23
Computer: (3,5)

将在 23 步后落后 6 子


Depth: 23
Computer: -(2,4)

落后幅度扩大
将在 23 步后落后 7 子


Depth: 23
Computer: (2,3)

领先幅度扩大
将在 23 步后领先 7 子


Depth: 23
Computer: (2,5)

将在 23 步后落后 7 子


Depth: 23
Computer: -(2,3)

落后幅度扩大
将在 23 步后落后 8 子


Depth: 23
Computer: (1,3)

领先幅度扩大
将在 23 步后赢棋!


Depth: 23
Computer: (2,8)

落后幅度扩大
将在 23 步后输棋!


Depth: 23
T

黑方不能探查到输棋

969aee6

自对弈

0(0) 50(50) 0(-50) -128(-128) -100(28) -128(-28) -228(-100) -200(28) -228(-28) -328(-100) -629(-301) -930(-301) -1231(-301)
31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 26 (3,3)   -1382   0
[01] 10 (1,3)   -1382   0
[02] 18 (2,3)   -1382   0
[03] 22 (2,7)   -1382   0
Evaluated: 718005 / 2853227 = 25%
Pool 000000002fa02040 - Used: 606208 (29%), Free: 1490944 (71%)

Computer: (3,3)

自对弈黑白胜率不均衡

39%:57% 不均衡。

从第9步开始,黑方深度
若+1,则 42:55
若+2,则42:54
若+3,则47:50
若+4,则50:46

昏着调试

(2,6)
(2,2)

(2.4)
(2,5)

(1,4)
(3,4)

(1,2)
(1.3)

(2.8)

此时白方可能不会堵, 若堵, 自对弈会胜.

如果只用 min max, 结果为:

Depth: 9
Total Time:  691.341 s

31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 25	(3,2)	150
[01] 13	(1,6)	150
[02] 31	(3,8)	200
[03] 15	(1,8)	150
[04] 29	(3,6)	150
[05] 16	(2,1)	200
[06] 18	(2,3)	150
[07] 22	(2,7)	150
[08] 8	(1,1)	200
[09] 24	(3,1)	200
[10] 26	(3,3)	0 *
[11] 28	(3,5)	0 *
[12] 14	(1,7)	200
[13] 30	(3,7)	200
[14] 12	(1,5)	150
Evaluated:  1783671724 / 2051658330  =  86 %
Computer: (3,3) 

isEngine2: AI(1) set Action:  "(3,3)"

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.