Substantial, insufficient work on easiness

* Allow engine arguments to depend on difficulty
* Improve difficulty levels for many engines... but not much
* Stockfish and then Phalanx are now preferred over GNUChess

Unfortunately, all of these engines are too hard for our needs.

Some of these engines seem to be Windows-only; others are proprietary;
and others don't want to compile anymore.  I've left these alone since
there's not much reason to remove them in case you do manage to get one
working. But they won't be getting difficulty levels.

https://bugzilla.gnome.org/show_bug.cgi?id=475535
This commit is contained in:
Michael Catanzaro 2013-07-21 12:12:43 -05:00
parent 29c67a3a4c
commit 188b24573f
6 changed files with 71 additions and 57 deletions

View file

@ -1,10 +1,31 @@
[Stockfish]
protocol=uci
binary=stockfish
option-easy-0=name Skill Level value 0
option-normal-0=name Skill Level value 5
option-hard-0=name Skill Level value 20
[Phalanx]
protocol=cecp
binary=phalanx
arg-easy-0=-e0
arg-normal-0=-e40
option-easy-0=easy
option-easy-1=depth 2
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[GNUchess]
protocol=cecp
binary=gnuchess
args=--xboard
arg-easy-0=--xboard
arg-normal-0=--xboard
arg-hard-0=--xboard
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Sjeng]
@ -12,7 +33,8 @@ protocol=cecp
binary=sjeng
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Amy]
@ -20,7 +42,8 @@ protocol=cecp
binary=Amy
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Crafty]
@ -28,7 +51,8 @@ protocol=cecp
binary=crafty
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Faile]
@ -36,16 +60,8 @@ protocol=cecp
binary=faile
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-hard-0=hard
[Phalanx]
protocol=cecp
binary=phalanx
option-easy-0=easy
option-easy-1=depth 1
option-easy-2=level 5
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Glaurung]
@ -58,70 +74,59 @@ option-normal-1=name Cowardice value 100
option-hard-0=name Aggressiveness value 200
option-hard-1=name Cowardice value 50
[Stockfish]
protocol=uci
binary=stockfish
option-easy-0=name Skill Level value 0
option-easy-1=name Slow Mover value 1000
option-easy-2=name Minimum Thinking Time value 5000
option-easy-3=name Threads value 1
option-normal-0=name Skill Level value 5
option-normal-1=name Slow Mover value 1000
option-normal-2=name Minimum Thinking Time value 5000
option-normal-3=name Threads value 1
option-hard-0=name Skill Level value 20
[HoiChess]
protocol=cecp
binary=hoichess
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Diablo]
protocol=uci
binary=diablo
# FIXME: Add some difficulty levels
[BBChess]
protocol=uci
binary=bbchess
# FIXME: Add some difficulty levels
[Fruit]
protocol=uci
binary=fruit
# FIXME: Add some difficulty levels
[Gambit Fruit]
protocol=uci
binary=gfruit
# FIXME: Add some difficulty levels
[Toga II]
protocol=uci
binary=toga2
# FIXME: Add some difficulty levels
[Amundsen]
protocol=cecp
binary=amundsen
option-easy-0=easy
option-easy-1=depth 1
option-normal-0=depth 4
option-normal-0=easy
option-normal-1=depth 3
option-hard-0=hard
[Boo's Chess Engine]
protocol=cecp
binary=bce boochess BACE
binary=bce
option-easy-0=easy
option-easy-1=random
option-normal-0=easy
option-hard-0=hard
[Fairy-Max]
protocol=cecp
binary=fairymax
# FIXME: Add some difficulty levels
option-easy-0=easy
option-normal-0=normal
option-hard-0=hard
[Shredder]
protocol=uci
binary=ShredderClassicLinux
# FIXME: Add some difficulty levels

View file

@ -14,7 +14,9 @@ public class AIProfile
public string protocol;
public string binary;
public string path;
public string args;
public string[] easy_args;
public string[] normal_args;
public string[] hard_args;
public string[] easy_options;
public string[] normal_options;
public string[] hard_options;
@ -49,13 +51,13 @@ public List<AIProfile> load_ai_profiles (string filename)
profile.name = name;
profile.protocol = file.get_value (name, "protocol");
profile.binary = file.get_value (name, "binary");
if (file.has_key (name, "args"))
profile.args = file.get_value (name, "args");
else
profile.args = null; // bgo#696474
profile.easy_options = load_options (file, name, "easy");
profile.normal_options = load_options (file, name, "normal");
profile.hard_options = load_options (file, name, "hard");
profile.easy_args = load_array (file, name, "arg", "easy");
profile.normal_args = load_array (file, name, "arg", "normal");
profile.hard_args = load_array (file, name, "arg", "hard");
profile.easy_options = load_array (file, name, "option", "easy");
profile.normal_options = load_array (file, name, "option", "normal");
profile.hard_options = load_array (file, name, "option", "hard");
}
catch (KeyFileError e)
{
@ -73,15 +75,15 @@ public List<AIProfile> load_ai_profiles (string filename)
return profiles;
}
private string[] load_options (KeyFile file, string name, string difficulty) throws KeyFileError
private string[] load_array (KeyFile file, string name, string type, string difficulty) throws KeyFileError
{
int count = 0;
while (file.has_key (name, "option-%s-%d".printf (difficulty, count)))
while (file.has_key (name, "%s-%s-%d".printf (type, difficulty, count)))
count++;
string[] options = new string[count];
for (var i = 0; i < count; i++)
options[i] = file.get_value (name, "option-%s-%d".printf (difficulty, i));
options[i] = file.get_value (name, "%s-%s-%d".printf (type, difficulty, i));
return options;
}

View file

@ -14,7 +14,7 @@ public class ChessEngineCECP : ChessEngine
private bool moving = false;
private string[] options;
public ChessEngineCECP (string binary, string? args, string[] options)
public ChessEngineCECP (string binary, string[] args, string[] options)
{
base (binary, args);
this.options = options;

View file

@ -15,7 +15,7 @@ public class ChessEngineUCI : ChessEngine
private string[] options;
private bool waiting_for_move;
public ChessEngineUCI (string binary, string? args, string[] options)
public ChessEngineUCI (string binary, string[] args, string[] options)
{
base (binary, args);
this.options = options;

View file

@ -11,7 +11,7 @@
public abstract class ChessEngine : Object
{
private string binary;
private string args;
private string[] args;
private Pid pid;
private int stdin_fd;
@ -41,7 +41,7 @@ public abstract class ChessEngine : Object
}
}
public ChessEngine (string binary, string? args)
public ChessEngine (string binary, string[] args)
{
this.binary = binary;
this.args = args;
@ -49,7 +49,11 @@ public abstract class ChessEngine : Object
public bool start ()
{
string[] argv = { binary, args, null };
string[] argv = {binary};
foreach (var arg in args)
argv += arg;
argv += null;
int stdout_fd;
try
{

View file

@ -564,25 +564,28 @@ public class Application : Gtk.Application
profile = ai_profiles.data;
}
string[] options;
string[] options, args;
switch (difficulty)
{
case "easy":
options = profile.easy_options;
args = profile.easy_args;
break;
default:
case "normal":
options = profile.normal_options;
args = profile.normal_args;
break;
case "hard":
options = profile.hard_options;
args = profile.hard_args;
break;
}
if (profile.protocol == "cecp")
engine = new ChessEngineCECP (profile.binary, profile.args, options);
engine = new ChessEngineCECP (profile.binary, args, options);
else if (profile.protocol == "uci")
engine = new ChessEngineUCI (profile.binary, profile.args, options);
engine = new ChessEngineUCI (profile.binary, args, options);
else
{
warning ("Unknown AI protocol %s", profile.protocol);