Assignment 3: The Game of Life
Transcription
Assignment 3: The Game of Life
1 Assignment 3: The Game of Life IMPORTANT: Please read the assignment rules on the web page at http://www.ee.surrey.ac.uk/Teaching/Courses/C/rules.html and the submission procedure at http://www.ee.surrey.ac.uk/Teaching/Courses/C/submission.html BEFORE starting the assignments. The submission deadline is: • 4pm, Tuesday 26th May 2015 (altered deadline!) for all lab classes. NOTE 1: When submitting the files, you MUST follow the name specification as described in the end of each part of the assignment. Failing to follow the name specification will result in a penalty of 10 percent reduction from your final mark. NOTE 2: For each part of the assignment, submit two versions of your program to SurreyLearn: one with extension .c file and one with extension .txt (the latter is used for originality check). NOTE 3: Compile the program with the command gcc -ansi -Wall employee1.c -o employee1 and make sure to remove all warnings before submission. NOTE 4: Make sure that the output requested by the program specifications goes to stdout and all other output, debugging and user prompts, goes to stderr. Description: Your task in this assignment will be to implement the game of Life, invented by Professor John Conway. More information about the game may be obtained from the WWW page http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life which you should try out for lots of interesting information on the game of Life. The game consists of a board of varying size, where each cell can be either alive or dead at any time step. Then the next timestep is calculated according to the three following rules: 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population. 2. Any live cell with two or three live neighbours lives on to the next generation. 3. Any live cell with more than three live neighbours dies, as if by overcrowding. 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. where a neighbour is any cell that is horizontally, vertically or diagonally adjacent. Note that in each part below, any output from your program should go to stdout (using printf statements) and NOT stderr. 2 When submitting the files, you MUST follow the name specification as described in the end of each part of the assignment. Failing to follow the name specification will result in a penalty of 10 percent reduction from your final mark. 3 Part 1: Simple Life game (40 marks) The first part of the assignment is a basic implementation of Life. The initial configuration of the game will be provided in a file, and you should print the configuration of the game at each time step. Download the following input files for the first part from SurreyLearn (http://surreylearn.surrey.ac.uk) or from http://info.ee.surrey.ac.uk/Teaching/Courses/C/: block, beehive, traffic, glider and methusalah. The initial configuration specifies the number and position of cells that are initially live. The number of initially live cells is provided in the first line of the file. Then the row/column position of each live cell is provided on a separate line. So for instance the “traffic light” life form is defined by the file traffic, which contains: 3 2 1 2 2 2 3 In this case three cells are initially alive, with row/column positions as indicated. To display the life game “board” graphically you should use the primitive but effective function printf(). At each time step, including the first, print the complete board, the width and height being specified on the command line as described below. Cells outside the game board are to be considered as always “dead”. Print an ‘X’ for each live cell and a space ‘ ’ for each dead cell. Row 0 is the first row you should print, i.e. the top row. Column 0 is the left column. You should also print a border for the board, with asterisks ‘*’ at the four corners, hyphens ‘-’ along the top and bottom, and vertical lines ‘|’ (pipe symbols) along the left and right vertical borders. Note that the board width and height are excluding the border, so that the total printed width and height including the border will be width+2 and height+2. Two blank lines should be printed between the outputs for each time step. A fixed number of time steps is provided (see below), after which the program should exit, with a blank line followed by the word “Finished” by itself on a single line. So for instance, given the traffic as initial configuration, width 7 cells and height 5 cells, and three time steps, your program should output as in Fig. 1. The first board printed is the initial configuration, so four configurations are printed in total. It so happens that the “traffic” configuration is a “blinker” with a period of two, so the configuration repeats. Write your program in the file life1.c, and compile it with the command gcc -ansi -Wall life1.c -o life1 The program should take exactly four arguments on the command line, in the order file-name, width, height, generations. The maximum size for the game board will be width 78 cells and height 50 cells. So to run the program on the traffic file as above, the command line would be ./life1 traffic 7 5 3 You may find it convenient to print messages to standard error. It is also useful to be able to control the progress of the game by waiting for keyboard input at each generation. You are recommended to use fgets() for this purpose. However if you do this you should REMOVE the keyboard input source code before submitting your program. Test your program with the other initial configurations, the block, beehive, glider and methusalah life forms are provided, as described in the game description attached at the back. The block and beehive are “still-lifes”, life forms that do not change. As described above, traffic is a “blinker”, repeating itself every second generation. 4 *-------* | | | | | XXX | | | | | *-------* *-------* | | | X | | X | | X | | | *-------* *-------* | | | | | XXX | | | | | *-------* *-------* | | | X | | X | | X | | | *-------* Finished Figure 1: Program output given the traffic as initial configuration, width 7 cells and height 5 cells, and three time steps. For the glider and methusalah life-forms you will need to use a larger board, say width 70 and height 40. The glider should repeat every four generations, but also shift diagonally down and to the right at every such repeat. methusalah is a simple initial pattern that gives rise to increasingly complex patterns, before eventually stabilising. In Fig. 2 is the configuration of methusalah after 100 generations, with width/height set to 70/40 as suggested. You will find that the methusalah eventually becomes too large for the board. You are encouraged to create your own life-forms for testing. When you have thoroughly debugged and tested your program, and have written the comment blocks into the source code as described in the rules for assignments on the Web page, re-name your file according to the following specification and then submit the program to SurreyLearn. NOTE 1: The name of the submitted files MUST be proceeded with your surname and initial followed by the name of the program. For example, if your surname is “Brown”, and your first name is “Peter”, you need to name the files as follows: 5 *----------------------------------------------------------------------* | | | XXX | | X X | | X X | | X | | XX X XX | | XX X XX | | X | | XX XX | | | | XXX X XX | | X X X XX X X X | | X X X X X X | | XX X X X X XX X X | | XXXXX XX X X XX X XX | | XX XX XXX XXX | | XX XXX XX XX | | XX X | | XX XX XX X XXX | | X XX XX XX X | | XX | | XX XX | | X X XX | | X X | | XX | | | *----------------------------------------------------------------------* Figure 2: Configuration of methusalah after 100 generations, with width/height set to 70/40 as suggested. BROWNP-life1.c BROWNP-life1.txt The first part is your surname and initial followed by a hyphen, and then followed by the original filename (life1.c). If you also have middle names, ignore them in the file name. If your files do not follow this name specification, as a penalty, 10 percent will be deducted from your final mark. NOTE 2: Follow the argument list format, input format and output format accurately. Your program will not be deemed to be working unless it follows the specification given above. NOTE 3: You can assume that all arguments and input files contain valid and compatible values, so no error checking is required in this assignment. However you are recommended to test that the initial configuration does not involve setting live cells outside the specified width/height of the game board, to avoid one possible source of debugging problems. 6 Part 2: Show cell age (30 marks) Copy your program life1.c into a new file life2.c, which is to be the program to work on in the second part. You are to modify the program to show the “age” of live cells. This is done by replacing the ‘X’ symbol for live cells by a digit from ‘0’ to ‘9’ indicating the number of generations that the cell has survived since it was “born”. An age greater than 9 is indicated as before by an ‘X’. Cells are assigned an age of zero upon creation. To repeat the traffic test from part 1, run the command ./life2 traffic 7 5 3 This should produce the output in Fig. 3 *-------* | | | | | 000 | | | | | *-------* *-------* | | | 0 | | 1 | | 0 | | | *-------* *-------* | | | | | 020 | | | | | *-------* *-------* | | | 0 | | 3 | | 0 | | | *-------* Finished Figure 3: Output with cell age When you have thoroughly debugged and tested your program, and have written the comment blocks into the source code as described in the rules for assignments on the Web page, re-name your file according to the following specification and then submit the program to SurreyLearn. 7 NOTE 1: The name of the submitted files MUST be proceeded with your surname and initial followed by the name of the program. For example, if your surname is “Brown”, and your first name is “Peter”, you need to name the files as follows: BROWNP-life2.c BROWNP-life2.txt The first part is your surname and initial followed by a hyphen, and then followed by the original filename (life2.c). If you also have middle names, ignore them in the file name. If your files do not follow this name specification, as a penalty, 10 percent will be deducted from your final mark. 8 *-------* | | | | | 000 | | | | | *-------* *-------* | | | 0 | | 1 | | 0 | | | *-------* *-------* | | | | | 020 | | | | | *-------* Period detected (2): exiting Figure 4: Period detection Part 3: Detect repetitions (30 marks) Copy your program life2.c into a new file life3.c, which is to be the program to work on in the third part. You are to modify the program to detect a repetition of a previous pattern. Your program should be able to detect repeating patterns with periods of up to four generations. When such a repetition is discovered, the program should exit with a different message: Period detected (4): exiting replacing the “Finished” message, with the length of the period indicated by the number in brackets. The repeated pattern should be printed before exiting. So running the program with the traffic data file for three or more generations should produce the output in Fig. 4 When you have thoroughly debugged and tested your program, and have written the comment blocks into the source code as described in the rules for assignments on the Web page, re-name your file according to the following specification and then submit the program to both SurreyLearn. NOTE 1: The name of the submitted files MUST be proceeded with your surname and initial followed by the name of the program. For example, if your surname is “Brown”, and your first name is “Peter”, you need to name the files as follows: 9 BROWNP-life3.c BROWNP-life3.txt The first part is your surname and initial followed by a hyphen, and then followed by the original filename (life3.c). If you also have middle names, ignore them in the file name. If your files do not follow this name specification, as a penalty, 10 percent will be deducted from your final mark.