Git Product home page Git Product logo

calcitem / sanmill Goto Github PK

View Code? Open in Web Editor NEW
142.0 8.0 21.0 114.96 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.94% C++ 43.93% Shell 1.46% Batchfile 0.12% Makefile 1.37% Java 0.70% Dart 48.70% CMake 1.62% Python 0.04% JavaScript 0.04% Ruby 0.17% Swift 0.33% Objective-C 0.29% Objective-C++ 0.20% Lua 0.09%
ea15e84462 morris mill mills muhle malom flutter ai alpha-beta-pruning game

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. It is distributed under the GNU General Public License version 3 (GPL v3), ensuring that it remains free software. Users can modify and redistribute the software, provided they adhere to the GPL terms.

Nine men's morris is a strategy board game for two players dating back 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 for compiling 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.

Frontend Options

Sanmill offers two frontend options: Flutter and Qt. The primary focus is on the Flutter frontend, which is actively developed and maintained, supporting Android, iOS, Windows, and macOS for a consistent cross-platform experience. The Qt frontend is mainly used for debugging the AI engine and is not actively maintained. Users are encouraged to use the Flutter frontend for the latest features and updates.

How to Build

CUI

Sanmill CUI supports 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 src folder. 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 provide information about the version and compiler used to create your executable. You can obtain this information by running:

./sanmill compiler

Flutter App

To build the Flutter app, run ./flutter-init.sh, and then use Android Studio or Visual Studio Code to open src/ui/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 will be disabled.)
  • dev_mode to show the developer mode without needing to enable it first.
  • catcher to control the use of Catcher. (Enabled by default; disable if necessary.)

All environment configs can be combined and take boolean values, like:

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

Launch configurations for Android Studio or Visual Studio Code are available. Select the needed one in the Run and Debug or Run/Debug Configurations tab.

Qt Application

To build the Qt application on Ubuntu or any Ubuntu-based GNU/Linux distribution, you must install Qt by running the following command as root:

sudo apt-get install qt6-base-dev qt6-multimedia-dev qtcreator

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

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

You can also use Visual Studio to open src\ui\qt\mill-pro.sln to build the Qt application.

Understanding the Code Base and Participating in the Project

Sanmill's improvements have been a community effort. You can contribute in several ways:

Improving the Code

  • Sanmill Wiki: Contains explanations of techniques used in Sanmill, with background information.
  • GitHub Repository: The latest source can always be found here.
  • Discussions: Join discussions about Sanmill.

Terms of Use

Sanmill is distributed under the GNU General Public License version 3 (GPL v3). This allows you to use, modify, and distribute the software, provided you include the full source code or a pointer to where the source can be found. Any changes to the source code must also be made available under the GPL.

For full details, see the GPL v3 in the Copying.txt file.

Note on App Store Distribution: As an additional permission under section 7 of the GPL v3, you are allowed to distribute the software through app stores, even if they have restrictive terms that are incompatible with the GPL. However, the source code must also be available under the GPL, either through the app store or another channel without those restrictive terms.

All unofficial builds and forks of the app must be clearly labeled as unofficial (e.g., "Sanmill UNOFFICIAL") or use a different name altogether. They must use a different application ID to avoid conflicts with official releases.

Crash Reporting and Privacy

Sanmill collects non-sensitive crash information to help improve the software. The information collected may include:

  • Device type and operating system version
  • The actions leading up to the crash
  • The crash error message

Users can review the crash report contents before sending. No personally identifiable information (PII) is collected, and all data is anonymized to ensure user privacy. Users can choose not to send crash reports if they prefer.

This data is used solely for improving the quality and stability of Sanmill and is not shared with any third parties.

Free Software Philosophy

Sanmill is free software, and we emphasize the importance of free software as a matter of freedom. We encourage the use of GPL v3 or later as a license for contributions and discourage the use of non-free licenses.

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 piotrstenke 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  avatar

sanmill's Issues

开局库

下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 次未复现。

提前认输异常

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

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

黑方不能探查到输棋

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)

搜索时没有检测和棋

造成最后能赢的变成和棋

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!

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

白方吃子不当

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!

黑方调整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


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%

吃子应该的策略

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

昏着调试

(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)"

摆子阶段最后一着如果成三则先吃子再进入走棋阶段的 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!

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

NeedMove赋予更高分数

VALUE_EACH_PIECE_NEEDREMOVE = 200,
VALUE_EACH_PIECE_NEEDREMOVE_2 = 200,

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

开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%

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%

开置换表后胜率下降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%

建立开局库

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
    };

自对弈黑白胜率不均衡

39%:57% 不均衡。

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

点开局时异常

 	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];
    }

开局库研究

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

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)

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")

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.