Final Project
Miensfeld

Due: 7 May 2010

In the last several homeworks we have done a few mini-projects where I have done most of the top down, modular design and some (increasingly less) of the module implementation for you. Now it is your turn. In this project I only give you the specification for what the program must do. It is up to you break the problem down into "bite-size" modules, decide what data structures and functions you will need for these modules, and implement them. You should also create your own makefile for compiling your program. As with the previous homeworks, this is a team project, with one set of files submitted per team.

Miensfeld - the Spec

The program you will design and build implements a game called Miensfeld. This is a one player game (you against the computer) using a "fancy" display, similar to the Calculator.

In Miensfeld, your player, Timmy, is located on one side of a 8 by 10 cell area minefield. Your task is to move Timmy safely through the minefield to get to the other side, earning points as you move.


                          o |   |   |   |   |   |   |   |   |
                          Y |S 1|   |   |   |   |   |   |   |        MINES
                         ---|---|---|---|---|---|---|---|---|---           
                            |   |   |   |   |   |   |   |   |        |    | 
                         S  |S 2|   |   |   |   |   |   |   |        |    | 
                         ---|---|---|---|---|---|---|---|---|---
                            |   |   |   |   |   |   |   |   |
                         S  |   |   |   |   |   |   |   |   |
                         ---|---|---|---|---|---|---|---|---|-       FLAGS
                            |   |   |   |   |   |   |   |   |              
                         S  |S 1|S 1|   |   |   |   |   |   |        |    | 
                         ---|---|---|---|---|---|---|---|---|---     |    | 
                            |   |   |   |   |   |   |   |   |
                         S  |S  |S  |   |   |   |   |   |   |
                         ---|---|---|---|---|---|---|---|---|---
                            |   |   |   |   |   |   |   |   |        SCORE
                         S  |S  |S  |   |   |   |   |   |   |        _    _
                         ---|---|---|---|---|---|---|---|---|---    | |  | |
                            |   |   |   |   |   |   |   |   |       |_|  |_|
                         S  |S  |   |   |   |   |   |   |   |
                         ---|---|---|---|---|---|---|---|---|---
                            |   |   |   |   |   |   |   |   |
                         S  |S  |S  |   |   |   |   |   |   |

Moving Around

To move about in the minefield, you use the keyboard. You can move Timmy in any of the 8 directions from his current position by using the 8 keys surrounding the 'j' key:

                                y | u | i
                                --|---|--
                                h |   | k
                                --|---|--
                                n | m | ,

As Timmy moves through the field, he indicates safe cells (cells known to not contain a mine) on his map.

Detecting Mines

To help Timmy find his way through the mines, he is equipped with a "proximity probe" which tells him how many mines there are in the 8 cells surrounding him (today's modern Army has all the coolest gadgets). Unfortunately, the probe cannot tell him where those mines are, just how many.

Planting Flags

However, Timmy is also equipped with a limited number of hi-tech indicating flags to use to indicate cells to avoid by others behind him. He may plant a flag (using the keyboard) in any of the 8 surrounding cells when he suspects there is mine there. The keys to plant a flag are the shifted versions of the movement keys:

                                Y | U | I
                                --|---|--
                                H |   | K
                                --|---|--
                                N | M | <

When planted, the flag will indicate whether there is a mine there or not.

Earning Points

Timmy earns 1 point for each new safe cell he finds by moving into it. In addition, he earns 2 points for each flag he plants correctly in a cell that contains a mine. However, he loses 1 point for each flag he plants in a cell that does not contain a mine.

If Timmy successfully makes it to the other side of the minefield, he earns a bonus of 10 points.

The game ends when Timmy either reaches the other side of the field :-), or gets blown up by stepping on a mine :-(.

Field Set-up

When the game begins, the computer randomly places a number of mines in the field and issues Timmy the same number of flags (how many mines and flags to place is explained below). In addition, some of Timmy's predecessors have already mapped some of the safe cells in the field. The number of known safe cells is a random amount, however, it will never exceed 20 cells. These known safe cells (for which there are no points) are always as far to the left of the field, and always adjacent to other safe cells in the same row or the left boundary of the field.

The number of mines in the field is determined by the level of difficulty the user chooses to play. The levels are:
Level Number of Mines Number of Flags
Easy 6 6
Moderate 11 11
Hard 16 16
Impossible 20 20
The player may choose to play the game as many times as they want (with new minefields and Timmy's each time) At the beginning of each game, Timmy starts in the upper left cell of the field.

Implementation Hints and Help

You should think about this project before you attempt to write any code.

USE THE FIVE STEP DESIGN PROCESS

Then you should begin tackling the modules one by one; writing the algorithms for the functions and then coding them in C and testing them. Remember to develop and test your program incrementally like we did for the calculator - using your own "throw away" drivers to test. (You may turn these in, and we MAY look at them, but we are primarily interested in the final product).

One of the more difficult modules to implement in this program is the display module. So, I will join your software team and help you write that module. You will find a header file with the prototypes of the functions I provide in:


            ~ee160/Code.lect/Miensfeld/display.h

With the object module containing the code in

            ~ee160/Code.lect/Miensfeld/display.o

You will also find a sample executable in that directory to see how the game should work.

There are several different approaches to the implementation of this game. Most of the C things you will need we have already been covered (and a few others will be covered soon).

START RIGHT AWAY.

This is a significant project; comparable in size to the calculator. You have about 4 weeks to complete it. With the REQUIRED 6 hours per week per member of your team outside of class, plus the lab times during the last partial week of the semester, there should be plenty of time to complete this project. However, DO NOT WAIT TILL THE LAST WEEK or you will not get it done. NO LATE PROJECTS WILL BE ACCEPTED. Starting early will also give you time to experiment and try different approaches. Don't be afraid to abandon a working module for a better, more modular, approach.

DOCUMENT EARLY AND OFTEN.

A significant part of the grade for this project is based on your style and documentation. Writing your code properly formatted and commented with the steps of your algorithm from the beginning will save you a lot of time in the end.

START SMALL AND BUILD UP.

The project is rather "under-specified". There are many additional features and capabilities you can add, and some "reasonable" engineering decisions you will need to make, however, these are considered "Frills" (including robustness), and not worth as much as a well organized, formatted and documented program that compiles and meets the basics of the spec.

What You Turn In

You will submit ONE copy of all of the files for this project per team all at one time. So transfer the version of your files your team wants to submit to your coordinator for this assignment, and the coordinator will send them in. I recommend the coordinator put all the files for this problem in a separate Project directory. (It might be a good idea to compile and test them one last time before sending them in to make sure they work). Please DO NOT send different files from different members - we do not want to hunt around to find all of your team's programs. Use the "grade" command to turn in all of the .c and .h files and the makefile needed to compile your program (we will simply run "make" to compile your project) Your grade command will look something like the following:

If you are in Section 001, use:

            grade -5s1,ee160 *.c *.h makefile
If you are in Section 002 use:
            grade -5s2,ee160 *.c *.h makefile
If you are in Section 003 use:
            grade -5s3,ee160 *.c *.h makefile
If you are in Section 004 use:
            grade -5s4,ee160 *.c *.h makefile
If you are in Section 005 use:
            grade -5s5,ee160 *.c *.h makefile
You should verify that you turned in things successfully, which you can do with the command (which simply leaves the file names off from the previous command).
            grade -5s1,ee160
 
            OR
 
            grade -5s2,ee160
 
            OR
 
            grade -5s3,ee160

            OR
 
            grade -5s4,ee160

            OR
 
            grade -5s5,ee160

NOTE: after the files are prepared for grading, you will no longer be able to see your file listing using the above command.

In addition, as with previous homeworks, each member of the team should send me a confidential email evaluating the effort of the team using the rating form provided. You MUST include comments at the end of the form describing what parts of the programs where done by each member of the team, including yourself, and an assessment of how teamwork was used to complete this assignment. This evaluation WILL be used to adjust the individual homework grades for your project. Your evaluation is due at the same time as the assignment. NO LATE EVALUATIONS WILL BE ACCEPTED. If you do not email your eval on time, your homework grades will be adjusted based on your teammates' inputs and your voice will not be heard. In addition, your individual score will receive an automatic 10 point penalty for not turning in the eval. Remember, this project is 10% of your course grade.

As usual, should you have any questions just send mail or stop by and see me or the TA.