Clarifications from Clint, copied from e-mail replies to questions:
Most recent comments first:
5 � �Won�t work under Linux�
� Oct 17,
[One person experienced] problems
were because he was running it under linux.� I've installed a fix for linux
now (and mac X, along with other unix based os's).� I'll pack it up all proper and release it
late tonight.� It seems to have taken
care of these problems for everyone who's contacted me with OS related runnability problems.�
If time allows, I may include one or two other things.� If time doesn't allow that, I'll put them in
a new release tomorrow night.
--------------------------------------------------
4 � �Impossible turns� � Oct 18,
I�ve received at least half a dozen inquiries about this, so it�s deserving of an entry here.
It is possible to have a scenario in which your AI still has pieces on the board, the board is not full, and your AI does not have a valid move.� How should your AI respond to this situation?
The answer:� you don�t need to.� The game environment will detect this situation and skip your turn for you, making it so that your AI will never be asked for a move when none are possible.
--------------------------------------------------
3 � �Anatomy of a stacktrace� �
Oct 13,
This one�s not from an email, but it�s caused confusion, so I�ll put it in here.� When an exception is thrown in your code or the code wrapping it into a process, the stacktrace of the resulting exception is a little cryptic.� Here�s a clarification of what you�re seeing, until I get it fixed up so it�s cleaner.� Part of the stacktrace when this happens is going to look the same every time:
Java.lang.Exception: ...
����� � ...
������� at ExternalAI.takeTurn(ExternalAI.java:62)
������� at TurnManager.aiTurn(TurnManager.java:179)
������� at TurnManager$BiaiRunner.run(TurnManager.java:276)
������� at java.lang.Thread.run(Thread.java:534)
if your stack trace doesn�t
start and end this way, by all means email me your stack trace, as it probably
is a bug in the game environment.
If your stack trace does
start and end like this (with some more stack trace stuff where the ��s are in the example above), then an exception was thrown from
your subprocess.�
Whatever appears in place of the ��s is what
the game environment read from your stderr stream. (ie- it�s the actual stack trace
that should tell you what�s up with your code.�
If you get one of these and are still convinced it�s something broken in
my code, as always, send me the stack trace and I�ll take a look.
--------------------------------------------------
2 � �Error in using the interface?� � Oct 13, 3:06 AM:
Questions
- I was trying to
attach my AI to the interface you built, but I keep getting some sort of
exception at line 62 in ExternalAI.java.� The disassembly seems to show that its stdin.newline()
is causing the problem, but that doesn't seem right. ... Also is it possible
for us to get the source so we can fix these issues
when they come up?
Clint�s
Answers - I'm a bit leary of releasing the source at this point, because I know
of at least one person who has asked me exactly how the built-in AI's work,
wanting to build an AI designed purely to trick the built-in ones. Can't have that.� Or
at least I don't want to make it easier.�
I guess there are always those ... who will attack my class files with a
decompiler. [Steve�s
comment:� Don�t decompile Clint�s
Source!] The other alternative would be for me to release the source for
just a few important classes... I'll consider that once I get a few more things
finalized (there's a noncritical feature or two I'm
still working on a little bit).
As for your error, the error
is something in your code, and the confusion is my fault.� I'll try to come up with a better way to
output all this so it's clearer. Look for a new release late Wednesday with
that change.� Line 62 of ExternalAI is actually a line that manually throws an
exception.� It's the mechanism invoked in
the main process when something appears on your stderr
stream.� Ie-
your AI (or the subprocess wrapping it) threw an
exception or output something to stderr.� What the game should have done is tell you
that your AI had an error, and forwarded the contents of your stderr to it's own stderr.� If you look
at the stack trace carefully, it should actually be two stack traces; one as
the message for the other.� Like I said,
this is admittedly a clunky way to output that; in the morning I'll come up
with something better.
I hope that info helps in
analyzing your error.� If you still can't
figure it out, or if the error ends up not having come from your class, go
ahead and send me the stackdump (along with a copy of
your AI if possible), and I'll figure out what's broken in the wrapper and fix
it.
On the other note, I am
quite familiar with how it compiles inner classes.� It's still cluttery,
but that way at least all classfiles are tagged
according to whose they are, so I can tell when I go to run them which are the
primary player classes, and which are little helpers, so I know which to
run.� It would have been easier to just
say no additional classes, but I felt that was too heavy a restriction on what
people should be able to do for this.
----------------------------------------------------
1 -- "Legal resources" -- Oct 11, 2004, 11:01 PM:
Instantiating other objects and using helping classes is fine.� In general, anything you might dream up is fair game.� The spirit of the rule there is simply to say that your AI may use whatever you like within the confines of the system it's running on.� As far as serialized information, if your AI uses that to save things from turn to turn, that's fine.� The no-no on that would be anything that involved pulling in preprocessed data from a file or anything along those lines.� That limitation is intended to effectively mean: the available resources for your turn method are your AI code and the resources of the computer running the tournament.� Anything that could be construed as bringing in external processing power from outside that PC (internet, preprocessed data, etc.) is off limits.� Other than that, the available ram is your only limit.� I do, however, reserve the right to throttle you if you fill my (large) hard drive.
If you do have enough persistent data that you want to keep from turn to turn, I actually would prefer that you serialize and reload it so as to leave a fair share of the system resources for the other player. (as no active processing is allowed between turns)
Feel free to make any data structures or helping classes you'd like.� My only rule on that will be that any additional classes besides the one directly implementing the game interface should be declared as inner classes of your main class, so as to keep classfile clutter to a minimum.
-------------------