And I heard tell that bot programmers are lazy. I look forward to playing against him Betrand. You have done an amazing job creating an AI that fills the spot of a missing player for no other reason than self accomplishment. Lux is a better place with you, til Reaper 6.0 stomps our guts out.

On a side note, Brother Preacherman, Nef said the other nite she would like to be updated for better killing opportunities, and she wanted a boob job as well. And when is the Stinky bot gonna get an update?

Drifter wrote:You have done an amazing job creating an AI that fills the spot of a missing player for no other reason than self accomplishment.

The feedback here has been great. I enjoy the intellectual challenge, and it's motivating to know that people like to play with my creature.

I've always been fascinated with AI design. The first significant program I wrote was a checkers player, way back in the seventies, when personal computers were but a dream, and the Internet did not exist.

Come on, try a game against him on "Floyd's knob"! And if you want a really good challenge, try "American Civil War". He got me on that map for the first time ever. Man was I proud. And mad.

Drifter wrote:Yea, Reaper 6.0 was holding his own in my host last nite, and, uh, kickin some butt at times.

Good news.

I noticed that the Reaper playing in Dustin's multiple rooms is the very old version 4.0, so I asked him to upgrade it. He still managed quite a lot of wins recently in those rooms, and has become number one in the "number of wins" statistic, having recently surpassed Unregistered:

Wow, bertrand. You really made a big jump with the most recent version of Reaper. Reaper has gotten very, very good at gaming out the possibilities in his head before taking action. So much that I've had to reduce the number of Reapers I'll allow in a game. Is anyone else taking notes and learning from his playing?

Soon you may have to come out with Reaper Lite™. Or AI-levels, as is done with chess-playing programs.

Oh, oh, oh, but I think I found a bug. In some games, if I manage to break his back, popping all continents for a couple of turns, he becomes a total pussycat, and does nothing for the rest of that game. Does he get mad and decide to quit playing? In the game, it looks like he doesn't receive or place any armies. But, from the log file I see that he is just failing to place them, and they evaporate when his turn ends.

Perhaps Lux is letting him signal the end of his turn before placing all of his armies?

Loading -> notCachedGenerated.luxb
GC of <com> says: GC.setBoardSize(1062, 765) thread:Thread[AWT-EventQueue-0,6,main]
GC of <com> says: usableRect(1340, 986) thread:Thread[AWT-EventQueue-0,6,main]
GC of <com> says: Maximise the height of the window
GC of <com> says: toggle chat window
GC of <com> says: done load board
Board.sendChat() was called before the game has started
setColors
PlayerInfoController: show() with numberRows = 6
GC of <com> says: start the world
0 = Chimera named Dan - IP: n/a
1 = Reaper named Don - IP: n/a
2 = Chimera named Phil - IP: n/a
3 = Human named Sir Holo - IP: n/a
4 = Chimera named Bob - IP: n/a
5 = Chimera named Ted - IP: n/a
<com>: All the countries have been assigned
Starting takeTurnsLoop: 0
LuxView: creating the cardsmode composite in the background
LuxView: finished creating the cardsmode composite in the background
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's placeArmies():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.placeArmies(Reaper.java:2231)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.sweep(Reaper.java:4171)
at com.sillysoft.lux.agent.Reaper.simSweep(Reaper.java:1877)
at com.sillysoft.lux.agent.Reaper.doSweep(Reaper.java:1889)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4891)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
Phil was eliminated: position 6
com.sillysoft.lux.D.A@2c1ef server=true: Phil was eliminated by Ted in round 13
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 4
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
Ted was eliminated: position 5
com.sillysoft.lux.D.A@2c1ef server=true: Ted was eliminated by Sir Holo in round 22
Bob was eliminated: position 4
com.sillysoft.lux.D.A@2c1ef server=true: Bob was eliminated by Sir Holo in round 22
Dan was eliminated: position 3
com.sillysoft.lux.D.A@2c1ef server=true: Dan was eliminated by Sir Holo in round 22
<com>: agent Reaper didn't place all of his armies. what a bozo.
<com>: There was an error in com.sillysoft.lux.agent.Reaper@408e80's attackPhase():
java.lang.ArrayIndexOutOfBoundsException: 3
at com.sillysoft.lux.agent.Reaper.getEnemies(Reaper.java:4363)
at com.sillysoft.lux.agent.Reaper.terminatePlayers(Reaper.java:4557)
at com.sillysoft.lux.agent.Reaper.attackPhase(Reaper.java:4888)
at com.sillysoft.lux.B.Z(Unknown Source)
at com.sillysoft.lux.B.P(Unknown Source)
at com.sillysoft.lux.B.run(Unknown Source)
at java.lang.Thread.run(Thread.java:613)
<com>: agent Reaper didn't place all of his armies. what a bozo.
finalPosition[Sir Holo (index 3] = 1 -> the winner
Don was eliminated: position 2
com.sillysoft.lux.D.A@2c1ef server=true: Don was eliminated by Sir Holo in round 25
Sending ranking data to the server. The results:
-> Dan lasted 22 rounds. Placed 3
-> Don lasted 25 rounds. Placed 2
-> Phil lasted 13 rounds. Placed 6
-> Sir Holo lasted 25 rounds. Placed 1
-> Bob lasted 22 rounds. Placed 4
-> Ted lasted 22 rounds. Placed 5

I think I know what is happening, but I don't have the time to fix it now, I'm leaving tonight for a 10 days vacation. I'll get to it when I come back.

This is definitively related to alliances: he tries to count the number of enemies, but since allies do not count he gets confused.

In the meantime, just avoid accepting alliances with him.

Sir Holo wrote:... You really made a big jump with the most recent version of Reaper. Reaper has gotten very, very good at gaming out the possibilities in his head before taking action.

You have figured out what I did to him! Before, he used to do most of his continent-related planning in the attack phase, *after* the armies were placed. Now, in version 6.0, he does this in a simulation mode *before* placing the armies. Effectively, I have found out (as I am sure all the good players have) that the armies placement phase is critically important.

I'm new to Lux but found the standard "Hard" AI bots to be, well, not so hard. So I gave Reaper a shot, but have yet to beat it.

Is it just me or it always wins on the dice? It's consistently (ie. EVERY time) beating me even when I have more troops. Just now I had 10 troops (the most fortified place in the entire map), it had 6, and instead of attacking anywhere weaker, it attacked my 10 troops, and it won with a left over 5!

No. You are not wasting your time. Just get used to wacky Lux Dice. I had an army of 200M or so lose to 500. Another thing to keep in mind is that if you play multiple reapers, they will team with each other.

Just a quick note to say thanks for creating Reaper 6. It's an awesome AI creation. The only bot that gives me a run for my money now I've been playing for a few months.

But, I noticed and a previous post confirmed, that reapers team up if you play with more than one. I'm not the best player yet and it would be great to allow a small amount of tweaking to be done. ie switch the ability to team off, or perhaps calm a couple of reapers in a game down a little. That way I might have a chance of beating with 2 or more in game.

Awesome, but it possible to confuse Reaper. I've implemented a "Passive" player which basically does not attack just place it's armies. If you let Reaper play agains the passive one, Reaper will not attack and just start collecting armies, the game will never end even though Reaper should be able to defeat it easily since "Passive" is not attacking. I don't know how this is possible but I just wanted to let you know and see if you can find out why. Please if you do, let me know I'm very interested how this is possible. (I disabled card trading and bonuses for simplicity)

Reaper was designed with optimal play in card-based games in mind—by "card-based" I mean that the key driving factor in the game's progression is players making profitable kills for cards. Now, Reaper can also play in marathon-type maps, generally large maps whose continent bonuses quickly (if not immediately) render cards redundant, but he sort of misses the point in these games. He plays as if he were playing Classic, blissfully unaware that his strategy is not as sound as was intended. That said, even under optimal conditions Reaper is no match for a veteran human, but I suppose that's neither here nor there.

I've never delved into Reaper's code, but judging from this evidence, I'd say it's quite likely that your "simplicity" settings confused Reaper. Here in the online community, there are a large number of Lux settings which are seldom, if ever, used. One such setting is disabling "card transfer on kills". As so much of Reaper's behavior stems from cards (and the assumption that card transfer will always be on), that may have been enough to incapacitate him.