A turn-based implementation of the ancient game of "Go," written as a Google App Engine application. Originally a "weekend hack" by Dave Peck.
Pull request Compare This branch is 110 commits behind davepeck:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Dave Peck's Go service for AppEngine
(c) 2009 Dave Peck, All Rights Reserved


This is the ancient game of Go, implemented as a web service for Google's AppEngine. You can see the latest bits running at http://go.davepeck.org/ -- I will always run them there, on my own dime.

Currently, this service lets you set up a game of Go with a friend. There are no logins or passwords. When it's your turn, you get an email notification. Or, you can silence email and just leave your browser window open. It will update automatically when it's time for you to move.

If you're new to the game of Go, you might consider reading the excellent tutorial at http://is.gd/kD5q

I wrote this code as a "weekend hack" -- a fun project that I could get to a reasonable degree of polish in about a weekend. Since that original weekend, I've added chat and a history view. But there is still a lot more to do. There are lots of cool features I'd love the community to work on. I've listed some below; I'm sure you'll have other even better ideas. Also, because I wrote this software as fast as I could, the code is a little rough around the edges. No doubt you will see all sorts of oddities as you look through it; feel free to just help get the service on a more solid footing!

Anyway, dive in and enjoy. With a little work, I bet we can turn this project into the best place to play Go on the internets!


There isn't too much code. The key files are:


  currently houses all of the AppEngine server-side code, and all of the logic needed to play go (like liberty counting, Ko detection, etc.)


  currently houses all of the browser javascript code, including visuals and AJAX communication


  a total mess of a CSS file for the service.


   these are the two "main" pages. the templates are a little gnarly at the moment.


   the game "creation" form


- Support for the SGF Go file format. (Thanks to Emil Sit! -- "sit" on github)

- Support for chat in the SGF Go file format. (Thanks again, Emil.)

- Support for notification via twitter. (A suggestion of Ray Krueger. Dave Peck implemented it.)

- Lots of new chat features and improvements, including: 

1. Ability to see the full chat history.

2. Ability to refer to specific board squares when chatting. For example, "Dude, you should have moved at A11." will show up with "A11" underlined; clicking on it will cause that grid square to flash.

3. Ability to easily figure out board square names and get them into the chat box.

4. Auto-linkification of valid http, https, and ftp URLs.

- Make all pages fully XHTML 1.0 STRICT valid, according to the W3C validator. 


There is a LOT of stuff to do here, so dive in! I'm open to all suggestions and patches. Send 'em my way.

This list is in "no particular order":

- User accounts

  I want to make sure that people can continue to use the service without ever having to create an account, choose a password, or login. That said, there are some power users who play many games at once. For them, I want to make sure they can log in and track all their games in one central place.

- Ranks, user profiles, and other social features

  I think community aspects are ultimately important in any single-game site like this

- UI Improvements

  I'm not a designer. I tried to make things simple, but I think there's probably lots of room for improvement, both visually and in terms of the interaction model. I'll leave this open-ended and see what people come up with.

- Game branching and speculation

  I'd like people to be able to look through the history of a game and then "branch" it where some critical move was made, so they can try a new path.

- Chat improvement: At the moment, when you chat, the internal representation ties what you said to a particular move. But I don't expose this in the UI anywhere. It would be helpful!

- Visual grid numbers/letters
  Definitely important for advanced players. However, I hope that we can do this in such a way that they are by default off, and when turned on have minimal visual impact.

  Also, see "better chat features" #2. This is, I think, the killer reason to have grid numbers/letters.

- Better layout for 9x9 and 13x13 games.

  Right now the gameplay visual layout is designed with the 19x19 board size in mind. The chat area, in particular, looks wonky on smaller boards. This is one specific "UI Imprvoement" that's probably worth calling out.

- Facebook integration

  Not sure about this, but perhaps some people would use it?

- Free iPhone and Palm Pre front-ends

  Why not? It would be fun to have them! Their source code could be a part of this repository.

- Code cleanup!
  I wrote this service as a "weekend hack." As a result, there are lots of strange things still in there. Many data structures, local variables, etc. are either extraneous, or duplicated, or something in between.

  I had the idea that I would do true MVC on the javascript side. The "models" would directly parallel python types on the back end. The views were just about managing visual appearance. And the controllers tied them together. I got partway there, because frankly it just wasn't important to keep this separation when doing a three day hack. I'd like to go back and really clean this stuff up now. Check out go.js for details.

  The "service" URLs are a bit of a mess. I originally wrote one to check to see if your opponent moved, but what I really should have is a single unified "get state" POST request that takes the desired move number and returns the state. It should work for history as well as game play. I want this in-part for cleanliness, in-part because I think it will make implementing an iPhone front-end easier.

- Make it look better in IE7. 

  For example, I use :hover CSS pseudo-classes on a bunch of non-anchor-tags. That's an IE no-no, but I did it anyway.

- Clean up the madness that is my CSS file.

- Python docstrings, version information, etc. Maybe even break up files into smaller components, gasp.

- Anything you think is cool!


Dave Peck's Go is open source and is licensed under the GNU Affero GPLv3. This is a very restrictive license. You're welcome to run your own service based on this code, but if you make improvements, you have to share them with the community.

In general, I'm not a fan of licenses as restrictive as the AGPL. But I think it is an appropriate license for this project. I hope you'll agree.

There are a few other bits of code that are licensed under different terms:

1. The simplejson library is licensed under an MIT License. A number of people have contributed. You can find out more here: http://code.google.com/p/simplejson/

2. The prototype.js library is (c) 2005-2008 Sam Stephenson and is also under an MIT License.

3. The scriptaculous javascript libraries are (c) 2005-2008 Thomas Fuchs, also under an MIT License.

As for the graphics:

1. All of the images used in the main game board are modified versions of files I found on the Wikimedia Commons. These are distributed with the Creative Commons Attribution 2.0 ShareAlike license. Unfortunately, I can't figure out who made them originally -- the user name is Micheletb

2. All remaining images were hand-drawn by me. I hereby put them under the Creative Commons Attribution ShareAlike 2.0 license: http://creativecommons.org/licenses/by-sa/2.0/