As previously discussed, a recent discovery a nullitaire playthrough of Love Letter, I was inspired to try my hand at creating my own bots and pitting them against eachother. When choosing which game to do this for I went with one that I probably talk way too much about; Flamme Rouge.
Before I go into the process of developing the bots, a brief reminder of what nullitaire gaming is. These are games where there are zero human players, each player in the game is an AI that is following preprogrammed for certain decisions. If you play a lot of solitaire games you may be familiar with such bots and in nullitaire you pit these bots against eachother to see who is the best bot.
For my Nullitaire experiement I wanted to create my own bots as opposed to using the ones that come with a game. I chose Flamme Rouge as a base for two reasons. Firstly, it’s a game I am very familiar with and understand how the game works. Through this I can easily come up with a vast array of strategies and what are the basic moves that all the bots should play regardless of strategy. Also Flamme Rouge is not the heaviest of games and so the algorithms for bots shouldn’t get too complicated.
I started off by following Nullitaire Gamings first step to his Love letter bots and put together a “basic bot schematic”. This involves putting together the most basic plays in the game. In Flamme Rouge, if a rider is on a downhill space (which means they will always move a minimum of 5 spaces) then if the draw is for example 2-2-5-5, then it makes sense to play the 2 and get 3 free movement. This is the kind of basic moves that all the bots should be performing. Some of this get’s a little bit altered depending on the strategy of the team. For example an overly aggressive team would ignore gaining free movement on a descent tile if they had a higher card in their hand, or a cautious team might move slower through a mountain (where you have a maxium of 5 movement) as they would rather move 2 than play a 6 and lose out on movement.
After that the next step was to come up with 6 different styles of play that each bot should follow. The first team I created was very basic and would play with an aggressive strategy. Meaning this team would play whichever card gave them the most amount of movement every turn. They didn’t care about gaining exhaustion or team work, all they care about is going as fast as they can. I also decided for the Red Rouler to bid for the breakaway, there wasn’t much thought put towards this and will be changed in future iterations.
The next team I thought would be easiest to implement would be a random team. Someone that would play without much strategy and only in certain situations follow the “basic bot schematic”. This proved not to be the case as they constantly made really bad plays in the 3 test races that I did. This was however a great tool to improve the basic bot schematic so the random team would avoid most of the pitfalls.
Next up was something based off what I had seen around the Flamme Rouge forums quite often when talking about ai teams. The aim of this team was to sit near the back of the pack until the final stages and then make a burst at the end. They weren’t interested in the breakaway and as such would always bid their lowest cards and try to lose the bid. Each turn they would play the 2nd highest drawn card until after the 3rd reshuffle of their deck and then they switch to attack mode and play whichever card gives the most movement just like the aggressive team.
Teamwork is important in Flamme Rogue so I wanted to design one bot to try and keep it’s riders together for the whole race. Each turn the sprinteur draws their card first and plays it’s highest card (except a 9). The rouleur then plays a card that will either place them in the best position for slipstream movement to happen between the two riders. The thought behind this is that the rouleur has more middle of the road cards and can be more flexible to react to the sprinteur than the other way around.
The next team’s goal was to exploit an aggressive player, they would try and sit just behind the leaders, gaining free slipstream movement and avoid taking the exhaustion. If this team was not currently among the front runners they would play their highest card. Otherwise they play the 2nd highest card they drew and try and stay just in touch with the leaders.
Finally, the last team is very cautious and wants to avoid any blocking or exhaustion. Anytime they are in first they will play the lowest card to move back down the pack. If they are in last they would play their highest card to catch back up. Otherwise they play the 2nd highest card. I left these to last as I thought they would be the most complex to run with the most amount of edge cases.
After a handful of test races to make sure that the teams were playing to the strategy I had intended I began a full 6 stage tour. (Which I am posting full reports of each stage over here). By the end of the tour there was a lot of work to be done on most of the teams algorithms as they sometimes underperformed or their strategy didn’t quite work out as I had intended to over the course of a full tour. The tour also gave me ideas for new strategies and the next step is to take the worst 3 performing teams and improve them and develop 3 new teams and begin forming a league of all the bots.
Firstly, nullitaire gaming is really fun as you get to deep dive into the mechanics of a game and experiment with different ideas and see how they interact and can come to life in front of you. However, from a game designer point of view it is a great tool for development. Not only can you use it to see potential faults in your game. For example, perhaps you want the game to have multiple paths to victory. You can then play a nullitaire game where each bot plays focusing on specific paths, you might find out that one path is not as equal as the other. Secondly you can develop these bots in future for a solitaire variant of your game.
I won’t spoil the winner of the tour if any of you want to follow reading through the race reports as I post them over the following two weeks, however, let me know down in the comments which team you think will win the tour by the end. My money was on the team that was designed to exploit aggressive players.