Building a Scrabble MMO in 48 hours

September 2nd, 2010 by jacques Leave a reply »

Last weekend, I was lucky enough to be able to participate in the first Node Knockout. The rules are simple: you have 48 hours to code someone amazing using the Node.js platform. Planning ahead is allowed, however it has to be all on paper (no digital assets, designs, etc)

I’m not sure what it is about these weekend coding competitions, but they’ve always fascinated me. I love seeing real life demonstrations of the fact that technology has progressed to the point where you can go from a harebrained idea to deployed and functional product in a few intense dev days. Or maybe it’s because I remember my previous life as an ASP.NET developer where the first week of a project would barely cover the schema design and data access layer. Either way, it’s great for the Node.js community. If you want to convince the world that a language/framework is worth using, the best way is use it to build amazing stuff, amazingly fast.

Having also competed as a solo team in Rails Rumble the last few rounds with decent results, I had a good idea of what to expect. This time I was able to team up with some really talented local developers I met at MongoSeattle a few months ago: Grant Goodale, Damon Cortesi, and Aviel Ginzburg. I figured with a team of 4, we could really bite off something ambitious and might have a chance at actually completing it.

The Final Product

What we were able to build was a Massively Multiplayer Online Scrabble game. Tiles are placed in realtime, and each player competes with everyone else to build the longest chain of words and the highest score. Once you place a tile, it’s on the board forever and other players have to work around it. You can start your game on anyone’s tiles, but after you place your first word you will need to stick to your own tiles until you run out of lives (swapping tiles loses a life).

The Tools

As soon as we came up with the idea, we knew exactly the right tool for this application. MongoDB geospacial indexing was a lifesaver here. We are able to store every tile thats placed on the board by its x,y coordinate and query a bounding box whenever someone changes their view. The resulting queries are ridiculously fast, even with a tile collection approaching over 90 thousand. Once we get too big for that, scaling is going to be dead simple given we can just use modular arithmetic to produce a shard key.

For the web server, we ended up using ExpressJS since it seemed like the most mature out of the NodeJS web frameworks. As a Ruby/Rails developer (no real node/expressjs experience before), I mostly avoided this aspect of the application, and just worked with static html files, javascript, and css. From what I did use of ExpressJS, it felt very young. Works well if you do everything exactly right and are willing to do some trial and error, but don’t expect edge cases to work, or any kind of comprehensive documentation. Just the simple act of setting cookies, or performing a redirect took dev effort. Node’s philosophy seems to favor that you avoid abstracting too much. This was frustrating to begin with but I soon realized that I really should be knowing the internals of these mechanisms anyways. Using node will force you to become an expert in all things HTTP, which is not a bad thing at all.

For the UI end of things, I figured I’d just stick to what I know. JQuery and JQuery UI handled the job just fine. I do have some issues with the codebase of JQuery UI, and it’s not very hackable, but it’s widely used and well documented. I felt I had to compromise a lot on the usability however and would have loved to rewrite the sortable component (for the Tile Rack) myself in order to make it work exactly as I wanted. But that just wasn’t possible in the timeframe we had.

Hosting wise we used Heroku (with pre-alpha node support). MongoHQ handled the mongodb hosting for us. It all worked like a charm. We had no issues whatsoever while in development, and everything deployed smooth as butter. After we started getting hammered with traffic, the Heroku node does tend to go down a few times a day, requiring a restart but I’m sure they’ll get that fixed up once they hit their actual release. In the meantime, after the competition we’ll probably move our servers elsewhere.

The idea meetup (2 weeks before NodeKO)

The first meeting we had was the idea session. I came prepared with my own idea (along with 3 pages of notes, use cases, and monetization strategies) for a variant on real time web chat. The team heard me out, but it promptly got rejected. It was too bland, and they figured everyone else would be doing it. And if we were going to do this for free in our spare time, they wanted to build something fun. I agreed as well, so we started thinking up game ideas.

As you can probably imagine, these were all over the place initially. Started off exploring the idea of building the card game “Set” (a real time card game). We decided we should build something everyone understands, and thought about doing an online Battleship. Then Scrabble. Then we started thinking about ways to combine them “You sank my Scrabbleship!”. After some additional debate, the idea of Scrabble on an infinite board started to seem plausible. An hour and a couple filled white boards later we had figured out what we wanted to do, along with some initial ideas for game mechanics.

We also came up with the name. We knew it wasn’t going to last, but Scrabb.ly seemed fun to use for the short term. Until the lawyers at Hasbro got wind of it of course.

The feasibility meetup (1 week before NodeKO)

After getting psyched up about the infinite Scrabble idea, we wanted to test out whether the game mechanics would actually work. What better way than to chop up and glue together 5 Scrabble boards. The result is pictured here:

Sitting down and playing with 4 people together on one gigantic Scrabble board allowed us to tweak the rules a bit, and test if it would actually be fun to play in practice. We had a blast, which was proof enough to me that this thing was worth building.

Unfortunately we also found out that one of our team members (Damon) had an important client meeting the next weekend so we’d be down to 3 people on the project. This was a bummer, but we pressed on.

The UI meetup (1 day before NodeKO)

Right before the competition, we met up one more time in order to really nail down the final user interface design before the competiton started. This time we brought some graph paper and colored pencils then started drawing.

We were also able to snag meetings with a couple of the Seattle Techstar teams to walk them through the paper prototypes and get feedback on what made sense and what didn’t. This was incredibly useful to finalize all our intro copy, button labels, and the general user interaction of the site before the competition started. We now had reasonable confidence that most users would understand and be able to use our app once it was built.

Finally, before we left for the night, we came up with a gameplan for each of us on what tasks we need to do in what order.

We decided that if we were going to win this thing, we’d need to have one person (Aviel) fully focused on design for the entire duration of the competition. That turned out to be a great decision as it allowed us to attain a level of design polish and multiple iterations of design ideas that wouldn’t have been possible without a dedicated designer fully obsessing over every pixel.

The 48 hours of coding

Like all the other teams, we started as soon as the competition went underway (Friday at 5pm PST) and worked well into the night. Our team of 3 was able to work together at the Founder Coop offices in Seattle (where TechStars Seattle is located). We took over a conference room and made it our home for the weekend.

I stuck to my gameplan, went line by line, and got each UI feature functional. Grant worked solely on the backend data (mongodb and nodejs), and Aviel was able to focus on designing a gorgeous game board and tiles in Photoshop. Since our interface was just one screen, we were able to spend a lot of time on each little piece of it, and go through a few different design ideas.

First Working Infinite Board UI

After going all of Friday night into Saturday morning, we felt we made great progress. The infinite board was working, along with the dragging tiles back and forth between the rack and the board. And we had some nice initial tile and board design psds to integrate. After about 5 hours of sleep on Saturday, we started back up.

Adding Board Tiles and Basic Rack Panel

Adding Rack Tiles and Drag/Drop

The Saturday night – Sunday morning was the toughest stretch of the competition by far. Low sleep, and lots of broken functionality definitely took a strain on motivation levels. After working through the night, on Sunday morning I was pretty much resigned to shipping a half broken piece of crap. The basic infinite board, tile placing, and design looked good, but the game didn’t work at all. We couldn’t validate placing a word onto the board, and we hadn’t even started on the push notifications. I toyed with the idea of cutting my losses and just going to sleep.

Adding Compass and Random Tile Generator

Pressing on, we found small wins here and there, and finally got the word placing to work. Integration with push notifications from the server was handled by a 3rd party web service called PusherApp, and it took all of about 15 minutes to get up and functional. After those 2 big features were in, I had the motivation to actually finish the thing. On Sunday from noon to 3pm, we basically built the entire game system within Scrabb.ly (end turn, score submission, restart game, etc). It was rapid fire. We went though all the missing features, spent 20 – 30 minutes coding each one, and on to the next. The rapidly approaching deadline meant whatever didn’t get done in a short window of development had to be cut.

Adding Play Buttons and Logo Panel

Adding the Score Panel, the leaderboard, and the jGrowl Alerts. Lightened up the Board colors.

At 3pm on Sunday we were able to focus the next 2 hours purely on bug fixes and polish. Adding an intro screen, putting in a leaderboard, and fixing a ton of bugs with resolving word positions. The frantic code, checkin, deploy, and swearing lasted right up until minutes before the deadline. Unfortunately some bugs caused us to have to strip out the leaderboard as one of our last checkins. But at that point I couldn’t really get anything working right as I was running on fumes and could barely think straight.

After the 5pm deadline, we took some shots of whisky, drank a bottle of wine, and called it a night.

To get a feel for how frantic the dev activity was, here’s the full git commit log: http://gist.github.com/561680. Near the end of the competition I wasn’t even coherent enough to spell the swear words correctly in the commit messages.

Final released version!

Traffic Stats

In the 3 days since we’ve launched, we’ve managed to get almost 7 thousands unique visitors. Over 90 thousand individual Scrabble tiles have been placed on the board so far. Feedback has been fairly positive aside from the fact that the board has gotten way too large and it’s difficult to scroll far enough to find a place to start playing. We plan to iterate with some of these fixes and release a new version on Friday after competition judging ends.

Why we do it

Over 200 teams signed up for Node Knockout, and around 100 produced final judge-able products. The question is, why do we do it?

I think what competitions like this give is a structured way to “prove your chops” to the world. Having a successful entry, even if it doesn’t win, gets huge exposure from important people in the tech sector. Having a concrete example of your abilities in a public forum can mean a huge difference between a low hourly rate and a high one, the difference between a dream job with high salary and a a mediocre one. The tangible benefits of competing successfully can easily equate to tens of thousands of dollars over the course of year for a worthy competitor.

Another great benefit is the motivation that comes with working against the best and the brightest in the industry. You know right away you can’t be slacking off and have a chance. Judging from the results, this seems to help bring out the best in people. The high caliber of the final submitted apps support that.

A Month Later

Just over a month after the competition, Scrabb.ly has hit 2 million placed tiles and over a hundred thousand unique visitors. Traffic is growing every day through word of mouth, and we’ve had to switch web hosts twice just to handle the load (we’re now on Blue Box Group, for both our web and MongoDB servers).

We never thought our Node Knockout side project would get the response it has so far, but we’ve decided to keep it running and see just how ridiculously huge this Scrabble board can get!

———-

About Author: Jacques Crocker is a Ruby on Rails developer in Seattle.
Follow him on Twitter at @railsjedi

Advertisement
  • Michael Langford

    You should offer to sell it to hasbro for $1, just to keep it going!

  • http://twitter.com/godswearhats Aidan

    Scrabb.ly is my online heroin.

  • Anonymous

    It’s an interesting game idea, but you really need to change the game and (slightly) the appearance. Whereas game mechanics aren’t legally protectable, the brand is, and Hasbro has a history of using the law to protect their Scrabble brand.

    One way or another, Hasbro’s going to force you to change the name. You should do it now, while your SEO is still nascent, and while you can still 302 redirect from the original domain.

    The game’s great, but it’s disrespectful to this blatantly rip off someone’s brand.

  • http://twitter.com/railsjedi Jacques Crocker

    Yep, I agree. We plan to get it completely changed over this weekend. In retrospect, the name might have been a boneheaded decision. Oh well, we were just having some fun with it.

  • http://shiftb.com/ shiftb

    Awesome writeup. Completely agree with all that you said. I kind of wish that we had done all that planning that you guys did ahead of time for our project.

    Congrats!

  • http://bobek.cz bobek

    Would you consider publishing the sources? I am pretty positive that it is very interesting reading. Great work anyway.

  • http://twitter.com/technomancy Phil Hagelberg

    > For some warped reason, we think blatant copyright infringement is quite hilarious

    Technically you’re involved in trademark infringement and possibly patent issues, no copyrights are being violated here. Keep on rocking!

  • http://www.superlevel.de/superlicious/super-licio-us-241 Super.licio.us | Superlevel

    [...] Building a Scrabble MMO in 48 hours games design development [...]

  • http://www.30startups.com/2010/09/05/weekly-link-roundup-95/ Weekly Link Roundup 9/5 | 30Startups

    [...] Building a Scrabble MMO in 48 hours [...]

  • http://twitter.com/deepthawtz Dylan Clendenin

    very cool to see your process

  • http://twitter.com/jseakle Jake Eakle

    Blanks appear to be broken (In Safari, on OSX 10.5). It prompts for a letter, but then it’s not really there. For instance, I drew DEB_NKS, typed U for the blank, and was then told that “DEBNKS is not a valid word.” :(

  • http://www.leggetter.co.uk/2010/09/14/client-push-services-open-up-real-time-to-everyone.html Client Push Services Open Up Real-Time to Everyone | Phil Leggetter – Software Consultant

    [...] Interactive games [...]

  • Anonymous

    Did you guys get any response from Hasbro? (awesome writeup and congrats on this!)

  • http://twitter.com/mattpaul Funkminsta Fulla

    Love the game and the writeup – a very ambitious hackathon project indeed!

    I have a couple of follow up questions for ya if you would indulge me :)

    1) Could you speak more about the Heroku downtime you’ve experienced? Would you say its endemic to the hosting provider or the application code or a particular piece of the stack such as MongoDB? Or would the app easily scale out given a hosting plan with more cost?

    2) What gives with the rule that once your first word has been placed, all subsequent words you place must be played off of your first word? That makes the placing of your first word VERY important which suggests this rule should be communicated clearly in advance. Just sayin’ :)

    Thanks for sharing your hard work and documenting the process. Great read!

  • http://www.quora.com/How-do-teams-best-prepare-for-timed-programming-competitions-such-as-Node-js-Knockout-or-Rails-Rumble#ans115616 Quora

    How do teams best prepare for timed programming competitions such as Node.js Knockout or Rails Rumble?…

    The Scrabbly Node KO team did a lot of “legal” prep beforehand that you’ll want to read about: http://www.startupmonkeys.com/2010/09/building-a-scrabble-mmo-in-48-hours/ The Node Chess team seems to have used Git and IRC exclusively to coordinate th…

  • http://twitter.com/robb1e Robbie Clutton

    ditto, would love to see the source of this

  • http://pulse.yahoo.com/_BIDLBKWOE67VRIQG24U3ZV574M Debra

    I’ve been playing this fiercely addictive game for about a week now. This morning it gave me a score of 3 for the word Quire ! Should have been 13 points ! Maybe it was just a glitch…………….

  • ALA

    I enjoy the game–yet every time i try to use a blank tile my game locks up and i have to get out and come back. When i place a blank tile the box comes up to select the letter i want. I type in the letter, hit ‘ok,’ then complete my word. When i hit the ‘add word’ button everything locks up and i can’t seem to do anything but get out. Does anyone else have trouble using the blank tiles? What are your secrets?