FarkleBot: An experiment in tabletop game AI

Six six-sided dice

(Photo credit: Flickr user philtoselli cc-by-nd)

A favorite activity for my partner and I is visiting brewery taprooms; often, we’ll combine a trip with some kind of casual game, (usually Odin’s Ravens 2e) but we don’t always haul that out with us. A few years ago we grabbed a game off the shelf at Denver Beer Company called Farkle, and we gave it a try.

It’s quite straightforward: Components are only 6d6, and players take turns rolling all of them, then drafting dice out of the most recent roll which meet scoring criteria, then either rolling again or banking their points and passing to the next player. There’s a cool press-your-luck angle, because if there are no score-able dice in a throw, the player has encountered the titular “Farkle”, and their turn ends with zero points[1].

A conversation I encounter with some regularity in the board game space (and rightly so) is the notion of automated testing — codifying all the rules to a design into software, and running repeated simulations to try and ferret out mathematical edge-cases that playtesters might miss. In fact, from a certain viewpoint, it sometimes feels absurd that this isn’t a more common practice.

On the other hand, something has always made me skeptical of the utility of doing so — correct, working code isn’t exactly easy to write, plus, in-progress board game rules are usually in a continuous state of flux during testing. Not to mention, playing games requires a lot of abstract thought, so a simulation which plays well is even harder. And, this type of stochastic simulation reveals nothing to a designer about the actual fun, so its overall utility is limited to finding math issues.

With all this in my head, during our most recent Farkle throwdown, I realized that this game could be an easy way to try it out — each turn is discrete, so there’s no interaction between players, and in fact, within a turn, each roll of the dice is discrete, because drafted scoring dice don’t combine with previously-drafted scoring dice[1]. Continue reading

Facebook Stole My Money

Screen Shot 2015-03-25 at 9.42.59 AMI’m taking a quick hiatus from my philosophy of positivity to share my observations around a distinctly non-positive experience I had recently.

I ran a “Boosted Post” from my Flightless.co Facebook business page, as a little experiment. I had new content, I’m working to build my audience as I gear up for a Valour kickstarter campaign, Facebook display ads convert really well for Mobility on Demand, so I thought I’d give it a shot.

The boosted post featured original content from this blog. (Specifically, the Valour backstory.) Full disclaimer, I know this wasn’t an ideal ad: several equally-emphasized calls-to-action, many clicks through to a ‘conversion’; more on crafting a good ad in another post. But as we’ll soon see, my ad content never had a chance to fail on its own merit. Continue reading

The Importance of a Catch Sheet

One of my most valued characteristics is both a blessing and a curse. I have a creative mind and am constantly coming up with ideas for projects, gadgets, games, apps, solutions, etc.

This is awesome, and I love it, except that it never takes a vacation, including and especially when the time comes around to actually execute on anything. As anyone who has ever tried to build something knows, it’s really hard, and requires a huge investment of time, work, and emotional effort. This is difficult enough on its own, but when ‘focus time’ becomes beset by every shiny cleverness vying for attention, it becomes demoralizing.

In an effort to quiet this noise, I’ve implemented a process using a tool I call the “Catch Sheet”. I’m not sure where that name came from, and there may be some ‘more official’ term, but, whatever.

The process works as follows: Continue reading

Asana Instagantt Chrome Plugin

Asana Instagantt Chrome Plugin in action!I’ve been using Asana for a while to manage my personal to-do list, as well as projects for Flightless.co, and I’m really liking it. I have a few gripes, but that’s probably better covered in another post.

Recently, I tried out the Instagantt<->Asana  integration, and it’s really awesome. In fact, it actually remedies one of my complaints with Asana for timeline management. After playing around, however, my laziness got the best of me, and I was annoyed that I had to open Instagantt separately (#FirstWorldProblems, amirite?).

I decided Asana needed a link to open Instagantt directly from the Tasks dashboard, so I wrote an Asana Instagantt Chrome plugin that would inject one 🙂

It’s really simple, but gets the job done. It also shows some basics (and one or two not-so-basics) of Chrome Plugin building, if you’ve been thinking about writing one yourself. Take a look at the code on Github.

Update: “Open Instagantt from Asana” is now available in the Chrome Webstore!

Ignite Ticket Swap

Hey hey! Ignite Boulder 23 is upon us, which means that before long, there will be folks out there in need of Ignite Ticket Swap. I originally built Ignite Ticket Swap for Ignite Boulder 21, and over the course of two events, it’s now helped ten slackers who missed the ticket buying window 🙂

As we wait for the last ticket to be sold, let’s see what’s new for Ignite 23…

  • Far and away the most requested feature is “cancel” a listing — either an Extra ticket or a Need for a ticket. That’s finally possible.
  • It now  asks users to confirm before making an offer. This ought to cut down on awkward “oops I didn’t mean to swap that to you” messages.
  • After someone posts an extra ticket, we will ping them when new asks arise. This should help make sure anyone who is trying to unload a ticket has the best chance of doing so.

What features do you want to see for Ignite Boulder 24? I love the response this thing has gotten from the Ignite Boulder community, and I want it to be as useful as possible. By that same token, do you know of another event that sells out which might benefit from this? Post to comments or reach out to me (@woodardj) on Twitter!

The Great Netflix Experiment

I’ve just dropped two different Netflix discs into two different mailboxes:  One here at the office, the other down the street at the USPS office. I’m curious which will be delivered to the Lansing facility the fastest. The one downstairs is clearly more convenient, however, I’ve noticed a slightly longer-than-usual turnaround time on movies since I’ve been using it. The Blue Box at the USPS office, on the other hand, is somewhat less convenient, though sports “Pickup Times” of 1:00pm and 5:00pm. Will making the early pickup time get my disc home faster? I will post the results as soon as I know them.

The contenders:

Monk Season 1, Disc 1: USPS facility, Fifth & Liberty.

Burn Notice Season 1, Disc 1: Office mailbox, 100 block of S. Fifth Ave.


Update — Feb 25:


So, the results are in, and they are somewhat staggering (though not particularly surprising)

I think this screen cap from this morning (Feb 25) sums it up best:

Results of the Netflix experiment — Psych Season 1 Disc 2 arrives before Burn Notice Season 1 Disc 1.

“But wait!” You may say — “‘Psych Season 1, Disc 2′ wasn’t even a contender! What exactly are you trying to pull here?” 

Well, here’s what happened. We finished watching the second Psych disc Monday night. I took it to work with me, and dropped it in the blue box on the corner of Main & Washington on my way to the Y at 12:15 on Tuesday, the 24th.

Moral of the story: USPS blue boxes categorically thump the mailbox in the office lobby, hands down. If you beat the 1pm pickup. In Round 2, I’ll be pitting discs left in my mailbox at home (8am) against the reigning champs.