Discussion of chess software programming and technical issues.
Moderators: hgm, Harvey Williamson, bob
Forum rules
This textbox is used to restore diagrams posted with the [d] tag before the upgrade.
-
Dan Honeycutt
- Posts: 5031
- Joined: Mon Feb 27, 2006 3:31 pm
- Location: Atlanta, Georgia
Post
by Dan Honeycutt » Sun Apr 22, 2012 4:52 pm
Hi all,
I've been trying to learn some Java programming. I thought a good exercise would be to write a simple engine. I started with a really simple one just to see if I could 'talk' to winboard. All the program does is get two winboard commands and send a message back. I built my .jar file and copied it to my winboard directory. I then opened a cmd prompt, navigated to the winboard folder and ran my program with:
Everything worked fine. Next I entered:
Code: Select all
winboard.exe -cp -fcp "java -jar moron.jar" -scp "java -jar moron.jar" -debug
I got Startup failure on 'java -jar moron.jar': The System cannot find the file specified. I'm not sure who can't find what. I verified that there is a java.exe in my path. I'm probably missing something obvious but damned if I can see what it is.
The winboard debug file and a listing of my program are below. Any help would be greatly appreciated.
Thanks
Dan H.
Code: Select all
WinBoard 4.4.0 + java
Reset(1, 0) from gameMode 0
recognized 'normal' (-1) as variant normal
GameEnds(0, (null), 2)
shuffleOpenings = 0
TC string = '+5+30'
mps=0 tc=300000 inc=30000
TC string = '+5+30'
mps=0 tc=300000 inc=30000
StartChildProcess (dir="") java -jar moron.jar
Fatal Error: Startup failure on 'java -jar moron.jar':
The system cannot find the file specified.
GameEnds(40, xboard exit, 2)
Code: Select all
/*
* Java translation of the famous Moron engine by Fernando Villegas
*/
package moron;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Scanner;
public class Moron {
static String fromWinboard() { //get winboard command
Scanner scan = new Scanner(System.in);
String cmd = scan.nextLine();
writeLog("<- " + cmd); //record what we got
return cmd;
}
static void toWinboard(String msg) { //send message to winboard
System.out.println(msg);
System.out.flush();
writeLog("-> " + msg);
}
static void writeLog(String msg) {
String eol = System.getProperty("line.separator");
try (BufferedWriter out = new BufferedWriter(new FileWriter("log.txt", true))) {
out.write(msg + eol);
out.close(); //Close the output stream
} catch (Exception e) { //Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
public static void main(String[] args) {
fromWinboard(); //xboard
fromWinboard(); //protover 2
toWinboard("feature done=0 myname=Moron done=1");
}
}
-
Jim Ablett
- Posts: 1327
- Joined: Fri Jul 14, 2006 5:56 am
- Location: London, England
-
Contact:
Post
by Jim Ablett » Sun Apr 22, 2012 6:07 pm
Hi Dan,
Won't work. You need to use something like this >
http://www.marochess.de/chess/tools/jlaunch/
ChessGui can load java engines >
http://www.chessgui.com/
Or compile the java to executable >
http://www.byobingo.com/gcc_mingw.htm
Code: Select all
Compiling a Java Program with GCJ
Using GCC to run a Java program is familiar to anyone who has used it for C or C++ programs.
To compile the Java program MyJavaProg.java, type:
gcj -c -g -O MyJavaProg.java
To link it, use the command:
gcj --main=MyJavaProg -o MyJavaProg MyJavaProg.o
This is just like compiling a C++ program mycxxprog.cc:
g++ -c -g -O mycxxprog.cc
and then linking to create an executable mycxxprog:
g++ -o mycxxprog mycxxprog.o
Or use executable wrapper >
http://launch4j.sourceforge.net/
Jim.
-
Dan Honeycutt
- Posts: 5031
- Joined: Mon Feb 27, 2006 3:31 pm
- Location: Atlanta, Georgia
Post
by Dan Honeycutt » Sun Apr 22, 2012 9:04 pm
Jim Ablett wrote:Hi Dan,
Won't work.
Ah ha. At least I don't feel like quite such a dunce. I made an exe with Launch4j and winboard started it okay but they didn't talk. A dos window opened and stayed open. I typed in two entrys, moron replied and exited. Winboard saw that it was gone and announced that first chess program quit unexpectedly.
Launch4j has a ton of settings, I'll have to study those. I think you've got me headed in the right direction. Thanks much.
Best
Dan H.
-
Jim Ablett
- Posts: 1327
- Joined: Fri Jul 14, 2006 5:56 am
- Location: London, England
-
Contact:
Post
by Jim Ablett » Sun Apr 22, 2012 9:10 pm
Dan Honeycutt wrote:Jim Ablett wrote:Hi Dan,
Won't work.
Ah ha. At least I don't feel like quite such a dunce. I made an exe with Launch4j and winboard started it okay but they didn't talk. A dos window opened and stayed open. I typed in two entrys, moron replied and exited. Winboard saw that it was gone and announced that first chess program quit unexpectedly.
Launch4j has a ton of settings, I'll have to study those. I think you've got me headed in the right direction. Thanks much.
Best
Dan H.
In Launch4j it's important to use >
Code: Select all
Header type = Gui
Tick the 'stay alive after launching a GUI application' box
If you double-click the executable produced you will see nothing, but it will work in the gui.
Jim.
-
Dan Honeycutt
- Posts: 5031
- Joined: Mon Feb 27, 2006 3:31 pm
- Location: Atlanta, Georgia
Post
by Dan Honeycutt » Sun Apr 22, 2012 9:41 pm
Getting closer. I received xboard and new. Don't know what happened to protover 2. Winboard doesn't seem to have received my features. I think I need to add more functionality to figure out what's happening.
Best
Dan H.
-
Sven
- Posts: 3576
- Joined: Thu May 15, 2008 7:57 pm
- Location: Berlin, Germany
Post
by Sven » Mon Apr 23, 2012 9:47 am
Dan Honeycutt wrote:Getting closer. I received xboard and new. Don't know what happened to protover 2. Winboard doesn't seem to have received my features. I think I need to add more functionality to figure out what's happening.
Best
Dan H.
It is possible that you also need to take care about using non-buffered input, since otherwise some WinBoard command lines might be sitting in some buffer for a while. I don't know how to do it in Java. In C you would use something like setbuf(stdin, 0) or setvbuf(stdin, ...).
Sven
-
Dan Honeycutt
- Posts: 5031
- Joined: Mon Feb 27, 2006 3:31 pm
- Location: Atlanta, Georgia
Post
by Dan Honeycutt » Mon Apr 23, 2012 3:17 pm
Sven Schüle wrote:It is possible that you also need to take care about using non-buffered input, since otherwise some WinBoard command lines might be sitting in some buffer for a while. I don't know how to do it in Java. In C you would use something like setbuf(stdin, 0) or setvbuf(stdin, ...).
Sven
I think you hit on the problem, Sven. With some more tinkering I determined that I was sending to Winboard fine but I was only receiving about half of the commands Winboard sent me. I changed from the scanner to a buffered reader, in Java:
Code: Select all
BufferedReader brd = new BufferedReader(new InputStreamReader(System.in));
. . . and now IT WORKS!!
Thank you both very much.
Now, if HG wanders by maybe he can put on his todo list adding jar file support to Winboard
Best
Dan H.
-
JuLieN
- Posts: 2945
- Joined: Mon May 05, 2008 10:16 am
- Location: Nantes (France)
-
Contact:
Post
by JuLieN » Mon Apr 23, 2012 3:30 pm
Dan Honeycutt wrote:
Now, if HG wanders by maybe he can put on his todo list adding jar file support to Winboard
Best
Dan H.
Can't Winboard accept .bat files as engines? If yes, just run it with java "your_jar.jar"

-
Dan Honeycutt
- Posts: 5031
- Joined: Mon Feb 27, 2006 3:31 pm
- Location: Atlanta, Georgia
Post
by Dan Honeycutt » Mon Apr 23, 2012 3:56 pm
JuLieN wrote:Can't Winboard accept .bat files as engines? If yes, just run it with java "your_jar.jar"

No luck. First I tried a batch file to start winboard and feed it java my_jar and got the same error as per my original post. Next I put java my_jar in a batch file and fed that to Winboard. This time I got the error: first chess program exited unexpectedly.
Your batch file suggestion does have merit, though. I can run it as a console application by double clicking the batch file from Explorer (without having to open a cmd window). If I double click the jar file I get nothing since the file association is javaw and not java.
Best
Dan H.
-
JuLieN
- Posts: 2945
- Joined: Mon May 05, 2008 10:16 am
- Location: Nantes (France)
-
Contact:
Post
by JuLieN » Mon Apr 23, 2012 4:03 pm
Dan Honeycutt wrote:JuLieN wrote:Can't Winboard accept .bat files as engines? If yes, just run it with java "your_jar.jar"

No luck. First I tried a batch file to start winboard and feed it java my_jar and got the same error as per my original post. Next I put java my_jar in a batch file and fed that to Winboard. This time I got the error: first chess program exited unexpectedly.
Your batch file suggestion does have merit, though. I can run it as a console application by double clicking the batch file from Explorer (without having to open a cmd window). If I double click the jar file I get nothing since the file association is javaw and not java.
Best
Dan H.
Then maybe the solution would be to use a "jar to exe" kind of adapter?
Like this one :
http://www.regexlab.com/en/jar2exe/
It's not a compiler, but it incapsulates the jvm and the jar into an exe file...