Robo Home | Changes | Preferences | AllPages

Fhqwhgads is the first robot made by Kawigi since he started doing the Flood series that completely ignores his enemies firing in reference to when he chooses to change direction and such. He doesn't ignore the power with which they are firing, he just doesn't react to the firing time at all. It's a MiniBot using FloodMini's gun.

Fhqwhgads loves Strong Bad, so she (it's a girl's name) will cling to Strong Bad if she sees him. Make a robot called StrongBad and see what I mean :-p. The movement is small, so I had plenty of room to just cram something stupid in there like that.

What's special about it?

To quote David Alves, it moves the same against SittingDuck as it does against SandboxDT. Roughly, anyways.

Great, I want to try it. Where can I download it?


How competitive is it?

I think it should be a quality bot - it will probably open 1-on-1 in the ER and the RO in the top 10. The movement is good, and the gun is tried and true.

How does it move?

It orbits its enemy in one direction for a random amount of time up to the amount of time a bullet from the enemy would take to reach it. At that point, it changes direction about half the time. The distribution of the 'distance function' is uniform, so if I always changed direction afterward, I'd probably have a Bell curve for a movement profile. Doing it this way, I have a bell curve and a half of a bell curve to the right of the original one, which results in a reasonably flat profile. It is amazingly simpler to tweak this movement than the FloodMovement, because if I move independently of individual bullets (except for the power of the last one fired), my profile should look roughly the same to about every bullet, regardless of how many there are. That was my goal with this robot - rather than having the super-duper-flattest movement, it is meant to have a good movement that is pretty much equally strong at all distances.

How does it fire?

It uses a variation of GuessFactorTargeting ported over from FloodMini. It segments its statistics on its opponent's relationship to the wall, acceleration, LateralVelocity, and distance.

How does it dodge bullets?

It completely ignores them. To help create a uniform profile, though, it knows when the bullets are fired and remembers the power of the last bullet fired by its opponent.

How does the melee strategy differ from one-on-one strategy?

It doesn't have a Melee strategy, it does have a OneOnOne strategy. That's a pretty big difference.

How does it select a target to attack/avoid in melee?

Dumb luck, if anything.

What does it save between rounds and matches?

It saves its statistics and DynamicDistance factors between rounds and matches.

Where did you get the name?

It's short for Fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf. Oh, and it's pronounced "Fuh-HOO-ku-gahdz". Of course, you can get that from just about any online urban dictionary. For those of you who aren't familiar with http://www.homestarrunner.com?, and you don't want to familiarize yourself too much, but you want in on the joke, then look at these pages (in this order, preferably) to get a general order of the state of the Fhqwhgads:




I'm somewhat determined that it is the single most difficult name to spell among robots in current development.

Can I use your code?

Yes, as long as you don't make a robot that can beat any of mine. Ummm... just kidding. If you do make a robot that's better than mine using my own code, though, I'd like you to let me know and make your robot open source as well.

What's next for your robot?

Maybe some tweaking, find something more useful to do with the extra code-space.

Does it have any WhiteWhales?

Eh, not really. I made it in one day, so it hasn't had time to have any WhiteWhales.

What other robot(s) is it based on?


Comments, questions, feedback:

I love StrongBad too! I think you might have a bug in your code because it's almost as slow as Chameleon. -- PEZ

Hmmmm... Can't think of what that would be. There shouldn't be anything computationally intensive about this robot. More waves to manage if you're further away, but that's it. "In the time it took me to run your bot, I could have done all sorts of cool stuff, like paint a picture... of a guy... with a big knife. Whoa, I think I'm going to get started on that, right away!" -- Kawigi

F doesn't stay far away from M. It seems to prefer a really close combat. It has run 698 rounds now so if we give it another hour and a half I'll have some results. Though it seems already like it's a pretty strong bot. Even if M outsurvives it by about 115%. And any bot that M outsurvives loses. =) But instead of painting kitch pictures you should hunt the SlowBot bug I think. 36 fps is about the slowest bot I have tried. Only Chameleon is slower with 30 fps. -- PEZ

Now, 1000 rounds is not fun against SlowBots. =) Anway, M has a slight edge on this bot, it won 533 - 467 in survival and 47241 - 42909 in bullet damage. I guess this might be a top-10 bot after all. I'm intrigued by the movement scheeme, it sounds a bit like Ms actually. -- PEZ

I just had Jim try it out - in his tests, Jekyl gets about 60 fps against the main bots he's currently testing against (the Aspids and Nibbler), about 300 FPS against FloodMini, between 200 and 300 for Fhqwhgads (the only speed difference should e that Fhqwhgads saves data every round, where FloodMini only saved when he won). Against M, he said it started out at around 200 and then picked up to over 300 FPS. So I'm still not sure what the nature of this slowness is. One thing you could try is changing my Vector of MiniBullets? into an ArrayList or something. But, again, that shouldn't make it different from FloodMini, who also uses a Vector. Do you have a problem with bots whose run method basically consists of turnRadarRight?(Double.POSITIVE_INFINITY)? (That's also a difference from FloodMini 1.3, but the dev version does it the same way as here) -- Kawigi

As expected it doesn't matter if I use an ArrayList instead of a Vector. I think Vector is just a synchronized wrapper around ArrayList or some such. Of course you should only use Vector if you need the synchronization. Which you should seldom need. Even with a multithreaded bot where you should probably work with immutability and such measures to avoid synchronization. Also you should almost alway use interfaces (when they are provided) for the type specification of your objects. In the case of ArrayList and Vector they share the interface List. If you use it and find you want to switch from ArrayList to Vector or vice versa you only need to do that in one place; at the point of object creation. But as for what causes Fhqwhgads (there should be a penalty for using such names... =), I don't know where it could be. Since I'm using Java 1.3.1 maybe it has to do with that. But not for your other F bots. Strange. I'll fiddle around a little and see where it brings me. -- PEZ

I'm at loss here. I guess it might be it's name. =) -- PEZ

Well, I must say, if your OS has some sort of localization feature where it tries to pronounce words for you, I could see Fhqwhgads slowing it down. Good thing I didn't call the robot "Fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf". I actually took a screen shot of the Strong Bad email to get that spelling all down. And it would be quite embarrassing to have spelled Fhqwhgads wrong, too. Just out of curiosity, have you looked at the movement scheme? Is it at at similar to Marshmallow? If it is, I think you should get working on MarshmallowMini?, because I'm sure that the movement is nano-able (with a very simple gun and no distancing). -- Kawigi

Eh, MarshmallowMini?? Don't think so. It's movement is small enough to fit in a mini, but it's targeting and Melee enemy manager won't. Besides, I think coding with codesize in mind is both a bit bizarr and a bit ridiculous. It has been good for my understanding of Robocode to try it some with Gouldingi, and I might write more minibots when I want to explore new concepts. But I will never try to compete in the mini disciplines. I'll leave the ugly-coding contest to others. =)

On the subject of movement. This looks veru much like early M movement. Though I wasn't aware of flatness issues then so I think I might have scrapped it for the wrong reasons. Ms' current movement is also simple, but not as simple as this. Ms' movement wouldn't fit in a nano without gun I think. -- PEZ

Fhqwhgads runs smoothly on my system. Against Ender i got to a speed of 400/500 fps. Maybe this is again one of those JDK 1.3 particularities? Also i had a very good laugh with those Strong Bad cartoons :-) Great fun! -- Vic

It's still a SlowBot in my book. I also like StrongBads? e-mail! I laugh out loud watching. One of my favs is when he gets a question about whether he can play the guitar. I wonder how he can type with those gloves though. =) -- PEZ

Lol, yeah, I love the Guitar one, too. I can almost quote it from memory in my best Strong Bad voice. -- Kawigi

I just noticed that FloodMini is just as slow on my system. And since it is I am suspecting the truly ugly try/catch piece of code that I guess is a minibot-thing for you not having to check your array boundaries. I guess some JVMs handle it with better performance, but the JVM I'm using doesn't like it at all. I can't really test it since I don't quite know what's going on there. -- PEZ

That's something to try, actually. Change that to something like this:

int guessindex;
if ((guessindex = b.updateEnemy(x, y, time)) >= 0)
It won't perform as well in melee (doing that try-catch thing accidentally pushed me up 32 spots in melee on the ER because it stopped me from having extremely off-the-wall data) and it may *occasionally* otherwise crash (but it physically shouldn't), but that's roughly how it was in version 1.2, and I did that mostly to clear the space for the acceleration segmentation. I actually got the idea from tobe's Calypso. See if that doesn't make a huge difference. As far as I can tell, FloodMini should be the fastest bot in the top 20 except for Marshmallow and Gouldingi. And this exception block is probably the only thing that could POSSIBLY make it slower than HT 0.8, which is also one of the fastest among top bots. Let me know if that fixes the whole problem, and maybe I'll appease you in the next version and not do that. I found some other space that I hoped to use in FloodMini to either put OCM in or tune the gun for multiple powers, but I suppose this could be worthwhile, too. -- Kawigi

Yes, that was it. Now Fhqwhgads is one of the fastest bots I have in my robot directory. Do as you please with this. I'll just keep you on the SlowBot list until it's fixed. =) And, of course, since skipping array boundary checking and using try/catch instead is a big NO-NO, it's bad for your Jarma as well. -- PEZ

Ok, the next version of Fhqwhgads won't do that, and should therefore run mega-fast on other operating systems/JVMs?. Of course, I'm on the verge of a whole new generation of Fhqwhgads (I should almost call it 2.0). It will sacrifice DynamicDistancing (it's so much easier to keep a uniform profile at all distances with this movement) and become melee aware, separate melee and one-on-one statistics, and it will have two virtual guns - one that fires waves continuously like FloodMini and one that only fires a wave when it fires a real bullet. The wave will also be variable speed and I will segment on predicted bullet travel time instead of distance. Basically, it will be more powerful against robots that might have otherwise given it trouble. And it will still be a MiniBot, if I have anything to say about it (I just need to find another 10 or 15 bytes I think). Sounds almost like a MegaBot, doesn't it? But it will be simplified still in a few places. -- Kawigi

That sounds very much like a MegaBot project. Can you really fit all that in a mini? Mako uses sets of VirtualGuns like that. (One set firing every scan, and one set only firing when the real gun fires.) I can recommend it. =) Funny that you think about sacrificing DynamicDistancing, since it looks to me like this bot really proves the value of it. At first I thought this bot was a piece of cake for Marshmallow. That was after the first 200 rounds they battled and F had for a majority of these battles performed a really close distance fight. After 1000 rounds M still had an edge. But after having fixed the SlowBot bug I have run many, many rounds and it seems F has choosen a long distance fight now and from there M can't beat it. Yet. M 1.9.1 might. -- PEZ

Yeah, I thought it would be interesting to basically put FloodHT 0.9's next gun into a mini. I tested it without DynamicDistancing against the top 20 and whiped its data and compared to my original tests. It didn't perform as well against DT or Chameleon, but it did even slightly better against Iiley's bots as a collective (this was already easily my best bot against Wave pattern-matching), and its overall performance was close to the same. So I decided to go for it and try all those things I could never fit into FloodMini (but got close). And the melee awareness is so it maybe has the chance to win best all-around MiniBot. It won't be *good* at melee by any means, but it will be better than all those Melee-ignorant 1-on-1 MiniBots I figure. Meanwhile, I may use the extra space I've found in FloodMini to stick the rest of FloodHT 0.8's movement into it. This makes these two bots more unique from each other more than anything else. In related news, I'm thinking I can give you more space for a new version of GouldingiHT. You down? -- Kawigi

Oh, just a note from the development team - this version of Fhqwhgads seems to be particularly good against Marshmallow, probably even partially because it's natural tendancy is to let his opponent get almost as far away as they want. I've found space, found bugs, found more space, and more bugs, and so on for awhile now. I'm surprised that I could create so many bugs trying to make a couple of simple improvements to the gun. The last one was particularly funny, but I did figure out that Fhqwhgads should be worthy of a roughly 30th place ranking with a pretty erroneous gun, maybe top 20 with a mal-tuned gun, and is probably top-15 material if it only uses the shot-time-only stat gun. I'm hoping it's looking at about #8 or so with everything fixed in the aiming. If I can pretend I have enough room for movement tweaks, I might try some movement tweaks before I release, too. -- Kawigi

I'm considering over-tweaking Fhqwhgads's movement and making it a MegaBot, and re-releasing this version as FhqwhgadsMini?. Part of the reason for doing this would be to justify making a FhqwhgadsMicro and maybe nano, too :-p The second reason would be to make a package kawigi.f_bots. The third reason would be to get a clear win over the creator of Yngwie in the 'hardest-to-spell-robot-name' league, at least until Loki makes a bot called "Yggdrasil". The other option is to either decide that FloodHT will be invariably better or that Fhqwhgads isn't worthy of being any more than a MiniBot. I just thought I'd bounce that off people to see what your opinions are. Should I take this further? -- Kawigi

As long as you have a different movement for the two bots I think it's very much worthwhile. Funny that you thinkg Yngwie and Yggdrasil being hard to spell. Not at all to me, but I guess that's because I'm a Swede. Yngwie Malmsteen, who's lending his name to the bot Yngwie, is also Swedish, though his real name is Yngve Malmsten. -- PEZ

Go-on make a mega bot - it always seems a bit of a hollow victory when I just beat mini, micro and nano bots :) -- Paul Evans

Speaking of your victories over minis, Iiley and I were bouncing scores back and forth yesterday (he has one heck of a megabot in the works), and I made "CigarQwhgads?", which was just Cigaret with FloodMini's gun. In 3 or 4 1000-round battles, it never lost by more than 10000 points, regardless of whether either of us had pre-saved data. -- Kawigi

Hmmm... It looks like you've found that Iiley's movement is particularly good. I was contemplating lifting the movement from Cigaret and dropping it into SandboxMini for the final minibot showdown - but it did not seem like fair play. BTW what does 10000 point represent as a percentage of the total score? -- Paul Evans

I don't know, seems like it was around 80000-830000 for SandboxDT, and 71000-78000 for CigarQwhgads?. Cigaret 1.31's movement is actually superb. I considered the same thing, but likewise, it would seem uncivil to exploit his open-sourceness by beating him with his own movement. Of course, CigarQwhgads? takes 200-300 rounds to catch up with Cigaret in learning. It did still catch up, though. One difference between DT and Cig is that Cig isn't optimized against his own guns ;-) -- Kawigi

Sounds like around 52.5% of score to DT - around 25 rating points - I can live with that - of course the new DT will make that 53.5% :) -- Paul Evans

Robo Home | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited September 1, 2003 5:26 EST by Kawigi (diff)