TicTacGo - An Intro to Golang

Keywords: #Go

Introduction

I am a true beginner to the Go Programming Language and to solidify some of the basics I have acquired I set out on creating a naughts and crosses (tic-tac-toe) server as an introductory project. You can find the project on my Github here.

Board

Board is the struct I created to contain the current board state, the grid but more accurately the state contains the 9 cells in the grid and their contents. At a given point, I cell on the grid can either contain nothing, “O” or “X”, where the latter two represent a naught and a cross respectively. The struct contains only one attribute: Squares, of type [9]string. However, the Board struct has several related methods:

  • DrawBoard() string :: returns a string which contains the HTML representation of the board.
  • Reset() :: resets the board to an empty state.
  • CheckLegal(i int) bool :: checks if a given move is legal in the current state (i.e. if the move correlates to an actual cell in the grid and that cell is empty).
  • CheckWin(x string) bool :: where x should be “O” or “X”, checks to see if the given player is in a winning state.

The API

The net/http package (see docs here) provides a very convenient way of creating an API. Creating the endpoints is as simple as writing a handler function for the endpoint and then assigning that function to an endpoint. Then serve the API using the http.ListenAndServe function. See below for a bare-bones but complete example of a net/http API.

// Example net/http API
package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Here is a response!")
}

func main(){
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

In TicTacGo, I use the API to register moves made by players. Specifically I have use a handler on the root endpoint / called makeMove. makeMove retrieves the player’s move from the path using r.URL.Path where r is passed to the handler function as an *http.Request. This is an impractical way to accept URL arguments and is far from standard but it is also not a concern for the tiny scope of this project. makeMove follows the following steps:

  1. Accesses player’s move from path.
  2. Checks the move is legal (if it isn’t no move is made and the input is ignored).
  3. Makes the move by updating the Squares attribute of the Board struct with the appropriate character (“O” or “X”).
  4. Checks for a win condition; if there a player has won than it sends a message to say so before resetting the Board with Reset(); else it waits for the next move.

By using the URL as a way for the player to make moves it allows me to embed buttons within the HTML representation of the board. This means that when the player clicks on the top-right cell on the board, the server will register their move with that cell.

TicTacGo Board HTML Screenshot
TicTacGo Board HTML Screenshot

I hope you enjoyed reading this blog post! Sign up to my newsletter here: