I made this game in college with three fellow students (Dirk Hellemans, Jonas De Meulenaere and Kristof Depypere) as a project for a software development course. It was programmed in Java with a strong focus on extensibility, reusability and adaptability. The user interface was kept very simple (only non-animated 2D bitmaps were used), the assignment was to write the game code as Object Oriented as possible.
We used the Unified (software development) Process and we iterated over two software cycles for this project. At the start we were given a number of requirements and features that had to be in our game and after the first software cycle we were given additional requirements and changes that had to be made to the original requirements.
During the analysis and design we used several principles and disciplines and created Use Case Diagrams, System Sequence Diagrams, Collaboration Diagrams, a Glossary, a Domain Model, a Class Diagram, a list of used Design Patterns as well as a complete Java Documentation.
This is definitely the project where I learned most about Object Oriented software design and in almost every project I've worked on since, I was able to use what I learned from this project.
At the start you can choose to play with a knight or a wizard. The knight is the typical tough character while the wizard can walk through walls and thus avoid having to fight. You have to find your way through a dungeon consisting of several floors, each consisting of a large number of areas. An area can be a wall, a ladder, a hatch, a transporter that will transport you to a random location in the dungeon, secret passageways through walls, lava pits, etc.
There are several level types, in the first level you have to find the exit within a given amount of time, while in later levels you have to kill all enemies or rescue a princess. There are a number of enemy types and NPC's walking around and they all have different constraints on what they can do. Some can follow you up and down ladders, some can also use the secret passageways and some change the area types (e.g: a dwarven miner digs lava holes).
I did most of the dungeon representation, including the different area types and the corresponding constraints of which character types can stand on a given area type. I also wrote a random maze generator, probably the best algorithm I've ever written. And last but not least I programmed the entire user interface using Java Swing.