Executive Summary - (Merrick Johnson)
Description of the
business and application
Merrick, Inc. is a software company (imagined for the
purpose of this project) whose employees routinely perform tasks that are
essential and must be performed correctly, but are somewhat tedious. The
managers of Merrick, Inc. have noticed that after long periods of time
performing these tedious tasks, more mistakes are made as the employees become
bored and sleepy. To promote a more interesting and productive work
environment, the managers want to create a program that will break the monotony
but also emphasize attention to detail and the negative results of mistakes.
Minesweeper is an obvious choice to fill this need, as it
requires attention to detail, but is still strangely entertaining, and subtly
teaches the consequences of mistakes (an explosive going off). Minesweeper is
also an excellent choice to solve this problem because it is a relatively
simple game to learn and only lasts a few minutes. However, due to possible
copyright and licensing issues, the company must program the game in Excel
itself.
Overview of the
Minesweeper functionality
When the ‘New Game’ button is clicked, a subroutine executes
which does everything necessary to prepare a minesweeper game for the
user. A 16 x 30 grid is created on the
Excel spreadsheet, and mines are randomly assigned to an average of one-seventh
of the squares in the grid. The font color and background color of the cells in
the grid are then changed so that the user knows which cells have not been
selected, and to hide the value assigned to the square. A total is also kept of
how many mines there are, as well as how many squares the user has marked as
mines. The objective of Minesweeper is to correctly detect and mark all of the
mines without making a mistake and blowing up.
To play, the user selects cells in the grid. By selecting a
cell, the user is guessing that the cell does not contain a mine. If the cell
selected is a mine, then the game is lost and a message box is displayed to
this effect. If the cell selected is not a mine, then a number is displayed in that
cell indicating how many of the eight adjacent cells contain mines. If this
number is zero, then this process is automatically repeated for all of the
contiguous cells that do not contain mines (saving time for the user).
A game of Minesweeper in progress
If the user suspects that a certain cell contains a mine, then
this cell should be marked in red to show that it is suspected to be a mine. To
mark cells in red, the user first clicks the ‘Toggle Mode’ button. When this
button is clicked, the background color of the spreadsheet changes to red to
show that the user is currently marking mines, instead of selecting cells that
are not mines. While the background is red, any cells selected will be marked
as mines. This effect lasts until the
‘Toggle Mode’ button is clicked again, at which point the user again selects
cells that do not contain mines.
When ‘Toggle Mode’ is clicked, the red background reminds the user that
he is currently marking mines
If the user correctly marks all of the mines in the minefield,
then a congratulatory message box is displayed, and the game is over. In a
normal game of minesweeper, the game would also end automatically upon clicking
a cell that contains a mine. However, one of the frustrations of minesweeper is
that occasionally the user has to guess. To solve this problem and to give my
implementation of minesweeper a more personal touch, I decided to let the user
continue playing after messing up (if they want to). This way, if a random
guess (such as at the beginning of the game) results in a mine, the user
does not have to start over, but can pretend that they guessed right.
Implementation
Documentation
- Two-dimensional arrays are used to keep track of which squares contain mines, as well as to keep track of which cells have already been selected and checked for mines, which prevents infinite loops from occurring.
- Nested loops are used frequently to iterate through the grid and the arrays in order to perform various tasks.
- Nested conditional statements are used extensively in order to make sure that subroutines are only called for cells in the grid rather than the entire worksheet, and to make sure that the event handler only fires when cells in the grid are selected.
- Message boxes are used to notify the user when they win or lose the game.
- Properties of cells are manipulated constantly – when a cell is selected or marked, the background color is changed to either hide or display the number associated with the cell.
- Event handling, specifically the SelectionChange event, is used. Every time the user selects a new cell, the event handler calls the subroutines necessary to check for mines, display numbers, etc.
- Multiple subroutines and functions are used to divide the code for the game into manageable sections and to return necessary values when needed.
- Module-level variables are used to allow all subroutines and functions to easily access the values they need, rather than having to pass a long list of parameters to every subroutine.
- Recursion is used when a selected cell is not next to any mines. When this happens, the subroutine that checks for mines calls itself for every cell adjacent to it so that the user doesn’t have to.
- Custom Ribbons are available if the user desires to use them, although they are unnecessary since the buttons on the spreadsheet perform the same functions and are more conveniently located.
What I Learned /
Difficulties Encountered
In completing this project I learned several things. The
most important thing I learned was how to apply the principles that we learned
in class to a new, more complicated problem, and also how to use multiple
principles together. For example, I used conditional statements within an event
handler to only allow the event handler to perform the relevant operations
under certain conditions, rather than every time the event fired.
I learned that it is important to write larger programs in
small, testable portions so that debugging is easier. I also learned the
importance of carefully planning how the index variables of loops work so that
infinite loops can be avoided.
One difficulty I ran into was choosing which event handlers
to use. I was hoping to use a Click event, but as far as I could tell, there is
no Click event handler; there are Right-Click and Double-Click events instead,
neither of which would be convenient enough to use as the main action the user
performs. After some searching I found that the SelectionChange event, which
fires every time the selection on the worksheet is changed, and I decided that
that was as close to a Click event as I could get.
The only feature I wanted to include but was unable to do
so, was that I wanted an explosion sound file to be played when the user selects
a mine and loses the game. I was able to find a way to do so by searching
online, but I decided that implementing this feature would be impractical,
since it would require that the user have the same sound file as me, which I
cannot guarantee easily.
Assistance
I did not receive substantial help from anyone on this
project.
No comments:
Post a Comment