Code Monkey home page Code Monkey logo

mzinga's Introduction

Mzinga Banner

Mzinga

CI Build

Mzinga is a collection of open-source software to play the abstract board game Hive, with the primary goal of building a community of developers who create Hive-playing AIs.

To that end, Mzinga proposes a Universal Hive Protocol to support interoperability for Hive-playing software.

For more information on Mzinga and its projects, please check out the Mzinga Wiki.

Installation

Mzinga was written in C# and should run anywhere that supports .NET 6.0. It has been officially tested on:

  • Windows 10 and 11
  • Ubuntu 20.04
  • macOS 10.15

Windows

Standard

The standard Windows release provides self-contained x86/x64/arm64 binaries which run on Windows 7 SP1+, 8.1, 10, and 11.

  1. Download the latest Windows zip file (Mzinga.WinX86.zip, Mzinga.WinX64.zip, or Mzinga.WinArm64.zip) from https://github.com/jonthysell/Mzinga/releases/latest
  2. Extract the zip file

Note: If you're unsure which version to download, try Mzinga.WinX64.zip first. Most modern PCs are x64.

Setup MSI

A standalone version of MzingaViewer is available via an installer which can run on Windows 7 SP1+, 8.1, 10, and 11.

  1. Download the latest Windows setup file (MzingaViewer.WinX86.Setup.msi, MzingaViewer.WinX64.Setup.msi or MzingaViewer.WinArm64.Setup.msi) from https://github.com/jonthysell/Mzinga/releases/latest
  2. Open the installer

Note: If you're unsure which version to download, try MzingaViewer.WinX64.Setup.msi first. Most modern PCs are x64.

Note: This version does not contain the MzingaEngine, MzingaPerft, or MzingaTrainer binaries.

Microsoft Store

A standalone version of MzingaViewer is available via the Microsoft Store for Windows 10 and 11: https://www.microsoft.com/en-us/p/mzingaviewer/9pm7p224hpgq

Note: This version does not contain the MzingaEngine, MzingaPerft, or MzingaTrainer binaries.

MacOS

The MacOS release provides self-contained x64/arm64 binaries which run on OSX >= 10.15.

  1. Download the latest MacOS tar.gz file (Mzinga.MacOSX64.tar.gz or Mzinga.MacOSArm64.tar.gz) from https://github.com/jonthysell/Mzinga/releases/latest
  2. Extract the tar.gz file

Note: If you're unsure which version to download, try Mzinga.MacOSX64.tar.gz first. Most modern PCs are x64.

Note: If MacOS Gatekeeper prevents you from running Mzinga, you may need to run xattr -cr on the downloaded files.

Linux

The Linux release provides self-contained x64/arm64 binaries which run on many Linux distributions.

  1. Download the latest Linux tar.gz file (Mzinga.LinuxX64.tar.gz or Mzinga.LinuxArm64.zip) from https://github.com/jonthysell/Mzinga/releases/latest
  2. Extract the tar.gz file

Note: If you're unsure which version to download, try Mzinga.LinuxX64.tar.gz first. Most modern PCs are x64.

Unpacked

The Unpacked release provides loose, framework-dependent .NET 6 binaries.

  1. Install the latest .NET Runtime
  2. Download the latest Unpacked zip file (Mzinga.Unpacked.zip) from https://github.com/jonthysell/Mzinga/releases/latest
  3. Extract the zip file

Copyright

Hive Copyright (c) 2016 Gen42 Games. Mzinga is in no way associated with or endorsed by Gen42 Games.

Mzinga Copyright (c) 2015-2024 Jon Thysell.

Avalonia Copyright (c) .NET Foundation and Contributors.

Markdown.Avalonia Copyright (c) 2010 Bevan Arps, 2020 Whistyun.

Mono.Unix Copyright (c) 2021 Mono Project.

MVVM Toolkit Copyright (c) .NET Foundation and Contributors.

mzinga's People

Contributors

jonthysell 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mzinga's Issues

Viewer: Add viewer options window

Options should be limited to viewer specifics, like:

  • Highlight valid moves when a piece is selected
  • Restrict playing to valid moves

Trainer: Track Win/Loss records

Individual AIs should track how many wins and losses (and draws) so we can see both their records and use that information to determine provisional status.

Viewer: Engine Console accepts input while processing

  1. Type "undo" on a computer's move
  2. "Type "undo" again before the computer makes it's move

Expected: While the Engine is running or waiting for a computer to move

Actual: Can send the message mid-process of the engine's output and cause an error

Improve MoveSet perf with HashSet internally

No reason to implement as I have with all of the array copying, since I don't really care if they're in order and HashSet will be faster

Will also need to give Move a better GetHashcode

Fix automatic versioning

The automatic versioning extension I was using breaks the Profiler, which is way too useful to lose.

Auto-play should check if it can pass before running AI

If we know we only have one move:

if it's a Pass, we should disable finding the bestmove by button

If it's not a pass, we should run findbestmove anyway, let the engine be responsible for being fast

When auto-playing, we should pass only if the best move is a pass.

P.S. we should cache the direct result of FindBestMove in the Viewer (but reset it if the user selects a new target)

Unexpected one-hive error when playing BB

Engine console output:

id Mzinga.Engine 0.9.16019.210
ok
newgame
NotStarted;White[1]
ok
validmoves
WS1[0,0,0];WB1[0,0,0];WG1[0,0,0];WA1[0,0,0]
ok
history
ย 
ok
play WA1[0,0,0]
InProgress;Black[1];WA1[0,0,0]
ok
validmoves
BS1[-1,0,1];BS1[-1,1,0];BS1[0,-1,1];BS1[0,1,-1];BS1[1,-1,0];BS1[1,0,-1];BB1[-1,0,1];BB1[-1,1,0];BB1[0,-1,1];BB1[0,1,-1];BB1[1,-1,0];BB1[1,0,-1];BG1[-1,0,1];BG1[-1,1,0];BG1[0,-1,1];BG1[0,1,-1];BG1[1,-1,0];BG1[1,0,-1];BA1[-1,0,1];BA1[-1,1,0];BA1[0,-1,1];BA1[0,1,-1];BA1[1,-1,0];BA1[1,0,-1]
ok
history
WA1[] > WA1[0,0,0]
ok
play BS1[0,1,-1]
InProgress;White[2];WA1[0,0,0];BS1[0,1,-1]
ok
validmoves
WQ[-1,0,1];WQ[0,-1,1];WQ[1,-1,0];WS1[-1,0,1];WS1[0,-1,1];WS1[1,-1,0];WB1[-1,0,1];WB1[0,-1,1];WB1[1,-1,0];WG1[-1,0,1];WG1[0,-1,1];WG1[1,-1,0];WA2[-1,0,1];WA2[0,-1,1];WA2[1,-1,0]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1]
ok
play WG1[1,-1,0]
InProgress;Black[2];WG1[1,-1,0];WA1[0,0,0];BS1[0,1,-1]
ok
validmoves
BQ[-1,2,-1];BQ[0,2,-2];BQ[1,1,-2];BS2[-1,2,-1];BS2[0,2,-2];BS2[1,1,-2];BB1[-1,2,-1];BB1[0,2,-2];BB1[1,1,-2];BG1[-1,2,-1];BG1[0,2,-2];BG1[1,1,-2];BA1[-1,2,-1];BA1[0,2,-2];BA1[1,1,-2]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0]
ok
play BG1[0,2,-2]
InProgress;White[3];WG1[1,-1,0];WA1[0,0,0];BS1[0,1,-1];BG1[0,2,-2]
ok
validmoves
WQ[-1,0,1];WQ[0,-1,1];WQ[1,-2,1];WQ[2,-2,0];WQ[2,-1,-1];WS1[-1,0,1];WS1[0,-1,1];WS1[1,-2,1];WS1[2,-2,0];WS1[2,-1,-1];WB1[-1,0,1];WB1[0,-1,1];WB1[1,-2,1];WB1[2,-2,0];WB1[2,-1,-1];WG2[-1,0,1];WG2[0,-1,1];WG2[1,-2,1];WG2[2,-2,0];WG2[2,-1,-1];WA2[-1,0,1];WA2[0,-1,1];WA2[1,-2,1];WA2[2,-2,0];WA2[2,-1,-1]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2]
ok
play WQ[1,-2,1]
InProgress;Black[3];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];BS1[0,1,-1];BG1[0,2,-2]
ok
validmoves
BQ[-1,2,-1];BQ[-1,3,-2];BQ[0,3,-3];BQ[1,1,-2];BQ[1,2,-3];BS2[-1,2,-1];BS2[-1,3,-2];BS2[0,3,-3];BS2[1,1,-2];BS2[1,2,-3];BB1[-1,2,-1];BB1[-1,3,-2];BB1[0,3,-3];BB1[1,1,-2];BB1[1,2,-3];BG2[-1,2,-1];BG2[-1,3,-2];BG2[0,3,-3];BG2[1,1,-2];BG2[1,2,-3];BA1[-1,2,-1];BA1[-1,3,-2];BA1[0,3,-3];BA1[1,1,-2];BA1[1,2,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1]
ok
play BA1[1,1,-2]
InProgress;White[4];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];BS1[0,1,-1];BG1[0,2,-2];BA1[1,1,-2]
ok
validmoves
WQ[0,-1,1];WQ[2,-2,0];WS1[-1,0,1];WS1[0,-2,2];WS1[0,-1,1];WS1[1,-3,2];WS1[2,-3,1];WS1[2,-2,0];WS1[2,-1,-1];WB1[-1,0,1];WB1[0,-2,2];WB1[0,-1,1];WB1[1,-3,2];WB1[2,-3,1];WB1[2,-2,0];WB1[2,-1,-1];WG2[-1,0,1];WG2[0,-2,2];WG2[0,-1,1];WG2[1,-3,2];WG2[2,-3,1];WG2[2,-2,0];WG2[2,-1,-1];WA2[-1,0,1];WA2[0,-2,2];WA2[0,-1,1];WA2[1,-3,2];WA2[2,-3,1];WA2[2,-2,0];WA2[2,-1,-1]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2]
ok
play WA2[0,-1,1]
InProgress;Black[4];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];BS1[0,1,-1];BG1[0,2,-2];BA1[1,1,-2]
ok
validmoves
BQ[-1,2,-1];BQ[-1,3,-2];BQ[0,3,-3];BQ[1,2,-3];BQ[2,0,-2];BQ[2,1,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1]
ok
play BQ[1,2,-3]
InProgress;White[5];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];BQ[1,2,-3];BS1[0,1,-1];BG1[0,2,-2];BA1[1,1,-2]
ok
validmoves
WQ[0,-2,2];WQ[2,-2,0];WS1[-1,-1,2];WS1[-1,0,1];WS1[0,-2,2];WS1[1,-3,2];WS1[2,-3,1];WS1[2,-2,0];WS1[2,-1,-1];WB1[-1,-1,2];WB1[-1,0,1];WB1[0,-2,2];WB1[1,-3,2];WB1[2,-3,1];WB1[2,-2,0];WB1[2,-1,-1];WG1[-1,-1,2];WG1[-1,1,0];WG1[1,-3,2];WG2[-1,-1,2];WG2[-1,0,1];WG2[0,-2,2];WG2[1,-3,2];WG2[2,-3,1];WG2[2,-2,0];WG2[2,-1,-1];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[-1,3,-2];WA2[0,-2,2];WA2[0,3,-3];WA2[1,-3,2];WA2[1,0,-1];WA2[1,3,-4];WA2[2,-3,1];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,0,-2];WA2[2,1,-3];WA2[2,2,-4];WA3[-1,-1,2];WA3[-1,0,1];WA3[0,-2,2];WA3[1,-3,2];WA3[2,-3,1];WA3[2,-2,0];WA3[2,-1,-1]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3]
ok
play WA3[2,-1,-1]
InProgress;Black[5];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];WA3[2,-1,-1];BQ[1,2,-3];BS1[0,1,-1];BG1[0,2,-2];BA1[1,1,-2]
ok
validmoves
BQ[0,3,-3];BQ[2,1,-3];BS2[-1,2,-1];BS2[-1,3,-2];BS2[0,3,-3];BS2[1,3,-4];BS2[2,1,-3];BS2[2,2,-4];BB1[-1,2,-1];BB1[-1,3,-2];BB1[0,3,-3];BB1[1,3,-4];BB1[2,1,-3];BB1[2,2,-4];BG1[0,-2,2];BG1[2,0,-2];BG1[2,2,-4];BG2[-1,2,-1];BG2[-1,3,-2];BG2[0,3,-3];BG2[1,3,-4];BG2[2,1,-3];BG2[2,2,-4];BA1[-1,-1,2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[0,-2,2];BA1[0,3,-3];BA1[1,-3,2];BA1[1,0,-1];BA1[1,3,-4];BA1[2,-3,1];BA1[2,-2,0];BA1[2,0,-2];BA1[2,1,-3];BA1[2,2,-4];BA1[3,-2,-1];BA1[3,-1,-2];BA2[-1,2,-1];BA2[-1,3,-2];BA2[0,3,-3];BA2[1,3,-4];BA2[2,1,-3];BA2[2,2,-4]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1]
ok
play BA1[2,-3,1]
InProgress;White[6];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];WA3[2,-1,-1];BQ[1,2,-3];BS1[0,1,-1];BG1[0,2,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,-1,2];WS1[-1,0,1];WS1[0,-2,2];WS1[2,0,-2];WS1[3,-2,-1];WS1[3,-1,-2];WB1[-1,-1,2];WB1[-1,0,1];WB1[0,-2,2];WB1[2,0,-2];WB1[3,-2,-1];WB1[3,-1,-2];WG2[-1,-1,2];WG2[-1,0,1];WG2[0,-2,2];WG2[2,0,-2];WG2[3,-2,-1];WG2[3,-1,-2];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[-1,3,-2];WA2[0,-2,2];WA2[0,3,-3];WA2[1,-3,2];WA2[1,0,-1];WA2[1,1,-2];WA2[1,3,-4];WA2[2,-4,2];WA2[2,-2,0];WA2[2,0,-2];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-2,-1];WA2[3,-1,-2];WA3[-1,-1,2];WA3[-1,0,1];WA3[-1,1,0];WA3[-1,2,-1];WA3[-1,3,-2];WA3[0,-2,2];WA3[0,3,-3];WA3[1,-3,2];WA3[1,0,-1];WA3[1,1,-2];WA3[1,3,-4];WA3[2,-4,2];WA3[2,-2,0];WA3[2,1,-3];WA3[2,2,-4];WA3[3,-4,1];WA3[3,-3,0]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1]
ok
play WA3[1,1,-2]
InProgress;Black[6];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BG1[0,2,-2];BA1[2,-3,1]
ok
validmoves
BQ[0,3,-3];BQ[2,1,-3];BS2[-1,2,-1];BS2[-1,3,-2];BS2[0,3,-3];BS2[1,3,-4];BS2[2,-4,2];BS2[2,2,-4];BS2[3,-4,1];BS2[3,-3,0];BB1[-1,2,-1];BB1[-1,3,-2];BB1[0,3,-3];BB1[1,3,-4];BB1[2,-4,2];BB1[2,2,-4];BB1[3,-4,1];BB1[3,-3,0];BG1[0,-2,2];BG1[2,0,-2];BG1[2,2,-4];BG2[-1,2,-1];BG2[-1,3,-2];BG2[0,3,-3];BG2[1,3,-4];BG2[2,-4,2];BG2[2,2,-4];BG2[3,-4,1];BG2[3,-3,0];BA1[-1,-1,2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[0,-2,2];BA1[0,3,-3];BA1[1,-3,2];BA1[1,0,-1];BA1[1,3,-4];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,0,-2];BA1[2,1,-3];BA1[2,2,-4];BA2[-1,2,-1];BA2[-1,3,-2];BA2[0,3,-3];BA2[1,3,-4];BA2[2,-4,2];BA2[2,2,-4];BA2[3,-4,1];BA2[3,-3,0]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2]
ok
play BG1[2,0,-2]
InProgress;White[7];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[0,-1,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,-1,2];WS1[-1,0,1];WS1[0,-2,2];WB1[-1,-1,2];WB1[-1,0,1];WB1[0,-2,2];WG1[-1,-1,2];WG1[-1,1,0];WG1[1,-3,2];WG2[-1,-1,2];WG2[-1,0,1];WG2[0,-2,2];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[0,-2,2];WA2[0,2,-2];WA2[0,3,-3];WA2[1,-3,2];WA2[1,3,-4];WA2[2,-4,2];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-1,-2];WA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2]
ok
play WA2[1,3,-4]
InProgress;Black[7];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[-1,2,-1];BS2[2,-4,2];BS2[3,-4,1];BS2[3,-3,0];BS2[3,-1,-2];BS2[3,0,-3];BB1[-1,2,-1];BB1[2,-4,2];BB1[3,-4,1];BB1[3,-3,0];BB1[3,-1,-2];BB1[3,0,-3];BG1[0,2,-2];BG2[-1,2,-1];BG2[2,-4,2];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-1,-2];BG2[3,0,-3];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,3,-3];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-1,-2];BA1[3,0,-3];BA2[-1,2,-1];BA2[2,-4,2];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-1,-2];BA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4]
ok
play BB1[-1,2,-1]
InProgress;White[8];WQ[1,-2,1];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[-1,2,-1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,0,1];WS1[0,-2,2];WS1[0,-1,1];WS1[0,4,-4];WS1[1,4,-5];WS1[2,3,-5];WB1[-1,0,1];WB1[0,-2,2];WB1[0,-1,1];WB1[0,4,-4];WB1[1,4,-5];WB1[2,3,-5];WG2[-1,0,1];WG2[0,-2,2];WG2[0,-1,1];WG2[0,4,-4];WG2[1,4,-5];WG2[2,3,-5];WA2[-2,2,0];WA2[-2,3,-1];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,3,-2];WA2[0,-2,2];WA2[0,-1,1];WA2[0,2,-2];WA2[0,3,-3];WA2[1,-3,2];WA2[2,-4,2];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-1,-2];WA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1]
ok
play WS1[0,-2,2]
InProgress;Black[8];WQ[1,-2,1];WS1[0,-2,2];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[-1,2,-1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[-2,2,0];BS2[-2,3,-1];BS2[-1,3,-2];BS2[2,-4,2];BS2[3,-4,1];BS2[3,-3,0];BS2[3,-1,-2];BS2[3,0,-3];BB1[-1,1,0];BB1[0,1,-1,1];BB1[0,2,-2];BB2[-2,2,0];BB2[-2,3,-1];BB2[-1,3,-2];BB2[2,-4,2];BB2[3,-4,1];BB2[3,-3,0];BB2[3,-1,-2];BB2[3,0,-3];BG1[0,2,-2];BG2[-2,2,0];BG2[-2,3,-1];BG2[-1,3,-2];BG2[2,-4,2];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-1,-2];BG2[3,0,-3];BA1[-2,2,0];BA1[-2,3,-1];BA1[-1,-2,3];BA1[-1,-1,2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,3,-2];BA1[0,-3,3];BA1[0,-1,1];BA1[0,2,-2];BA1[0,3,-3];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-1,-2];BA1[3,0,-3];BA2[-2,2,0];BA2[-2,3,-1];BA2[-1,3,-2];BA2[2,-4,2];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-1,-2];BA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2]
ok
play BB1[0,1,-1,1]
InProgress;White[9];WQ[1,-2,1];WS1[0,-2,2];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[0,1,-1,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,1,0];WS1[3,-4,1];WS2[-1,-2,3];WS2[-1,-1,2];WS2[-1,0,1];WS2[0,-3,3];WS2[0,-1,1];WS2[0,4,-4];WS2[1,4,-5];WS2[2,3,-5];WB1[-1,-2,3];WB1[-1,-1,2];WB1[-1,0,1];WB1[0,-3,3];WB1[0,-1,1];WB1[0,4,-4];WB1[1,4,-5];WB1[2,3,-5];WG2[-1,-2,3];WG2[-1,-1,2];WG2[-1,0,1];WG2[0,-3,3];WG2[0,-1,1];WG2[0,4,-4];WG2[1,4,-5];WG2[2,3,-5];WA2[-1,-2,3];WA2[-1,-1,2];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[0,-3,3];WA2[0,-1,1];WA2[0,2,-2];WA2[0,3,-3];WA2[1,-3,2];WA2[2,-4,2];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-1,-2];WA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1]
ok
play WS1[-1,1,0]
InProgress;Black[9];WQ[1,-2,1];WS1[-1,1,0];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[0,1,-1,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[1,1,-2,1];BS2[2,-4,2];BS2[3,-4,1];BS2[3,-3,0];BS2[3,-1,-2];BS2[3,0,-3];BB1[-1,1,0,1];BB1[-1,2,-1];BB1[0,0,0,1];BB1[0,2,-2];BB1[1,0,-1];BB1[1,1,-2,1];BB2[1,1,-2,1];BB2[2,-4,2];BB2[3,-4,1];BB2[3,-3,0];BB2[3,-1,-2];BB2[3,0,-3];BG1[0,2,-2];BG2[1,1,-2,1];BG2[2,-4,2];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-1,-2];BG2[3,0,-3];BA1[-2,1,1];BA1[-2,2,0];BA1[-1,0,1];BA1[-1,2,-1];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,3,-3];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-1,-2];BA1[3,0,-3];BA2[1,1,-2,1];BA2[2,-4,2];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-1,-2];BA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0]
ok
play BB1[0,0,0,1]
InProgress;White[10];WQ[1,-2,1];WS1[-1,1,0];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[0,0,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[0,-2,2];WS1[0,3,-3];WS2[-2,1,1];WS2[-2,2,0];WS2[0,-2,2];WS2[0,4,-4];WS2[1,4,-5];WS2[2,3,-5];WB1[-2,1,1];WB1[-2,2,0];WB1[0,-2,2];WB1[0,4,-4];WB1[1,4,-5];WB1[2,3,-5];WG2[-2,1,1];WG2[-2,2,0];WG2[0,-2,2];WG2[0,4,-4];WG2[1,4,-5];WG2[2,3,-5];WA2[-2,1,1];WA2[-2,2,0];WA2[-1,0,1];WA2[-1,2,-1];WA2[0,-2,2];WA2[0,-1,1];WA2[0,2,-2];WA2[0,3,-3];WA2[1,-3,2];WA2[2,-4,2];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-1,-2];WA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1]
ok
play WS1[0,3,-3]
InProgress;Black[10];WQ[1,-2,1];WS1[0,3,-3];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[0,0,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[-1,0,1,1];BS2[-1,1,0];BS2[-1,1,0,1];BS2[-1,2,-1];BS2[2,-4,2];BS2[3,-4,1];BS2[3,-3,0];BS2[3,-1,-2];BS2[3,0,-3];BB1[-1,0,1];BB1[-1,1,0];BB1[0,-1,1];BB1[0,1,-1,1];BB1[1,-1,0,1];BB1[1,0,-1];BB2[-1,0,1,1];BB2[-1,1,0];BB2[-1,1,0,1];BB2[-1,2,-1];BB2[2,-4,2];BB2[3,-4,1];BB2[3,-3,0];BB2[3,-1,-2];BB2[3,0,-3];BG1[0,2,-2];BG2[-1,0,1,1];BG2[-1,1,0];BG2[-1,1,0,1];BG2[-1,2,-1];BG2[2,-4,2];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-1,-2];BG2[3,0,-3];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-1,-2];BA1[3,0,-3];BA2[-1,0,1,1];BA2[-1,1,0];BA2[-1,1,0,1];BA2[-1,2,-1];BA2[2,-4,2];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-1,-2];BA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3]
ok
play BB1[1,-1,0,1]
InProgress;White[11];WQ[1,-2,1];WS1[0,3,-3];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[1,-1,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,1,0];WS1[2,3,-5];WS2[-1,0,1];WS2[-1,3,-2];WS2[-1,4,-3];WS2[0,-2,2];WS2[0,4,-4];WS2[1,4,-5];WS2[2,3,-5];WB1[-1,0,1];WB1[-1,3,-2];WB1[-1,4,-3];WB1[0,-2,2];WB1[0,4,-4];WB1[1,4,-5];WB1[2,3,-5];WG2[-1,0,1];WG2[-1,3,-2];WG2[-1,4,-3];WG2[0,-2,2];WG2[0,4,-4];WG2[1,4,-5];WG2[2,3,-5];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[-1,3,-2];WA2[-1,4,-3];WA2[0,-2,2];WA2[0,-1,1];WA2[0,2,-2];WA2[0,4,-4];WA2[1,-3,2];WA2[2,-4,2];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,1,-3];WA2[2,2,-4];WA2[3,-4,1];WA2[3,-3,0];WA2[3,-1,-2];WA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1]
ok
play WS2[2,3,-5]
InProgress;Black[11];WQ[1,-2,1];WS1[0,3,-3];WS2[2,3,-5];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BB1[1,-1,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[-1,2,-1];BS2[0,0,0,1];BS2[1,-2,1,1];BS2[2,-4,2];BS2[2,-1,-1];BS2[2,-1,-1,1];BS2[3,-4,1];BS2[3,-3,0];BS2[3,-1,-2];BS2[3,0,-3];BB1[0,-1,1];BB1[0,0,0,1];BB1[1,-2,1,1];BB1[1,0,-1];BB1[2,-2,0];BB1[2,-1,-1];BB2[-1,2,-1];BB2[0,0,0,1];BB2[1,-2,1,1];BB2[2,-4,2];BB2[2,-1,-1];BB2[2,-1,-1,1];BB2[3,-4,1];BB2[3,-3,0];BB2[3,-1,-2];BB2[3,0,-3];BG1[0,2,-2];BG2[-1,2,-1];BG2[0,0,0,1];BG2[1,-2,1,1];BG2[2,-4,2];BG2[2,-1,-1];BG2[2,-1,-1,1];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-1,-2];BG2[3,0,-3];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,4,-6];BA1[3,-1,-2];BA1[3,0,-3];BA1[3,2,-5];BA1[3,3,-6];BA2[-1,2,-1];BA2[0,0,0,1];BA2[1,-2,1,1];BA2[2,-4,2];BA2[2,-1,-1];BA2[2,-1,-1,1];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-1,-2];BA2[3,0,-3]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5]
ok
play
InProgress;White[12];WQ[1,-2,1];WS1[0,3,-3];WS2[2,3,-5];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
WS1[-1,1,0];WS1[2,4,-6];WS2[-1,4,-3];WS2[3,0,-3];WB1[-1,0,1];WB1[-1,3,-2];WB1[-1,4,-3];WB1[0,-2,2];WB1[0,4,-4];WB1[1,4,-5];WB1[2,4,-6];WB1[3,2,-5];WB1[3,3,-6];WG2[-1,0,1];WG2[-1,3,-2];WG2[-1,4,-3];WG2[0,-2,2];WG2[0,4,-4];WG2[1,4,-5];WG2[2,4,-6];WG2[3,2,-5];WG2[3,3,-6]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2]
ok
play
InProgress;Black[12];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[2,-3,1]
ok
validmoves
BS2[3,-3,0];BS2[3,1,-4];BB1[0,-1,1];BB1[0,0,0,1];BB1[1,-2,1,1];BB1[1,0,-1];BB1[2,-2,0];BB1[2,-1,-1];BB2[-1,2,-1];BB2[0,0,0,1];BB2[1,-2,1,1];BB2[2,-4,2];BB2[2,-1,-1];BB2[2,-1,-1,1];BB2[3,-4,1];BB2[3,-3,0];BB2[3,-2,-1];BB2[4,-2,-2];BG2[-1,2,-1];BG2[0,0,0,1];BG2[1,-2,1,1];BG2[2,-4,2];BG2[2,-1,-1];BG2[2,-1,-1,1];BG2[3,-4,1];BG2[3,-3,0];BG2[3,-2,-1];BG2[4,-2,-2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,-3,2];BA1[1,4,-5];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,1,-3];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-2,-1];BA1[3,1,-4];BA1[4,-2,-2];BA1[4,-1,-3];BA1[4,0,-4];BA2[-1,2,-1];BA2[0,0,0,1];BA2[1,-2,1,1];BA2[2,-4,2];BA2[2,-1,-1];BA2[2,-1,-1,1];BA2[3,-4,1];BA2[3,-3,0];BA2[3,-2,-1];BA2[4,-2,-2]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3]
ok
play
InProgress;White[13];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,4,-5]
ok
validmoves
WQ[0,-1,1];WQ[2,-2,0];WS1[-1,1,0];WS1[1,5,-6];WS2[2,3,-5];WS2[3,-2,-1];WB1[-1,0,1];WB1[-1,3,-2];WB1[-1,4,-3];WB1[0,-2,2];WB1[1,-3,2];WB1[2,-3,1];WB1[3,1,-4];WB1[4,0,-4];WG2[-1,0,1];WG2[-1,3,-2];WG2[-1,4,-3];WG2[0,-2,2];WG2[1,-3,2];WG2[2,-3,1];WG2[3,1,-4];WG2[4,0,-4]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5]
ok
play
InProgress;Black[13];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,4,-5]
ok
validmoves
BS2[2,-3,1];BS2[4,1,-5];BB1[0,-1,1];BB1[0,0,0,1];BB1[1,-2,1,1];BB1[1,0,-1];BB1[2,-2,0];BB1[2,-1,-1];BB2[-1,2,-1];BB2[0,0,0,1];BB2[0,5,-5];BB2[1,-2,1,1];BB2[1,5,-6];BB2[2,-1,-1];BB2[2,-1,-1,1];BB2[2,4,-6];BB2[3,-2,-1];BB2[4,-2,-2];BG2[-1,2,-1];BG2[0,0,0,1];BG2[0,5,-5];BG2[1,-2,1,1];BG2[1,5,-6];BG2[2,-1,-1];BG2[2,-1,-1,1];BG2[2,4,-6];BG2[3,-2,-1];BG2[4,-2,-2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,-3,2];BA1[2,-3,1];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,2,-4];BA1[2,3,-5];BA1[3,-2,-1];BA1[3,2,-5];BA1[4,-2,-2];BA1[4,-1,-3];BA1[4,0,-4];BA1[4,1,-5];BA2[-1,2,-1];BA2[0,0,0,1];BA2[0,5,-5];BA2[1,-2,1,1];BA2[1,5,-6];BA2[2,-1,-1];BA2[2,-1,-1,1];BA2[2,4,-6];BA2[3,-2,-1];BA2[4,-2,-2]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5];WG2[] > WG2[3,1,-4]
ok
play
InProgress;White[14];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[1,3,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2]
ok
validmoves
WS1[-1,1,0];WS1[2,3,-5];WB1[-1,0,1];WB1[-1,3,-2];WB1[-1,4,-3];WB1[0,4,-4];WB1[1,4,-5];WB1[2,3,-5];WB1[3,2,-5];WB1[4,0,-4];WB1[4,1,-5];WG2[3,-2,-1];WG3[-1,0,1];WG3[-1,3,-2];WG3[-1,4,-3];WG3[0,4,-4];WG3[1,4,-5];WG3[2,3,-5];WG3[3,2,-5];WG3[4,0,-4];WG3[4,1,-5];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[-1,3,-2];WA2[-1,4,-3];WA2[0,-3,3];WA2[0,-2,2];WA2[0,-1,1];WA2[0,2,-2];WA2[0,4,-4];WA2[1,-4,3];WA2[2,-4,2];WA2[2,-3,1];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,2,-4];WA2[3,-2,-1];WA2[3,2,-5];WA2[4,-2,-2];WA2[4,-1,-3];WA2[4,0,-4];WA2[4,1,-5]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5];WG2[] > WG2[3,1,-4];BA1[1,4,-5] > BA1[1,-3,2]
ok
play
InProgress;Black[14];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[4,0,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2]
ok
validmoves
BS2[2,-3,1];BS2[5,0,-5];BB1[0,-1,1];BB1[0,0,0,1];BB1[1,-2,1,1];BB1[1,0,-1];BB1[2,-2,0];BB1[2,-1,-1];BB2[-1,2,-1];BB2[0,-3,3];BB2[0,0,0,1];BB2[1,-4,3];BB2[1,-2,1,1];BB2[2,-4,2];BB2[2,-1,-1];BB2[2,-1,-1,1];BB2[3,-2,-1];BB2[4,-2,-2];BG2[-1,2,-1];BG2[0,-3,3];BG2[0,0,0,1];BG2[1,-4,3];BG2[1,-2,1,1];BG2[2,-4,2];BG2[2,-1,-1];BG2[2,-1,-1,1];BG2[3,-2,-1];BG2[4,-2,-2];BA1[-1,0,1];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,3,-4];BA1[2,-3,1];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,2,-4];BA1[3,-2,-1];BA1[3,2,-5];BA1[4,-2,-2];BA1[4,-1,-3];BA1[4,1,-5];BA1[5,-1,-4];BA1[5,0,-5];BA2[-1,2,-1];BA2[0,-3,3];BA2[0,0,0,1];BA2[1,-4,3];BA2[1,-2,1,1];BA2[2,-4,2];BA2[2,-1,-1];BA2[2,-1,-1,1];BA2[3,-2,-1];BA2[4,-2,-2]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5];WG2[] > WG2[3,1,-4];BA1[1,4,-5] > BA1[1,-3,2];WA2[1,3,-4] > WA2[4,0,-4]
ok
play
InProgress;White[15];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[4,0,-4];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[0,0,0,1]
ok
validmoves
WS1[-1,1,0];WS1[3,2,-5];WB1[-1,3,-2];WB1[-1,4,-3];WB1[0,4,-4];WB1[3,2,-5];WB1[4,1,-5];WB1[5,-1,-4];WB1[5,0,-5];WG2[3,-2,-1];WG2[5,-1,-4];WG3[-1,3,-2];WG3[-1,4,-3];WG3[0,4,-4];WG3[3,2,-5];WG3[4,1,-5];WG3[5,-1,-4];WG3[5,0,-5];WA2[-1,0,1];WA2[-1,1,0];WA2[-1,2,-1];WA2[-1,3,-2];WA2[-1,4,-3];WA2[0,-3,3];WA2[0,-2,2];WA2[0,-1,1];WA2[0,2,-2];WA2[0,4,-4];WA2[1,-4,3];WA2[1,3,-4];WA2[2,-4,2];WA2[2,-3,1];WA2[2,-2,0];WA2[2,-1,-1];WA2[2,2,-4];WA2[3,-2,-1];WA2[3,2,-5];WA2[4,-2,-2];WA2[4,-1,-3];WA2[4,1,-5]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5];WG2[] > WG2[3,1,-4];BA1[1,4,-5] > BA1[1,-3,2];WA2[1,3,-4] > WA2[4,0,-4];BA2[] > BA2[0,0,0,1]
ok
play
InProgress;Black[15];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[0,0,0,1]
ok
validmoves
BS2[2,-3,1];BS2[4,1,-5];BB1[0,0,0,2];BB1[1,-2,1,1];BB1[1,0,-1];BB1[2,-2,0];BB1[2,-1,-1];BB2[-1,0,1,1];BB2[-1,2,-1];BB2[0,-3,3];BB2[1,-4,3];BB2[1,-2,1,1];BB2[2,-4,2];BB2[2,-1,-1];BB2[2,-1,-1,1];BB2[3,-2,-1];BB2[4,-2,-2];BG2[-1,0,1,1];BG2[-1,2,-1];BG2[0,-3,3];BG2[1,-4,3];BG2[1,-2,1,1];BG2[2,-4,2];BG2[2,-1,-1];BG2[2,-1,-1,1];BG2[3,-2,-1];BG2[4,-2,-2];BA1[-2,0,2];BA1[-2,1,1];BA1[-1,-1,2];BA1[-1,1,0];BA1[-1,2,-1];BA1[-1,3,-2];BA1[-1,4,-3];BA1[0,-2,2];BA1[0,-1,1];BA1[0,2,-2];BA1[0,4,-4];BA1[1,3,-4];BA1[2,-3,1];BA1[2,-2,0];BA1[2,-1,-1];BA1[2,2,-4];BA1[3,-2,-1];BA1[3,2,-5];BA1[4,-2,-2];BA1[4,-1,-3];BA1[4,0,-4];BA1[4,1,-5];BA2[0,-1,1,1];BA2[1,-2,1,1];BA2[1,0,-1,1];BA2[2,-2,0,1];BA2[2,-1,-1,1];BA3[-1,0,1,1];BA3[-1,2,-1];BA3[0,-3,3];BA3[1,-4,3];BA3[1,-2,1,1];BA3[2,-4,2];BA3[2,-1,-1];BA3[2,-1,-1,1];BA3[3,-2,-1];BA3[4,-2,-2]
ok
history
WA1[] > WA1[0,0,0];BS1[] > BS1[0,1,-1];WG1[] > WG1[1,-1,0];BG1[] > BG1[0,2,-2];WQ[] > WQ[1,-2,1];BA1[] > BA1[1,1,-2];WA2[] > WA2[0,-1,1];BQ[] > BQ[1,2,-3];WA3[] > WA3[2,-1,-1];BA1[1,1,-2] > BA1[2,-3,1];WA3[2,-1,-1] > WA3[1,1,-2];BG1[0,2,-2] > BG1[2,0,-2];WA2[0,-1,1] > WA2[1,3,-4];BB1[] > BB1[-1,2,-1];WS1[] > WS1[0,-2,2];BB1[-1,2,-1] > BB1[0,1,-1,1];WS1[0,-2,2] > WS1[-1,1,0];BB1[0,1,-1,1] > BB1[0,0,0,1];WS1[-1,1,0] > WS1[0,3,-3];BB1[0,0,0,1] > BB1[1,-1,0,1];WS2[] > WS2[2,3,-5];BS2[] > BS2[3,-1,-2];WS2[2,3,-5] > WS2[3,0,-3];BA1[2,-3,1] > BA1[1,4,-5];WG2[] > WG2[3,1,-4];BA1[1,4,-5] > BA1[1,-3,2];WA2[1,3,-4] > WA2[4,0,-4];BA2[] > BA2[0,0,0,1];WA2[4,0,-4] > WA2[-1,0,1]
ok
play
InProgress;White[16];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[2,-2,0,1]
ok
play
InProgress;Black[16];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WG3[-2,0,2];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[2,-2,0,1]
ok
play
InProgress;White[17];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WG1[1,-1,0];WG2[3,1,-4];WG3[-2,0,2];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[0,-1,1,1]
ok
bestmove
WB1[-1,3,-2]
ok
play
InProgress;Black[17];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WB1[-1,3,-2];WG1[1,-1,0];WG2[3,1,-4];WG3[-2,0,2];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BG1[2,0,-2];BA1[1,-3,2];BA2[0,-1,1,1]
ok
bestmove
BB2[3,-2,-1]
ok
play BB2[3,-2,-1]
InProgress;White[18];WQ[1,-2,1];WS1[0,3,-3];WS2[3,0,-3];WB1[-1,3,-2];WG1[1,-1,0];WG2[3,1,-4];WG3[-2,0,2];WA1[0,0,0];WA2[-1,0,1];WA3[1,1,-2];BQ[1,2,-3];BS1[0,1,-1];BS2[3,-1,-2];BB1[1,-1,0,1];BB2[3,-2,-1];BG1[2,0,-2];BA1[1,-3,2];BA2[0,-1,1,1]
ok

EvaluateMoves does not prune at first node

Add alpha/beta pruning to EvaluateMoves, to not run moves if we get an immediate win
Change Board scoring to use PositiveInfinity for win and NegativeInfinity for loss.

Undo Move only undoes CPU's move in 1p mode

  1. Start Human vs. CPU game
  2. Move
  3. After CPU move, hit "Undo Move"

Expected: Both CPU and Human move is undone
Actual: Just CPU move is undone, and player can't hit undo again

Can't place piece if neighbor bottom is the wrong color

White beetle covers a black piece on a tip. Now can't play around that tip with white because the algorithm looks only for white bottom pieces all at once, when it should look for "any" bottom piece, then get the top-most piece, then check color.

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.