Computer Programming - Billy Hamilton

Fish Invaders


Screenshot: hundreds of fish swarm towards the screen

Repel the Icthyoid Swarm!

I wrote this game as a final project for CS 409, a class in programming realtime interactive entertainment systems (i.e., 3D graphical video games). The final project was supposed to build on the earlier assignments, which had all revolved around using a submarine to explore an underwater environment. But for my project, I decided to turn the game into something more like a 3D variant on Space Invaders.


In the game, (evil extraterrestrial) fish appear in the distance and fly towards the screen. The player must manoeuvre a (flying) submarine to shoot them before they arrive. The submarine moves up, down, left, and right on a flat plane in the foreground. If the player shoots enough fish, the game advances to the next level.

The player's main weapon is a "fish annihilating torpedo." Each fish destroyed by the torpedo creates a small explosion, which can in turn destroy more fish, leading to a chain reaction. The player can also launch a limited number of "atomic sharks," which hunt down fish on their own.

On the first level, the fish fly lazily towards the screen in large groups. As the game goes on, their behaviour changes. They begin flying in spiralling or erratic patterns, making them harder to hit. They sometimes appear in many small groups flying in different directions, or in a continuous swarm.

Technical Features

Black-and-White Ray Tracer


Geometry reflected on curved mirrors

I wrote this ray tracer as a project for CS 405, a class on computer graphics. The program uses vector calculations to simulate the reflection of light rays off geometric objects. The output image is based on the quantity of light hitting each pixel of the image plane.

Volumetric Rendering


A 3D volumetric model of a human skull

This was another assignment for CS 405. The program renders a 3D image based on volumetric density data derived from a CT scan. The basic approach is again based on ray tracing.

The program is designed to allow different parts of the image to be emphasized based on the density data. In the image shown above, the skull (high density) is clearly visible, while the skin (low density) is nearly transparent.

Harry Potter Duelling Simulator


A console window with text describing the effects of spells

You miscast Obliviate. The spell backfires! You forget how to cast Obliviate!

This is a text-based game I made in my spare time, just for fun. I wanted to capture the hectic atmosphere of the wizards' duels described in the Harry Potter books, while still allowing some level of strategy. The game started very simple, but grew gradually more complex as I added more spells, characters, and game modes.

The most interesting mode is the "Long Game," in which you start as a weak student with a single spell and must duel a series of ever-more-difficult opponents without being defeated. After each victory, you gain experience points which can be spent to improve your attributes or learn more spells.

Greek Mythology Roguelike

2011 (incomplete)

A figure in hoplite armour flees from a porcupine.

This was my first big project in C++. I was inspired by games like Rogue, Nethack, and Dungeon Crawl, but decided to make a game with a focus on exploring an outdoor environment, rather than an underground dungeon. Whenever the player reaches the edge of the map, a new area of a different terrain type is randomly generated ("The fog parts before you."). My plan was to draw on Greek Mythology, with realms belonging to different gods and goddesses, but I never got to the point of implementing the mythological elements in the game.

I spent most of a summer working on this game. The graphical display uses OpenGL. I implemented a movement and exploration system, several random map generators, an inventory system, a combat system with statistics for different characters, an event scheduling system, and a user interface with several menus. I also drew the tile images for the characters and terrain.

By the time I stopped working on the game, it was clear that some of my initial design decisions were leading the code to become unwieldy and difficult to work on. If I were ever to return to this project, I would want to scrap most of the code and start over. Still, I learned a lot about object-oriented programming from the experience.