Dominion Strategy Forum

Please login or register.

Login with username, password and session length
Pages: [1] 2  All

Author Topic: [COMPLETE] Geronimoo's challenges - First Game  (Read 33767 times)

0 Members and 1 Guest are viewing this topic.

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
[COMPLETE] Geronimoo's challenges - First Game
« on: August 03, 2012, 03:37:58 am »
+7

Challenge - Aim for the highest win rate against the built in Smithy bot. Use the board of the "First Game" kingdom as described in the rules book and my latest article:

Cellar, Market, Militia, Mine, Moat, Remodel, Smithy, Village, Woodcutter, Workshop

One entry with the bot (as a personal message) only per person, deadline friday 8/31.

The winner will get an extra paragraph in the article and be included in the downloadable xml (so explain how you did it).
« Last Edit: September 04, 2012, 11:24:07 am by Geronimoo »
Logged

Qvist

  • Mountebank
  • *****
  • Offline Offline
  • Posts: 2400
  • Shuffle iT Username: Qvist
  • Respect: +4085
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #1 on: August 03, 2012, 04:55:03 am »
0

I like this challange. Great idea. Let's see what I can do.

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #2 on: August 07, 2012, 11:46:43 pm »
+1

I was doing so well working on this, and then the Dark Ages previews started...
Logged
🚂 Give 18xx games a chance 🚂

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
Re: Geronimoo's challenges - First Game
« Reply #3 on: August 16, 2012, 05:02:06 am »
+1

Due to the release of Dark Ages and Funsockets I'll move the deadline 2 weeks, so you have some more time to work on this. I only received one entry so far, but it's a very strong one.
Logged

DStu

  • Margrave
  • *****
  • Offline Offline
  • Posts: 2627
  • Respect: +1490
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #4 on: August 16, 2012, 05:13:56 am »
0

Due to the release of Dark Ages and Funsockets I'll move the deadline 2 weeks, so you have some more time to work on this. I only received one entry so far, but it's a very strong one.

I only have a little variation of your bot, which is also about as strong, so if I don't find anything better, I won't submit anything. Which does not mean I was not interested.
Logged

DG

  • Governor
  • *****
  • Offline Offline
  • Posts: 4074
  • Respect: +2624
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #5 on: August 16, 2012, 07:08:25 am »
0

I've been messing about in the Goko Beta so far, I might now find some time to look at this.
Logged

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
Re: Geronimoo's challenges - First Game
« Reply #6 on: August 30, 2012, 04:40:20 am »
0

Just a little reminder: only 1 day left.
Logged

TLV

  • Pawn
  • **
  • Offline Offline
  • Posts: 2
  • Respect: 0
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #7 on: August 30, 2012, 02:34:52 pm »
0

I just sent my entry. Limited remodel control makes it really hard!

I noticed that my bot still dominated when playing against 2 smithies in 3p, but was too slow to beat 3 for 4p. I wonder if a Smithy-beating strategy is even possible for 4p on this board.
« Last Edit: August 30, 2012, 02:43:30 pm by TLV »
Logged

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: Geronimoo's challenges - First Game
« Reply #8 on: August 30, 2012, 05:29:52 pm »
0

I just sent my entry. Limited remodel control makes it really hard!

I noticed that my bot still dominated when playing against 2 smithies in 3p, but was too slow to beat 3 for 4p. I wonder if a Smithy-beating strategy is even possible for 4p on this board.



It is indeed possible!

Hadn't tried mine in multiplayer until I read your post (welcome to the forum by the way!  :) ), but a few quick sims indicates my version gets over 30% against 3 Smithy bots (which get around 20% each).
« Last Edit: August 30, 2012, 05:34:25 pm by michaeljb »
Logged
🚂 Give 18xx games a chance 🚂

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
Re: Geronimoo's challenges - First Game
« Reply #9 on: September 04, 2012, 11:22:29 am »
+6

Results!!

In third place we find master engine builder DG with 73%-24% win rate vs Smithy. His fairly simple bot opens Remodel/Village or Mine/Cellar. Remodel the estates into a smithy/village drawing deck, supplemented by moats, and then buy a market, golds, provinces. Remodel aggressively turns gold into provinces so he used 3 golds as a starting point. Without a mine add a militia after the drawing chain is established.

In second place there's a newcomer: TLV with 76%-22% vs Smithy. His bot is very similar to DG's, but he doesn't use Mine and added some PPR rules for increased performance. Well done!

But in first place, head and shoulders over the rest of the competition, we find michaeljb!! His very elaborate bot manages to crush the poor Smithy by 89%-9%!!!! That's huge. His bot is huge as well, so I'll let him explain how he did it.

You can find the three bots in the attachment which can be loaded into the simulator
Logged

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #10 on: September 04, 2012, 11:45:53 am »
+4

I'll post the description when I'm home from work/class tonight. I think the key thing to know is that it's a very good thing this happened before my fall classes started  ;D
Logged
🚂 Give 18xx games a chance 🚂

TLV

  • Pawn
  • **
  • Offline Offline
  • Posts: 2
  • Respect: 0
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #11 on: September 04, 2012, 04:37:00 pm »
0

Very impressive, michaeljb! I wanted to incorporate workshop and mine, but every time I tried the win rate dropped to the low 60s. I can guess what most of the buy conditions are for from the XML (manipulating workshop to gain smithy over village when you'll only have 3 coins to buy with that turn? Neat! Although I notice that the case where you only have a Gold in hand is missing the countAvailableMoney clause that the others have).
Logged

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #12 on: September 04, 2012, 05:24:52 pm »
0

(have a bit of time before class right now, so I can comment on this real quick)

manipulating workshop to gain smithy over village when you'll only have 3 coins to buy with that turn? Neat!

Thanks! Worked hard to get this part to work. Basically the core idea of that was, if you are in a situation where you are simply alternating Village/Smithy, you have a Workshop in hand and you'll have $3 in the buy phase, as a human player you're smart enough to Workshop for Smithy and buy Village every time. But if Village is next up in your alternating sequence, the simulator doesn't really look ahead to the buy phase to see it will get Village anyway, so it ends up getting 2 Villages.

The result was this awkward looking mess of a bunch of consecutive Smithy rules that are very similar to each other, and only actually used when playing Workshop or Remodeling an Estate. One of the reasons my bot runs so slowly.

Although I notice that the case where you only have a Gold in hand is missing the countAvailableMoney clause that the others have.

And evidently I didn't even get them all right! I believe that is a mistake, not intentional. Nice catch :)

One thing that surprised me about the process of working on this was that at a certain point, it became much quicker to just edit the xml directly, rather than using the GUI of the simulator. Easier to quickly test against small changes to answer silly questions like "should I start buying Duchies when I'm down by 19, 20, or 21?" (made sillier by the fact that variations between each particular value--once you're 'close enough' anyway-- is probably statistical noise rather than 20 actually being a noticeably better answer than 19)
Logged
🚂 Give 18xx games a chance 🚂

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #13 on: September 04, 2012, 09:38:17 pm »
+32

tl;dr: use Mine to improve Treasures rather than buying Treasures, use Remodel and Workshop to pick up engine pieces, wait until you have a few Smithies to get a Militia, pick up Villages early and often, sprinkle in some Markets, and grab up to 3 Cellars.

Quote from: Geronimoo
I expect an expert human player will be able to get at least an 80% win rate against the big money strategy.
This quote from the article was my motivation, at least for the first part of the process. When I reached the 80% goal, I had actually jumped from 79% to about 82% if I recall correctly, and felt I still had room for improvement. My next goal was 85%, then 87%, then 89%...and I could only just reach that. I really wanted to get up to 90%, but ran out of ideas for how to improve the bot. I took comfort in the fact that Smithy's win rate was less than 10%--not losing 90% of the time is close enough to winning 90% of the time, right? ;D

Anyway, basically I just spent a whole lot of time on this in a pretty repetitve process: run the simulation, check the sample logs for behavior that can be improved (especially in the games where the bot lost), try something to improve it, repeat. I was surprised that eventually, just directly editing the xml became quicker than editing the bot through the GUI.

Anyway, enough about how I made the bot, onto what the bot actually does.


The Opening

5/2
Open Mine/Cellar. Getting a Remodel is the highest priority, then a single Village, then a Workshop.

4/3
Open Remodel/Workshop. Buy one Market, then a Mine.

Building the Engine

The main idea of the deck is a Village/Smithy engine, but quite a few terminal actions that aren't Smithy are also used (Mine, Remodel, Workshop, and Militia). To make this work, whenever there are two more terminals in the deck than Villages, prioritize Village.
Use Mine to improve money; the only Treasure that is actually bought is a single Gold(actually not quite true, there are a couple rules down at the end), but only after at least one Market is bought, and only if there are no Golds in the deck. (so if Mine improves a Copper into Silver and that Silver into Gold, no Gold will be bought)
A Militia is picked up after the third Smithy. I think the key here was just that the sooner the deck can draw itself, the better. At this point, the deck is being drawn consistently enough that Militia will be played just about every turn.

The final bot in Geronimoo's article included a special rule for the case of having exaclty $7 and 2 buys: buy a Village here, then you'll have enough left for another engine part. Since the goal is a big draw engine, this is a better move than Market/Cellar. I included this rule, and also added a similar rule for $6 and 2 buys. The $6 rule is a bit more complicated: basically if there is at least one Smithy in the deck, and there is one more terminal in the deck than Villages, then use $6 and 2 buys to buy 2 Villages, rather than a Gold or a Market.

Buy 2 Smithies.
Buy up to 5 Markets.

If there is one more terminal in the deck than Villages, buy a Village.

Buy up to 6 Smithies.

Buy Market.

Buy up to 9 Villages. (avoiding the pile out reduced 3-pile endings and was a small boost)

Buy a Cellar.
Buy a second one if you have at least one Smithy. (if you have bad draws early on, don't want to get bogged down with too many Cellars. The simulator doesn't play Cellar so great, so it's more likely to overplay it and end up with a small, useless hand than a human player would be.)
Buy a third one if there are at least 4 Victory cards in the deck.

Once Remodel has turned those pesky Estates into wonderful engine pieces, it will start trashing Treasures; it will turn Golds into Provinces, and Silvers into Duchies or Markets. This can cause your deck to have a bit of an income problem, so Silver will be bought if there are fewer than 7 Treasures in the deck, and Copper will be bought with fewer than 5 Treasures in the deck.


Greening

As Geronimoo pointed out, my bot wins 89% of the time against Smithy+BM. I tried and tried to hit 90% but just couldn't make it; I suspect if it's possible, it will be done by improving this section.

With all this fancy-pants engine building happening, Smithy+BM getting good draws can begin to build up quite a lead. If the bot is down by at least 20 points, Duchy becomes top priority. (buying Provinces before closing the gap some will just bring the game closer to the end in a victory for the Smithy+BM player)

The PPR is present in its most basic form: with 2 Provinces left in the supply and tied with or losing to the opponent, buy Duchy over Province. It was actually pretty amusing when I remembered to include this; I had spent quite a bit of time working on other, less helpful parts when it suddenly came to me. It added an immediate boost--can't remember how great it was at the time, but I think it was around 3%, might have been more.

The bot buys its first Province once it has at least 5 Smithies, and at least $14 to spend and two buys--so it won't green until it can buy a Province and something useful for the engine--or of course a second Province. Once a Province is in the deck, there are no other restrictions on Provinces.

After the way behind rule and PPR, here is a pretty standard Duchy rule: if there is at least one Province in the deck and 5 or fewer in the supply, buy Province.

Duchy had an unusual buy rule, so why not Estate too? When there are more than 2 Provinces in the supply, and the deck has reached its maximum goal of six Smithies, and there is at least one Cellar in the deck, buy an Estate.

Buy Estate if there are 2 or fewer Provinces in the supply.
Logged
🚂 Give 18xx games a chance 🚂

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #14 on: September 05, 2012, 10:46:41 am »
+1

Oh yeah: also there are a few Cellar rules near the bottom, I noticed the bot was doing stuff like Remodeling Copper into Cellar when it could have instead played Militia or Workshop, and ended up with something better. This is also why (almost?) all of the rules have conditions checking whether it's in the Action phase or not.
Logged
🚂 Give 18xx games a chance 🚂

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #15 on: September 11, 2012, 07:16:40 am »
+2

I updated the article to include this challenge.

http://dominionstrategy.com/2012/07/30/building-the-first-game-engine/
Logged

loppo

  • 2014 Austrian Champion
  • *
  • Offline Offline
  • Posts: 176
  • Respect: +194
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #16 on: September 11, 2012, 09:25:36 am »
0

is there a chance, we could get the graph Average Victory points gained/turn for the michaeljb bot too? Would love to see the changes to other bots.
Logged

Geronimoo

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1059
  • Respect: +868
    • View Profile
    • Geronimoo's Dominion Simulator
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #17 on: September 11, 2012, 09:41:41 am »
0

The graphs are almost the same. michaeljb's bot builds the engine first and then gets a few mega turns like the best bot I made. The only discernable difference is that michaeljb's engine seems more resilient to greening.
Logged

Polk5440

  • Torturer
  • *****
  • Offline Offline
  • Posts: 1708
  • Respect: +1788
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #18 on: February 01, 2013, 06:28:25 pm »
0

Today I downloaded the xml and loaded it into the simulator. There were the 4 Village/Smithy engines, but not the winning entry by michaeljb. Any chance the winning bot can still be posted, Geronimoo?
Logged

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #19 on: February 02, 2013, 12:54:25 am »
+2

Code: [Select]
<player name="First Game engine"
 author="michaeljb"
 description="This is a bot built for the First Game suggested set of 10. It utilizes 8 of the 10 available kingdom cards, and was built against HiveMindEmulator's Smithy bot for Geronimoo's First Game challenge.">
 <type name="Province"/>
 <type name="Optimized"/>
 <type name="UserCreated"/>
 <type name="Engine"/>
 <type name="Competitive"/>
 <type name="Bot"/>
 <type name="TwoPlayer"/>
 <type name="Attacking"/>
 <type name="Combo"/>
   <buy name="Duchy">
      <condition>
         <left type="countCardsInSupply" attribute="Province"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="countVP"/>
         <operator type="smallerOrEqualThan" />
         <right type="countMAXOpponentVP"/>
         <extra_operation type="minus" attribute="20.0" />
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Province"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Duchy">
      <condition>
         <left type="countCardsInSupply" attribute="Province"/>
         <operator type="equalTo" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="countVP"/>
         <operator type="smallerOrEqualThan" />
         <right type="countMAXOpponentVP"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Province">
      <condition>
         <left type="countCardsInDeck" attribute="Province"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Province">
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="4.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="13.0"/>
      </condition>
      <condition>
         <left type="countBuysLeft"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Duchy">
      <condition>
         <left type="countCardsInDeck" attribute="Province"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInSupply" attribute="Province"/>
         <operator type="smallerOrEqualThan" />
         <right type="constant" attribute="5.0"/>
      </condition>
   </buy>
   <buy name="Estate">
      <condition>
         <left type="countCardsInDeck" attribute="Province"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="5.0"/>
      </condition>
   </buy>
   <buy name="Estate">
      <condition>
         <left type="countCardsInSupply" attribute="Province"/>
         <operator type="smallerOrEqualThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
   </buy>
   <buy name="Mine">
      <condition>
         <left type="countCardsInDeck" attribute="Mine"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Market"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Mine">
      <condition>
         <left type="countTurns"/>
         <operator type="smallerOrEqualThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
   </buy>
   <buy name="Remodel">
      <condition>
         <left type="countCardsInDeck" attribute="Remodel"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Village">
      <condition>
         <left type="countCardTypeInDeck" attribute="Terminal"/>
         <operator type="greaterThan" />
         <right type="countCardsInDeck" attribute="Village"/>
         <extra_operation type="plus" attribute="1.0" />
      </condition>
   </buy>
   <buy name="Workshop">
      <condition>
         <left type="countCardsInDeck" attribute="Workshop"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="4.0"/>
      </condition>
   </buy>
   <buy name="Militia">
      <condition>
         <left type="countCardsInDeck" attribute="Militia"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
   </buy>
   <buy name="Market">
      <condition>
         <left type="countCardsInDeck" attribute="Market"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Gold">
      <condition>
         <left type="countCardsInDeck" attribute="Gold"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Village">
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="7.0"/>
      </condition>
      <condition>
         <left type="countBuysLeft"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Village">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countBuysLeft"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardTypeInDeck" attribute="Terminal"/>
         <operator type="greaterThan" />
         <right type="countCardsInDeck" attribute="Village"/>
      </condition>
      <condition>
         <left type="countCardsInSupply" attribute="Village"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Market">
      <condition>
         <left type="countCardsInDeck" attribute="Market"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="5.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Market">
      <condition>
         <left type="countCardsInDeck" attribute="Market"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="5.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="3.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Mine"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="3.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="2.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="equalTo" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
         <extra_operation type="minus" attribute="1.0" />
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Copper"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Silver"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Gold"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countAvailableMoney"/>
         <operator type="equalTo" />
         <right type="constant" attribute="3.0"/>
      </condition>
   </buy>
   <buy name="Village">
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="smallerThan" />
         <right type="countCardTypeInDeck" attribute="Terminal"/>
      </condition>
   </buy>
   <buy name="Smithy">
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="6.0"/>
      </condition>
   </buy>
   <buy name="Market">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Village">
      <condition>
         <left type="countCardsInDeck" attribute="Village"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="9.0"/>
      </condition>
   </buy>
   <buy name="Cellar">
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Cellar">
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Cellar">
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Militia"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Workshop"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Mine"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Cellar">
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="2.0"/>
      </condition>
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Militia"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInDeck" attribute="Smithy"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Workshop"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
      <condition>
         <left type="countCardsInHand" attribute="Mine"/>
         <operator type="equalTo" />
         <right type="constant" attribute="0.0"/>
      </condition>
   </buy>
   <buy name="Gold">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Silver">
      <condition>
         <left type="isActionPhase"/>
         <operator type="equalTo" />
         <right type="constant" attribute="1.0"/>
      </condition>
   </buy>
   <buy name="Cellar">
      <condition>
         <left type="countCardsInDeck" attribute="Cellar"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="3.0"/>
      </condition>
      <condition>
         <left type="countCardTypeInDeck" attribute="Victory"/>
         <operator type="greaterThan" />
         <right type="constant" attribute="3.0"/>
      </condition>
   </buy>
   <buy name="Silver">
      <condition>
         <left type="countCardTypeInDeck" attribute="Treasure"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="7.0"/>
      </condition>
   </buy>
   <buy name="Copper">
      <condition>
         <left type="countCardTypeInDeck" attribute="Treasure"/>
         <operator type="smallerThan" />
         <right type="constant" attribute="5.0"/>
      </condition>
   </buy>
</player>
Logged
🚂 Give 18xx games a chance 🚂

Polk5440

  • Torturer
  • *****
  • Offline Offline
  • Posts: 1708
  • Respect: +1788
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #20 on: February 02, 2013, 09:27:17 am »
0

Sweet! Thanks, michaeljb. Nice job!
Logged

SirPeebles

  • Cartographer
  • *****
  • Offline Offline
  • Posts: 3249
  • Respect: +5459
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #21 on: February 02, 2013, 10:36:53 am »
0

Poor Woodcutter  :'(
Logged
Well you *do* need a signature...

grobblewobble

  • Pearl Diver
  • **
  • Offline Offline
  • Posts: 11
  • Respect: +2
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #22 on: June 27, 2013, 05:38:35 am »
+2

Michaeljb, thanks a lot for your amazing strategy. I love this engine, it is both explosive and surprising.

I think I found two very slight improvements for the 3/4 starting hands. First off, I think you should get a second mine once your engine gets going. With a few turns to go it can just let you end the game one turn earlier sometimes.
Secondly, I think you should eventually remodel the workshop. Into a market, or into that second mine. ;-)

The dynamics with three players get really interesting. If two players try to build the engine they will both lose because there are not enough villages, but if only one player builds the engine he will crush the other two.
Logged

Polk5440

  • Torturer
  • *****
  • Offline Offline
  • Posts: 1708
  • Respect: +1788
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #23 on: June 27, 2013, 08:11:06 am »
0

The dynamics with three players get really interesting. If two players try to build the engine they will both lose because there are not enough villages, but if only one player builds the engine he will crush the other two.

This is why I think 3 player games are underrated. There seems to be a lot more interaction and response to what the other players are doing. A lot of times you have to judge the performance of a "half engine" and the worth of depriving others of engine components.
Logged

michaeljb

  • Saboteur
  • *****
  • Offline Offline
  • Posts: 1422
  • Shuffle iT Username: michaeljb
  • Respect: +2113
    • View Profile
Re: [COMPLETE] Geronimoo's challenges - First Game
« Reply #24 on: June 27, 2013, 01:29:06 pm »
0

I think you should eventually remodel the workshop. Into a market, or into that second mine. ;-)

It's been a while since I've looked, but I'm pretty sure that it does eventually remodel the Workshop to a Market. I never considered a second Mine; intuitively it seems to me like one is enough, but I never actually tried it.

Did you run any sims with those changes? How much did it affect the percentage?
Logged
🚂 Give 18xx games a chance 🚂
Pages: [1] 2  All
 

Page created in 0.061 seconds with 21 queries.