COMP 4104

Connect Four

Project Report

Date: Sunday December 18, 2011

Professor: Tony White

Name: Kevin Scroggins

Student ID: 100679071

E-Mail: nitro404@gmail.com

Name: Corey Faibish

Student ID: 100764177

E-Mail: cfaibish@connect.carleton.ca

Table of Contents

1. Project Overview

1.1 Game Overview

2. System Architecture

2.1 Design

2.2 Components

2.2.1 Database Server

2.2.2 Matchmaking Server

2.2.3 Connect Four Application

2.3 Database Design

2.3.1 Tables

2.3.2 Queries

2.4 Protocol Design

2.4.1 Client to Server Messages

2.4.2 Server to Client Messages

2.4.3 Client to GameSession Messages

2.4.4 GameSession to Client Messages

2.4.5 Determining Connectivity

2.5 Design Patterns

3. Use Cases

3.1 User Creates Account

3.2 User Logs In

3.3 User Requests Match

3.4 User Places Piece

3.5 Game Ends

4. Technologies

4.1 Java

4.2 RabbitMQ

4.3 RMI

4.4 Android 4.0

5. Instructions

5.1 Important Notes

5.2 Environment Setup

5.3 Program Arguments

5.3.1 Database Server Arguments

5.3.2 Matchmaking Server Arguments

6 Screenshots

7 Example Output

7.1 Database Server

7.2 Matchmaking Server

1. Project Overview

Our goal is to create multi-player game of connect four on the Android using a central matchmaking server.

Our project will also implement a database for statistics tracking and user authentication.

1.1 Game Overview

Connect four is a two-player game where the players each take turns dropping pieces into the one of the columns of the seven column by six row grid. The pieces fall straight down occupying the next available space. Each player is designated a different color for their pieces (usually red and blue). The goal of the game is to connect four of your pieces either vertically, horizontally or diagonally before your opponent can do so. Our Android implementation uses its touch screen to display an interactive, virtual game board instead of dropping physical pieces into a game board.

2. System Architecture

2.1 Design

Figure 1 - High-Level Architectural View of System

2.2 Components

As shown in figure 1, our system is comprised of 3 major components: the database server, the matchmaking server and the actual connect four android application.

2.2.1 Database Server

Our system makes use of a database for storing user accounts and match results. The database is designed to be a remote object (using RMI), which is used by the matchmaking server to interact with the database. The default database uses SQLite, however, our database also allows for alternative database implementations through its class loader. Alternative databases can be configured through the “dbms.cfg” file which specifies what database management systems are available.

2.2.2 Matchmaking Server

In order for users running our application to be able to connect to each other, we have set up a server to allow them to do so. The matchmaking server handles all communications to and from the players, and updates the database when appropriate. Game sessions between users, credential authentication, stats tracking and other important tasks are managed by the matchmaking server.

2.2.3 Connect Four Application

The client-side of our system is the actual connect four Android application. This is where users can either play a game of connect for locally (hot-seat) or they can play online with another player (multi-player). Before users are able to play online, they are also required to log in.

2.3 Database Design

The following subsections will describe specific elements of the database in more detail.

2.3.1 Tables

This section contains the table representation of our database, as well as description of what each entry’s purpose is.

Note:

  1. Underlined names are primary keys
  2. Underlined and italicized are foreign keys which reference primary keys in another table.

UserData

Description

UserName

User’s unique account name

Password

User’s password

LastLogin

Last time user logged in

JoinDate

Date user created account

Wins

Number of wins this user has

Losses

Number  of losses this user has

Draws

Number of draws this user has

GameHistory

Description

GameDate

A timestamp of when the game was played

FirstPlayer

References UserData.UserName

SecondPlayer

References UserData.UserName

Outcome

The outcome of the game, stored as an int such that:

  1. 0 = Draw / Disconnect
  2. 1 = Player 1 Won
  3. 2 = Player 2 Won

Note that when a user leaves a game session before the game is finished, the game is not counted.

2.3.2 Queries

This section contains a complete list of all queries that are executed on the database.

  1. CreateUser - Creates a new user in the database (if they don’t already exist).
  2. DeleteUser - Removes a user from the database.
  3. AddWin - Increments the amount of wins the specified player has.
  4. AddLoss - Increments the amount of losses the specified player has.
  5. AddDraw - Increments the amount of draws the specified player has.
  6. AddMatch - Adds a match to the GameHistory table.
  7. UserLogin - Verifies a user’s credentials and updates their last login date.
  8. UserLogout - Logs a user out.
  9. ChangePassword - Changes the password of the user.
  10. GetPlayerStats - Returns the wins, losses, and draws of a specified user.
  11. GetPlayerHistory - Returns the match results for a specified player.
  12. GetMatchHistory - Returns the match history of a specified pair of players.
  13. GetUserNames - Returns a list of all users in the UserData table.
  14. GetUserNamesFromHistory - Returns a list of all users in the GameHistory table.
  15. DeleteUserHistory - Deletes all games involving the user from the table.

2.4 Protocol Design

The following subsections will describe the design of our messaging protocol in more detail. Each message type is followed by bulleted points which represent its attributes.

2.4.1 Client to Server Messages

Ping

Pong

Create Account

  1. User Name
  2. Password

Login

  1. User Name
  2. Password

Find Game

  1. User Name
2.4.2 Server to Client Messages

Ping

Pong

Account Created

  1. User Name

Account Not Created

  1. User Name

Logged In

  1. User Name

Not Logged In

  1. User Name

Player Stats

  1. User Name
  1. Wins
  2. Losses
  3. Draws

2.4.3 Client to GameSession Messages

Place Piece

  1. User Name
  2. Column Index

Left Session

  1. User Name
2.4.4 GameSession to Client Messages

Start Game

  1. Player Number
  2. Current Player Name
  3. Opponent Player Name

Piece Placed

  1. User Name
  2. Column Index

Move Valid

  1. User Name

Move Invalid

  1. User Name

Player Won

  1. User Name

Draw

Player Left

  1. User Name

2.4.5 Determining Connectivity

In order to ascertain connectivity, we have employed a Ping / Pong system to find out if the connection between the client and server is still active. One end will send a Ping signal, then, the other end must respond promptly with a Pong signal. If a Pong signal is not received within a specific amount of time, the connection times out and is terminated. It should be noted that both the server and client are constantly using Ping / Pong to verify their connection.

There are two time intervals relevant to the Ping / Pong system. One is the interval between when you receive a Pong and when you send your next Ping. This is known as the ping interval, and is set to 5 seconds. The second is the period of how long you wait for a response. This is called the connection timeout interval, and is set to 7.5 seconds.

Figure 2 - Sample Ping / Pong Case

Figure 2 displays an example case of the Ping / Pong system. In this example, we see how when a Ping is sent, it has a 7.5 sec interval for the corresponding Pong to be sent. Then, we see the responding Pong received back on the sender’s end. Next, the sender waits the 5-second ping interval, and then sends its next Ping, and the cycle starts again.

2.5 Design Patterns

  1. Singleton
  1. Many components in our applications are singletons, so that they can be managed by the parent component, and easily accessible to all other components.
  2. Example: DatabaseServer, Server store various globally accessible objects, such as the console and the remote database object

  1. Observer
  1. The observer pattern is utilised in our code in some places, in order to inform objects that a change has occurred.
  2. Example: SystemConsole informs a set of GUI (Updatable) objects that a line was written in it, so they should update

  1. Half-Sync / Half-Async
  1. Our code makes use of threading to perform network message handling, so the functionality of the program remains uninterrupted.
  2. Example: Server, DatabaseServer, GameSession, ConnectFour all use threading to receivefor and handle incoming messages

  1. Half-Object Plus Protocol
  1. The half-object plus protocol pattern is used through RMI in our code, between the Database and the Matchmaking servers.
  2. Example: DBMS, SQLiteDBMS are skeleton / stub objects which use RMI

  1. Model / View / Controller
  1. Our code is architected to separate the model, the GUI and the code to link them together.
  2. Example: DatabaseWindow, ServerWindow

  1. Facade
  1. A substantial amount of our code makes use of the facade pattern, where one function combines functionality from other classes to perform a complex function.
  2. Example: handleMessage in Server, GameSession and ConnectFour

3. Use Cases

3.1 User Creates Account

If the player does not already have an account on the server, they must first register one. This can be done by clicking the “Create Account” button. A prompt will appear, asking for a user name and password. Once the user enters their credentials, and presses “Ok”, they are forwarded to the server, and the account is created, so long as everything is valid and the account doesn’t already exist. After a response is received from the server, the user must then log into the account (assuming it was created successfully).

3.2 User Logs In

A player begins by clicking on the “Log In” button, which then prompts the user for their credentials (user name and password). Once entered, the player selects the “Ok” button, and the credentials are sent to the server for validation. Once the credentials are verified, the user is logged in. The user will be informed of such in a pop-up message, and a text status in the bottom-right corner of the screen, which will update and say in text “Logged In:” followed by the player’s user name.

If the credentials are invalid, a dialogue will appear notifying the user of the failed login, as well, and a text status in the bottom-right corner of the screen, which will update and say in text “Login Failed”.

3.3 User Requests Match

A player begins by requesting a match by clicking on the “Start Game” button (assuming they are already logged in). A prompt will then appear asking if they would like to play hot-seat or multi-player (online). Assuming the player selects multi-player, the server will either:

  1. Create a new game session and add the user to it if no sessions are available or all sessions are full. The player will then wait until another player requests a match.
  2. Otherwise, if there is at least one session available, the player is added to it.

Once the game session is full, a random starting player will be chosen, and a message will be sent to each player with appropriate information so that the game can begin.

3.4 User Places Piece

A player begins by touching the column on the screen within the connect four board that he desires to drop a piece in. This move is then sent to the server for validation. The player is unable to place more pieces until the move is either validated or invalidated (although this should be virtually instantaneous).

  1. If a “Move Valid” response is received from the server, the piece appears in the board, and control is given to the next player so that they may place a piece.
  2. If a “Move Invalid” response is received, no piece is placed and the player may attempt to place another piece.

3.5 Game Ends

The game ends when a player wins by joining 4 pieces in a row either horizontally, vertically or on a diagonal, or if the board becomes full. When this happens, a signal is sent to the players indicating that the game is over, and which player won (if any). A pop-up message will also appear indicating the outcome of the game.

4. Technologies

4.1 Java

All 3 of our systems are implemented in Java.

4.2 RabbitMQ

All messaging is done using RabbitMQ.

4.3 RMI

All database interactions are done via RMI using a remote object.

4.4 Android 4.0

Our implementation of Connect Four on Android is developed using the Android 4.0 (API 14) SDK with Android 2.2 (API 8) as a minimum requirement for the device.

5. Instructions

5.1 Important Notes

Due to strange issues with the Android SDK, the application may crash or become unstable if the phone changes orientation or goes to sleep, so try to avoid this if possible.

If the application is started while the phone is already asleep, the phone will also exhibit strange behaviour.

We also discovered that Android virtual devices exhibit strange behaviour when two are run on the same computer as well. It somehow results in devices receiving messages destined for a different device, or no messages at all. So, if you wish to test our code, do NOT run two virtual devices on the same computer. It is highly recommended that you run one application on a physical Android device, and another on a virtual device, or else the application will not work.

There is an implementation for determining if the Android application is still connected to the server, but since there are non-deterministic threading issues which cause this not to work on occasion (ie. Android app will say it is disconnected from the server, when it is not), we have disabled this so that functionality will not be hampered.

Our system is set up with hierarchical dependencies on our different programs. In order to run any instance of our Connect Four Android application, you must first run the Database Server, followed by the Matchmaking Server. Once these are both up and running in this order, you may then run the Android application.

5.2 Environment Setup

A standard install of the Java Development Kit 1.6 or higher is required to run our software, as well as an install of the Android SDK 4.0 (API 14) and Android SDK 2.2 (API 8) in order to deploy the Android application.

Our system requires the RabbitMQ broker server to be running on a dedicated machine in order for the messaging queues to be able to talk to each other. This can be specified via the program arguments for the database server and matchmaking server, should it differ from the default (which is port forwarded and running on Kevin’s personal computer via dyndns - however this computer is not always on). So if an alternative computer is required to run the RabbitMQ broker server, you must run the program with alternate arguments and edit the code for the android app to change the default broker server (as it is hard-coded to the app).

The database server and matchmaking server can be run from Eclipse, or from the pre-compiled jars, which are provided. Since all program arguments are optional, there is no requirement to specify any arguments at runtime.

5.3 Program Arguments

5.3.1 Database Server Arguments
  1. -rmi ext/int (Optional)
  1. Determines how the RMI registry will be running.
  2. int - Allows the server to run an internal / integrated RMI registry.
  3. ext - Specifies to search for externally running RMI registry.
  4. Default: int

  1. -rmiport #### (Optional)
  1. Specifies which port to use for RMI registry.
  2. Default: 1099

  1. -dblist “dbms.cfg” (Optional)
  1. Specifies which database management list file to use.
  2. Default: “dbms.cfg”

  1. -dbms “DBMS”
  1. Specifies which database management system to use from the list in the database management list file.
  2. Default: Prompts for DBMS to load, unless there is only one in which case it is automatically loaded
5.3.2 Matchmaking Server Arguments
  1. -q “Server Queue Name” (Optional)
  1. Specifies the message queue that the server will listen on.
  2. Default: “Matchmaking Server Queue”

  1. -rmiport #### (Optional)
  1. Specifies which port the RMI registry is running on in order to perform a lookup for the remote database object.
  2. Default: 1099

  1. -b “Broker Hostname” (Optional)
  1. Specifies the IP address or hostname of the computer running the RabbitMQ broker server.
  2. Default: “nitro404.dyndns.org”

6 Screenshots

Figures 3 and 4 (respectively) - Main screen (before login) and account creation prompt.

Figures 5 and 6 (respectively) - Login prompt and main screen (after login).

Note the text at the bottom, which indicates that the user is logged in.

Figure 7 and 8 (respectively) - Prompt to select game mode and finding match dialog.

Figure 9 and 10 (respectively) - Game board on match start, and a sample game ending with red winning.

Figure 11 - Main screen, after a game was played.

Note the text at the bottom left updates with the player’s current stats.

Figure 12 - Database server window, with console selected.

This image contains sample output after playing some games.

Figure 13 - Database server window, with user data tab selected.

This image displays the contents of the user data table.

Figure 14 - Database server window, with the game history tab selected.

This image displays the contents of the game history table.

Figure 15 - Matchmaking server window, with console tab selected.

This image displays some output after some games that were played.

Figure 16 - Matchmaking server window, with the users tab selected.

This image displays all of the users connected to the server and their information.

Figure 17 - Matchmaking server window, with the game sessions tab selected.

This image shows the games sessions which are currently active.

7 Example Output

7.1 Database Server

2011-12-18 07:14:58 PM: Connecting to SQL Database: users.sql

2011-12-18 07:14:59 PM: Connected to SQL Database

2011-12-18 07:15:03 PM: Adding database listener

2011-12-18 07:16:08 PM: Added user "Corey" to database

2011-12-18 07:16:44 PM: User "Corey" logged in

2011-12-18 07:16:44 PM: Retrieved stats for user "Corey"

2011-12-18 07:17:51 PM: User "Corey" logged in

2011-12-18 07:17:51 PM: Retrieved stats for user "Corey"

2011-12-18 07:24:54 PM: Added user "nitro" to database

2011-12-18 07:26:25 PM: User "nitro" logged in

2011-12-18 07:26:25 PM: Retrieved stats for user "nitro"

2011-12-18 07:27:43 PM: User "Corey" logged in

2011-12-18 07:27:43 PM: Retrieved stats for user "Corey"

2011-12-18 07:30:16 PM: Added win for "nitro".

2011-12-18 07:30:16 PM: Notified 1 listeners of stats update for "nitro"

2011-12-18 07:30:16 PM: Added loss for "Corey".

2011-12-18 07:30:16 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:30:16 PM: Added match for "nitro" vs. "Corey" with outcome Win

2011-12-18 07:32:27 PM: User "Corey " failed to login with valid credentials

2011-12-18 07:32:37 PM: User "Corey" logged in

2011-12-18 07:32:37 PM: Retrieved stats for user "Corey"

2011-12-18 07:33:51 PM: User "Corey" logged in

2011-12-18 07:33:51 PM: Retrieved stats for user "Corey"

2011-12-18 07:35:26 PM: Added win for "nitro".

2011-12-18 07:35:26 PM: Notified 1 listeners of stats update for "nitro"

2011-12-18 07:35:26 PM: Added loss for "Corey".

2011-12-18 07:35:26 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:35:26 PM: Added match for "nitro" vs. "Corey" with outcome Win

2011-12-18 07:37:21 PM: Added win for "Corey".

2011-12-18 07:37:21 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:37:21 PM: Added loss for "nitro".

2011-12-18 07:37:21 PM: Notified 1 listeners of stats update for "nitro"

2011-12-18 07:37:21 PM: Added match for "nitro" vs. "Corey" with outcome Loss

2011-12-18 07:38:36 PM: User "Corey" logged in

2011-12-18 07:38:36 PM: Retrieved stats for user "Corey"

2011-12-18 07:40:54 PM: Added draw for "Corey".

2011-12-18 07:40:54 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:40:54 PM: Added draw for "nitro".

2011-12-18 07:40:54 PM: Notified 1 listeners of stats update for "nitro"

2011-12-18 07:40:54 PM: Added match for "Corey" vs. "nitro" with outcome Draw

2011-12-18 07:41:45 PM: Added user "John" to database

2011-12-18 07:42:01 PM: User "John" logged in

2011-12-18 07:42:01 PM: Retrieved stats for user "John"

2011-12-18 07:43:15 PM: Added win for "Corey".

2011-12-18 07:43:15 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:43:15 PM: Added loss for "John".

2011-12-18 07:43:15 PM: Notified 1 listeners of stats update for "John"

2011-12-18 07:43:16 PM: Added match for "John" vs. "Corey" with outcome Loss

2011-12-18 07:46:42 PM: User "nitro" logged in

2011-12-18 07:46:42 PM: Retrieved stats for user "nitro"

2011-12-18 07:47:49 PM: User "nitro" logged in

2011-12-18 07:47:49 PM: Retrieved stats for user "nitro"

2011-12-18 07:56:13 PM: Added user "Walrus" to database

2011-12-18 07:56:43 PM: User "Walrus" logged in

2011-12-18 07:56:43 PM: Retrieved stats for user "Walrus"

2011-12-18 07:58:46 PM: Added win for "Corey".

2011-12-18 07:58:46 PM: Notified 1 listeners of stats update for "Corey"

2011-12-18 07:58:46 PM: Added loss for "nitro".

2011-12-18 07:58:46 PM: Notified 1 listeners of stats update for "nitro"

2011-12-18 07:58:46 PM: Added match for "nitro" vs. "Corey" with outcome Loss

2011-12-18 07:58:59 PM: Added win for "John".

2011-12-18 07:58:59 PM: Notified 1 listeners of stats update for "John"

2011-12-18 07:58:59 PM: Added loss for "Walrus".

2011-12-18 07:58:59 PM: Notified 1 listeners of stats update for "Walrus"

2011-12-18 07:58:59 PM: Added match for "John" vs. "Walrus" with outcome Win

2011-12-18 08:03:55 PM: Removing database listener

7.2 Matchmaking Server

2011-12-18 07:16:08 PM: Created account for user: "Corey"

2011-12-18 07:16:44 PM: User "Corey" logged in

2011-12-18 07:16:44 PM: Sending stats to user "Corey"

2011-12-18 07:17:12 PM: User "Corey" timed out.

2011-12-18 07:17:51 PM: User "Corey" logged in

2011-12-18 07:17:51 PM: Sending stats to user "Corey"

2011-12-18 07:18:27 PM: Client with queue name "9774d56d682e549c Queue" timed out.

2011-12-18 07:24:29 PM: User "Corey" timed out.

2011-12-18 07:24:54 PM: Created account for user: "nitro"

2011-12-18 07:26:25 PM: User "nitro" logged in

2011-12-18 07:26:25 PM: Sending stats to user "nitro"

2011-12-18 07:27:27 PM: User "nitro" is requesting a match

2011-12-18 07:27:27 PM: Created session #1 for user "nitro"

2011-12-18 07:27:43 PM: User "Corey" logged in

2011-12-18 07:27:43 PM: Sending stats to user "Corey"

2011-12-18 07:28:06 PM: User "Corey" is requesting a match

2011-12-18 07:28:06 PM: User "Corey" added to session #1

2011-12-18 07:28:06 PM: Starting session #1

2011-12-18 07:29:16 PM: Player "nitro" placed piece at location: (2, 5)

2011-12-18 07:29:18 PM: Player "Corey" placed piece at location: (3, 5)

2011-12-18 07:29:19 PM: Player "nitro" placed piece at location: (3, 4)

2011-12-18 07:29:23 PM: Player "Corey" placed piece at location: (4, 5)

2011-12-18 07:29:25 PM: Player "nitro" placed piece at location: (5, 5)

2011-12-18 07:29:28 PM: Player "Corey" placed piece at location: (2, 4)

2011-12-18 07:29:29 PM: Player "nitro" placed piece at location: (4, 4)

2011-12-18 07:29:39 PM: Player "Corey" placed piece at location: (3, 3)

2011-12-18 07:29:41 PM: Player "nitro" placed piece at location: (1, 5)

2011-12-18 07:29:45 PM: Player "Corey" placed piece at location: (2, 3)

2011-12-18 07:29:47 PM: Player "nitro" placed piece at location: (4, 3)

2011-12-18 07:29:50 PM: Player "Corey" placed piece at location: (4, 2)

2011-12-18 07:29:53 PM: Player "nitro" placed piece at location: (3, 2)

2011-12-18 07:29:55 PM: Player "Corey" placed piece at location: (5, 4)

2011-12-18 07:30:06 PM: Player "nitro" placed piece at location: (2, 2)

2011-12-18 07:30:12 PM: Player "Corey" placed piece at location: (5, 3)

2011-12-18 07:30:16 PM: Player "nitro" placed piece at location: (5, 2)

2011-12-18 07:30:16 PM: Sending updated stats to user "nitro"

2011-12-18 07:30:16 PM: Sending updated stats to user "Corey"

2011-12-18 07:30:16 PM: Removing finished session #1

2011-12-18 07:30:16 PM: Player "nitro" won the game in session #1!

2011-12-18 07:32:10 PM: User "Corey" timed out.

2011-12-18 07:32:26 PM: User "nitro" is requesting a match

2011-12-18 07:32:27 PM: Created session #2 for user "nitro"

2011-12-18 07:32:27 PM: User "Corey " failed to log in with valid credentials

2011-12-18 07:32:37 PM: User "Corey" logged in

2011-12-18 07:32:37 PM: Sending stats to user "Corey"

2011-12-18 07:32:38 PM: Player "nitro" left session #2

2011-12-18 07:32:38 PM: Removing session #2

2011-12-18 07:32:43 PM: User "Corey" is requesting a match

2011-12-18 07:32:43 PM: Created session #3 for user "Corey"

2011-12-18 07:32:51 PM: User "nitro" is requesting a match

2011-12-18 07:32:51 PM: User "nitro" added to session #3

2011-12-18 07:32:51 PM: Starting session #3

2011-12-18 07:33:01 PM: Player "nitro" placed piece at location: (1, 5)

2011-12-18 07:33:03 PM: Player "Corey" placed piece at location: (3, 5)

2011-12-18 07:33:06 PM: Player "nitro" placed piece at location: (2, 5)

2011-12-18 07:33:09 PM: Player "Corey" placed piece at location: (4, 5)

2011-12-18 07:33:11 PM: Player "nitro" placed piece at location: (5, 5)

2011-12-18 07:33:12 PM: Player "Corey" placed piece at location: (4, 4)

2011-12-18 07:33:13 PM: Player "Corey" left session #3

2011-12-18 07:33:13 PM: Removing session #3

2011-12-18 07:33:21 PM: User "nitro" is requesting a match

2011-12-18 07:33:21 PM: Created session #4 for user "nitro"

2011-12-18 07:33:51 PM: User "Corey" logged in

2011-12-18 07:33:51 PM: Sending stats to user "Corey"

2011-12-18 07:33:54 PM: User "Corey" is requesting a match

2011-12-18 07:33:54 PM: User "Corey" added to session #4

2011-12-18 07:33:54 PM: Starting session #4

2011-12-18 07:33:57 PM: Player "Corey" placed piece at location: (4, 5)

2011-12-18 07:33:58 PM: Player "nitro" placed piece at location: (4, 4)

2011-12-18 07:34:00 PM: Player "nitro" left session #4

2011-12-18 07:34:00 PM: Removing session #4

2011-12-18 07:34:11 PM: User "nitro" is requesting a match

2011-12-18 07:34:11 PM: Created session #5 for user "nitro"

2011-12-18 07:34:11 PM: User "Corey" is requesting a match

2011-12-18 07:34:11 PM: User "Corey" added to session #5

2011-12-18 07:34:11 PM: Starting session #5

2011-12-18 07:34:25 PM: Player "Corey" placed piece at location: (3, 5)

2011-12-18 07:34:26 PM: Player "nitro" placed piece at location: (3, 4)

2011-12-18 07:34:27 PM: Player "Corey" placed piece at location: (3, 3)

2011-12-18 07:34:27 PM: Player "nitro" placed piece at location: (3, 2)

2011-12-18 07:34:28 PM: Player "Corey" placed piece at location: (3, 1)

2011-12-18 07:34:29 PM: Player "nitro" placed piece at location: (3, 0)

2011-12-18 07:34:33 PM: Player "Corey" attempted an invalid move in column: 3

2011-12-18 07:34:34 PM: Player "Corey" attempted an invalid move in column: 3

2011-12-18 07:34:35 PM: Player "Corey" placed piece at location: (4, 5)

2011-12-18 07:34:36 PM: Player "nitro" placed piece at location: (4, 4)

2011-12-18 07:34:38 PM: Player "Corey" placed piece at location: (4, 3)

2011-12-18 07:34:39 PM: Player "nitro" placed piece at location: (4, 2)

2011-12-18 07:34:39 PM: Player "Corey" placed piece at location: (4, 1)

2011-12-18 07:34:40 PM: Player "nitro" placed piece at location: (4, 0)

2011-12-18 07:34:44 PM: Player "Corey" attempted an invalid move in column: 4

2011-12-18 07:34:47 PM: Player "Corey" placed piece at location: (2, 5)

2011-12-18 07:34:48 PM: Player "nitro" placed piece at location: (2, 4)

2011-12-18 07:34:49 PM: Player "Corey" placed piece at location: (2, 3)

2011-12-18 07:34:49 PM: Player "nitro" placed piece at location: (2, 2)

2011-12-18 07:34:50 PM: Player "Corey" placed piece at location: (2, 1)

2011-12-18 07:34:57 PM: Player "nitro" placed piece at location: (1, 5)

2011-12-18 07:34:59 PM: Player "Corey" placed piece at location: (1, 4)

2011-12-18 07:35:01 PM: Player "nitro" placed piece at location: (5, 5)

2011-12-18 07:35:02 PM: Player "Corey" placed piece at location: (5, 4)

2011-12-18 07:35:03 PM: Player "nitro" placed piece at location: (5, 3)

2011-12-18 07:35:04 PM: Player "Corey" placed piece at location: (5, 2)

2011-12-18 07:35:05 PM: Player "nitro" placed piece at location: (5, 1)

2011-12-18 07:35:06 PM: Player "Corey" placed piece at location: (5, 0)

2011-12-18 07:35:07 PM: Player "nitro" placed piece at location: (6, 5)

2011-12-18 07:35:09 PM: Player "Corey" placed piece at location: (6, 4)

2011-12-18 07:35:10 PM: Player "nitro" placed piece at location: (6, 3)

2011-12-18 07:35:10 PM: Player "Corey" placed piece at location: (6, 2)

2011-12-18 07:35:11 PM: Player "nitro" placed piece at location: (6, 1)

2011-12-18 07:35:12 PM: Player "Corey" placed piece at location: (6, 0)

2011-12-18 07:35:14 PM: Player "nitro" placed piece at location: (1, 3)

2011-12-18 07:35:16 PM: Player "Corey" placed piece at location: (1, 2)

2011-12-18 07:35:17 PM: Player "nitro" placed piece at location: (1, 1)

2011-12-18 07:35:18 PM: Player "Corey" placed piece at location: (1, 0)

2011-12-18 07:35:20 PM: Player "nitro" placed piece at location: (2, 0)

2011-12-18 07:35:23 PM: Player "Corey" placed piece at location: (0, 5)

2011-12-18 07:35:24 PM: Player "nitro" placed piece at location: (0, 4)

2011-12-18 07:35:25 PM: Player "Corey" placed piece at location: (0, 3)

2011-12-18 07:35:26 PM: Player "nitro" placed piece at location: (0, 2)

2011-12-18 07:35:26 PM: Removing finished session #5

2011-12-18 07:35:26 PM: Sending updated stats to user "nitro"

2011-12-18 07:35:26 PM: Sending updated stats to user "Corey"

2011-12-18 07:35:26 PM: Player "nitro" won the game in session #5!

2011-12-18 07:36:31 PM: User "nitro" is requesting a match

2011-12-18 07:36:31 PM: Created session #6 for user "nitro"

2011-12-18 07:36:32 PM: User "Corey" is requesting a match

2011-12-18 07:36:32 PM: User "Corey" added to session #6

2011-12-18 07:36:32 PM: Starting session #6

2011-12-18 07:36:35 PM: Player "nitro" placed piece at location: (3, 5)

2011-12-18 07:36:36 PM: Player "Corey" placed piece at location: (3, 4)

2011-12-18 07:36:37 PM: Player "nitro" placed piece at location: (3, 3)

2011-12-18 07:36:37 PM: Player "Corey" placed piece at location: (3, 2)

2011-12-18 07:36:38 PM: Player "nitro" placed piece at location: (3, 1)

2011-12-18 07:36:38 PM: Player "Corey" placed piece at location: (3, 0)

2011-12-18 07:36:40 PM: Player "nitro" attempted an invalid move in column: 3

2011-12-18 07:36:41 PM: Player "nitro" placed piece at location: (2, 5)

2011-12-18 07:36:42 PM: Player "Corey" placed piece at location: (2, 4)

2011-12-18 07:36:43 PM: Player "nitro" placed piece at location: (2, 3)

2011-12-18 07:36:44 PM: Player "Corey" placed piece at location: (2, 2)

2011-12-18 07:36:44 PM: Player "nitro" placed piece at location: (2, 1)

2011-12-18 07:36:45 PM: Player "Corey" placed piece at location: (2, 0)

2011-12-18 07:36:46 PM: Player "nitro" placed piece at location: (4, 5)

2011-12-18 07:36:47 PM: Player "Corey" placed piece at location: (4, 4)

2011-12-18 07:36:48 PM: Player "nitro" placed piece at location: (4, 3)

2011-12-18 07:36:49 PM: Player "Corey" placed piece at location: (4, 2)

2011-12-18 07:36:50 PM: Player "nitro" placed piece at location: (4, 1)

2011-12-18 07:36:51 PM: Player "Corey" placed piece at location: (4, 0)

2011-12-18 07:36:58 PM: Player "nitro" placed piece at location: (0, 5)

2011-12-18 07:37:00 PM: Player "Corey" placed piece at location: (1, 5)

2011-12-18 07:37:03 PM: Player "nitro" placed piece at location: (1, 4)

2011-12-18 07:37:04 PM: Player "Corey" placed piece at location: (5, 5)

2011-12-18 07:37:07 PM: Player "nitro" placed piece at location: (5, 4)

2011-12-18 07:37:09 PM: Player "Corey" placed piece at location: (5, 3)

2011-12-18 07:37:10 PM: Player "nitro" placed piece at location: (5, 2)

2011-12-18 07:37:10 PM: Player "Corey" placed piece at location: (5, 1)

2011-12-18 07:37:11 PM: Player "nitro" placed piece at location: (5, 0)

2011-12-18 07:37:13 PM: Player "Corey" placed piece at location: (1, 3)

2011-12-18 07:37:14 PM: Player "nitro" placed piece at location: (1, 2)

2011-12-18 07:37:15 PM: Player "Corey" placed piece at location: (1, 1)

2011-12-18 07:37:16 PM: Player "nitro" placed piece at location: (1, 0)

2011-12-18 07:37:19 PM: Player "Corey" placed piece at location: (0, 4)

2011-12-18 07:37:20 PM: Player "nitro" placed piece at location: (0, 3)

2011-12-18 07:37:21 PM: Player "Corey" placed piece at location: (0, 2)

2011-12-18 07:37:21 PM: Removing finished session #6

2011-12-18 07:37:21 PM: Sending updated stats to user "Corey"

2011-12-18 07:37:21 PM: Sending updated stats to user "nitro"

2011-12-18 07:37:21 PM: Player "Corey" won the game in session #6!

2011-12-18 07:37:28 PM: User "nitro" is requesting a match

2011-12-18 07:37:28 PM: Created session #7 for user "nitro"

2011-12-18 07:37:34 PM: User "Corey" is requesting a match

2011-12-18 07:37:34 PM: User "Corey" added to session #7

2011-12-18 07:37:34 PM: Starting session #7

2011-12-18 07:37:50 PM: Player "nitro" left session #7

2011-12-18 07:37:50 PM: Removing finished session #7

2011-12-18 07:38:19 PM: User "Corey" timed out.

2011-12-18 07:38:36 PM: User "Corey" logged in

2011-12-18 07:38:36 PM: Sending stats to user "Corey"

2011-12-18 07:38:48 PM: User "Corey" is requesting a match

2011-12-18 07:38:48 PM: Created session #8 for user "Corey"

2011-12-18 07:38:49 PM: User "nitro" is requesting a match

2011-12-18 07:38:49 PM: User "nitro" added to session #8

2011-12-18 07:38:49 PM: Starting session #8

2011-12-18 07:38:52 PM: Player "nitro" placed piece at location: (3, 5)

2011-12-18 07:38:55 PM: Player "Corey" placed piece at location: (3, 4)

2011-12-18 07:38:56 PM: Player "nitro" placed piece at location: (3, 3)

2011-12-18 07:38:57 PM: Player "Corey" placed piece at location: (3, 2)

2011-12-18 07:38:58 PM: Player "nitro" placed piece at location: (3, 1)

2011-12-18 07:38:58 PM: Player "Corey" placed piece at location: (3, 0)

2011-12-18 07:39:00 PM: Player "nitro" placed piece at location: (4, 5)

2011-12-18 07:39:01 PM: Player "Corey" placed piece at location: (4, 4)

2011-12-18 07:39:01 PM: Player "nitro" placed piece at location: (4, 3)

2011-12-18 07:39:02 PM: Player "Corey" placed piece at location: (4, 2)

2011-12-18 07:39:10 PM: Player "nitro" placed piece at location: (4, 1)

2011-12-18 07:39:13 PM: Player "Corey" placed piece at location: (5, 5)

2011-12-18 07:39:16 PM: Player "nitro" placed piece at location: (5, 4)

2011-12-18 07:39:17 PM: Player "Corey" placed piece at location: (5, 3)

2011-12-18 07:39:18 PM: Player "nitro" placed piece at location: (5, 2)

2011-12-18 07:39:19 PM: Player "Corey" placed piece at location: (4, 0)

2011-12-18 07:39:23 PM: Player "nitro" placed piece at location: (2, 5)

2011-12-18 07:39:25 PM: Player "Corey" placed piece at location: (5, 1)

2011-12-18 07:39:27 PM: Player "nitro" placed piece at location: (5, 0)

2011-12-18 07:39:29 PM: Player "Corey" placed piece at location: (2, 4)

2011-12-18 07:39:31 PM: Player "nitro" placed piece at location: (2, 3)

2011-12-18 07:39:32 PM: Player "Corey" placed piece at location: (2, 2)

2011-12-18 07:39:33 PM: Player "nitro" placed piece at location: (2, 1)

2011-12-18 07:39:34 PM: Player "Corey" placed piece at location: (2, 0)

2011-12-18 07:39:53 PM: Player "nitro" placed piece at location: (0, 5)

2011-12-18 07:39:55 PM: Player "Corey" placed piece at location: (1, 5)

2011-12-18 07:40:00 PM: Player "nitro" placed piece at location: (1, 4)

2011-12-18 07:40:02 PM: Player "Corey" placed piece at location: (1, 3)

2011-12-18 07:40:03 PM: Player "nitro" placed piece at location: (1, 2)

2011-12-18 07:40:04 PM: Player "Corey" placed piece at location: (1, 1)

2011-12-18 07:40:08 PM: Player "nitro" placed piece at location: (1, 0)

2011-12-18 07:40:18 PM: Player "Corey" placed piece at location: (0, 4)

2011-12-18 07:40:28 PM: Player "nitro" placed piece at location: (0, 3)

2011-12-18 07:40:31 PM: Player "Corey" placed piece at location: (6, 5)

2011-12-18 07:40:32 PM: Player "nitro" placed piece at location: (6, 4)

2011-12-18 07:40:34 PM: Player "Corey" placed piece at location: (6, 3)

2011-12-18 07:40:35 PM: Player "nitro" placed piece at location: (6, 2)

2011-12-18 07:40:36 PM: Player "Corey" placed piece at location: (6, 1)

2011-12-18 07:40:43 PM: Player "nitro" placed piece at location: (0, 2)

2011-12-18 07:40:51 PM: Player "Corey" placed piece at location: (0, 1)

2011-12-18 07:40:52 PM: Player "nitro" placed piece at location: (6, 0)

2011-12-18 07:40:54 PM: Player "Corey" placed piece at location: (0, 0)

2011-12-18 07:40:54 PM: Sending updated stats to user "Corey"

2011-12-18 07:40:54 PM: Sending updated stats to user "nitro"

2011-12-18 07:40:54 PM: Session #8 ended in a draw.

2011-12-18 07:40:54 PM: Removing session #8

2011-12-18 07:41:21 PM: User "nitro" timed out.

2011-12-18 07:41:45 PM: Created account for user: "John"

2011-12-18 07:42:01 PM: User "John" logged in

2011-12-18 07:42:01 PM: Sending stats to user "John"

2011-12-18 07:42:07 PM: User "John" is requesting a match

2011-12-18 07:42:07 PM: Created session #9 for user "John"

2011-12-18 07:42:08 PM: User "Corey" is requesting a match

2011-12-18 07:42:08 PM: User "Corey" added to session #9

2011-12-18 07:42:08 PM: Starting session #9

2011-12-18 07:42:12 PM: Player "Corey" placed piece at location: (3, 5)

2011-12-18 07:42:14 PM: Player "John" placed piece at location: (6, 5)

2011-12-18 07:42:16 PM: Player "Corey" placed piece at location: (6, 4)

2011-12-18 07:42:17 PM: Player "John" placed piece at location: (5, 5)

2011-12-18 07:42:18 PM: Player "Corey" placed piece at location: (5, 4)

2011-12-18 07:42:21 PM: Player "John" placed piece at location: (3, 4)

2011-12-18 07:42:23 PM: Player "Corey" placed piece at location: (3, 3)

2011-12-18 07:42:25 PM: Player "John" placed piece at location: (3, 2)

2011-12-18 07:42:29 PM: Player "Corey" placed piece at location: (5, 3)

2011-12-18 07:42:33 PM: Player "John" placed piece at location: (0, 5)

2011-12-18 07:42:35 PM: Player "Corey" placed piece at location: (5, 2)

2011-12-18 07:42:37 PM: Player "John" placed piece at location: (5, 1)

2011-12-18 07:42:41 PM: Player "Corey" placed piece at location: (3, 1)

2011-12-18 07:42:42 PM: Player "John" placed piece at location: (4, 5)

2011-12-18 07:42:44 PM: Player "Corey" placed piece at location: (3, 0)

2011-12-18 07:42:47 PM: Player "John" placed piece at location: (2, 5)

2011-12-18 07:42:53 PM: Player "Corey" placed piece at location: (5, 0)

2011-12-18 07:42:55 PM: Player "John" placed piece at location: (1, 5)

2011-12-18 07:42:57 PM: Player "Corey" placed piece at location: (4, 4)

2011-12-18 07:42:58 PM: Player "John" placed piece at location: (1, 4)

2011-12-18 07:43:08 PM: Player "Corey" placed piece at location: (0, 4)

2011-12-18 07:43:09 PM: Player "John" placed piece at location: (4, 3)

2011-12-18 07:43:15 PM: Player "Corey" placed piece at location: (4, 2)

2011-12-18 07:43:15 PM: Sending updated stats to user "Corey"

2011-12-18 07:43:15 PM: Sending updated stats to user "John"

2011-12-18 07:43:16 PM: Removing finished session #9

2011-12-18 07:43:16 PM: Player "Corey" won the game in session #9!

2011-12-18 07:46:42 PM: User "nitro" logged in

2011-12-18 07:46:42 PM: Sending stats to user "nitro"

2011-12-18 07:47:36 PM: User "nitro" timed out.

2011-12-18 07:47:49 PM: User "nitro" logged in

2011-12-18 07:47:49 PM: Sending stats to user "nitro"

2011-12-18 07:56:13 PM: Created account for user: "Walrus"

2011-12-18 07:56:37 PM: User "John" is requesting a match

2011-12-18 07:56:37 PM: Created session #10 for user "John"

2011-12-18 07:56:43 PM: User "Walrus" logged in

2011-12-18 07:56:43 PM: Sending stats to user "Walrus"

2011-12-18 07:56:47 PM: User "Walrus" is requesting a match

2011-12-18 07:56:47 PM: User "Walrus" added to session #10

2011-12-18 07:56:47 PM: Starting session #10

2011-12-18 07:57:04 PM: Player "John" placed piece at location: (1, 5)

2011-12-18 07:57:05 PM: Player "Walrus" placed piece at location: (3, 5)

2011-12-18 07:57:06 PM: Player "John" placed piece at location: (5, 5)

2011-12-18 07:57:08 PM: Player "Walrus" placed piece at location: (3, 4)

2011-12-18 07:57:09 PM: Player "John" placed piece at location: (3, 3)

2011-12-18 07:57:16 PM: User "nitro" is requesting a match

2011-12-18 07:57:16 PM: Created session #11 for user "nitro"

2011-12-18 07:57:18 PM: User "Corey" is requesting a match

2011-12-18 07:57:19 PM: User "Corey" added to session #11

2011-12-18 07:57:19 PM: Starting session #11

2011-12-18 07:57:21 PM: Player "Corey" placed piece at location: (3, 5)

2011-12-18 07:57:23 PM: Player "nitro" placed piece at location: (5, 5)

2011-12-18 07:57:24 PM: Player "Corey" placed piece at location: (3, 4)

2011-12-18 07:57:26 PM: Player "nitro" placed piece at location: (0, 5)

2011-12-18 07:57:31 PM: Player "Walrus" placed piece at location: (4, 5)

2011-12-18 07:57:33 PM: Player "John" placed piece at location: (0, 5)

2011-12-18 07:57:35 PM: Player "Walrus" placed piece at location: (6, 5)

2011-12-18 07:57:38 PM: Player "Corey" placed piece at location: (0, 4)

2011-12-18 07:57:39 PM: Player "nitro" placed piece at location: (6, 5)

2011-12-18 07:57:40 PM: Player "Corey" placed piece at location: (6, 4)

2011-12-18 07:57:41 PM: Player "nitro" placed piece at location: (0, 3)

2011-12-18 07:58:44 PM: Player "Corey" placed piece at location: (3, 3)

2011-12-18 07:58:45 PM: Player "nitro" placed piece at location: (5, 4)

2011-12-18 07:58:46 PM: Player "Corey" placed piece at location: (3, 2)

2011-12-18 07:58:46 PM: Removing finished session #11

2011-12-18 07:58:46 PM: Sending updated stats to user "Corey"

2011-12-18 07:58:46 PM: Sending updated stats to user "nitro"

2011-12-18 07:58:46 PM: Player "Corey" won the game in session #11!

2011-12-18 07:58:53 PM: Player "John" placed piece at location: (4, 4)

2011-12-18 07:58:56 PM: Player "Walrus" placed piece at location: (2, 5)

2011-12-18 07:58:56 PM: Player "John" placed piece at location: (2, 4)

2011-12-18 07:58:58 PM: Player "Walrus" placed piece at location: (2, 3)

2011-12-18 07:58:58 PM: Player "John" placed piece at location: (2, 2)

2011-12-18 07:58:59 PM: Sending updated stats to user "John"

2011-12-18 07:58:59 PM: Removing finished session #10

2011-12-18 07:58:59 PM: Sending updated stats to user "Walrus"

2011-12-18 07:58:59 PM: Player "John" won the game in session #10!

2011-12-18 08:01:00 PM: User "nitro" timed out.

2011-12-18 08:01:06 PM: User "Walrus" timed out.

2011-12-18 08:01:07 PM: User "John" timed out.

2011-12-18 08:01:12 PM: User "Corey" timed out.