CS1101C Practical Exam

Session 5 (1000 - 1145 hours)

Tetris Square Blocks

The name of your C program file must be called squares.c, files with any other name will not be marked.

The deadline for this lab is Wednesday 22 November 2006, 11:45:59 hours. Strictly no submissions will be accepted after the deadline.

Background

Tetris is a game where players try to drop blocks in order to form complete lines. To keep things simple, we will merely be dropping square shaped blocks. If the blocks form a complete line, we will remove those lines and the blocks above will fall accordingly.

Playing Area

The game occurs in a playing area of 16 rows and 10 columns. Square blocks are dropped from the top of the playing area and they will fall down due to gravity until they land on the floor or on another block. Square blocks can be stacked up in this way to form interesting patterns.

Position

Each square block can also be dropped at a particular position according to the column number. The leftmost column is column 0, and the rightmost column is column 9. Placing a square block at column n means that the leftmost block of the square block is at column n.

Here are some examples showing the position (column number) of a square block, starting from an empty playing area. We use “.” (full-stop) to represent an empty square, and “O” (capital-O) to represent a block.

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .  Column 0
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .  Column 8
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . O O
O O . . . . . . O O

Stacking

When part of one block lands on another block, it remains in that position. There is never any danger of blocks toppling over, and parts of blocks can hang in mid-air. Here is a simple example of two blocks stacked on one another. Continuing from the above example:

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .  Column 0
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . O O
O O . . . . . . O O

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .  Column 7
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . O O .
O O . . . . . O O .
O O . . . . . . O O
O O . . . . . . O O

Clearing Lines

Suppose the playing area layout is as shown below:

O O . . . . . O O .
O O . . . . . O O .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O

And a new block is dropped at column 2:

O O . . . . . O O .
O O . . . . . O O .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .  Column 2
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O O O O O O O O O
O O O O O O O O O O

Notice that the placement of the last block forms two completed rows, i.e. the bottom two rows are now full of blocks. Such completed rows are removed, and all the blocks above will drop accordingly. Blocks below completed rows are not affected in any way.

If there is only one completed row, then all blocks above will drop down by exactly one square. If there are two completed rows, then all blocks above will drop down by exactly two squares.

After removing the completed rows and dropping the affected blocks, the following is the new layout:

. . . . . . . . . .
. . . . . . . . . .
O O . . . . . O O .
O O . . . . . O O .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .

If there are any rows removed, the movement causes the bonds between all blocks to be loosened, and all blocks hanging in mid-air will now fall due to gravity, producing the following:

. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O O . .
O O . . . O O O . .
O O . . . O O O O .
O O . . . O O O O .
O O . . O O O O O .
O O . . O O O O O .

This might form further completed rows, which must all be removed, causing the blocks above to drop down.

In summary:

  1. Whenever a block is placed, if it forms any completed rows, the completed rows must be removed.
  2. Then all blocks above the completed rows must be moved down accordingly.
  3. This causes all blocks hanging in mid-air to break free from the adjacent blocks and drop down.
  4. This might form further completed rows, which must all be removed, causing the blocks above to drop down.

Objective

Initially, the playing area is a empty. The objective of your program is to read in a text file. Each line contains the position (column number) of where to drop a square block. Keep stacking the square blocks as they are dropped, and show the layout of the playing area after each square block is dropped as well as the column of the square block and the number of rows cleared.

Text File

Your program must read in a text file called squares1.txt which has been copied into your directory by the pesetup command. Each line contains one integer: the position (column number) of the square block to be dropped. The following is a sample text file.

0
8
6
4
7
6
5
4
5
6
7
0
0
0
0
0
0
0
2

The above shows that the first square block is to be dropped at column 0; the second square block to be dropped at column 8, and so on. No error checking is required; you may assume that the column numbers always keep the entire square block within the playing area. You may also assume that we will not put too many square blocks such that they overflow from the top of the playing area.

We will test your program with other text files.

Sample Run 1

The following shows a sample run when using the file squares1.txt as shown above. For each block that is dropped, show the layout of the playing area followed by the column number of the square block and the number of rows cleared.

Follow the sample run exactly or you will lose marks for the test cases.

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
Square at column 0, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . O O
O O . . . . . . O O
Square at column 8, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . O O O O
O O . . . . O O O O
Square at column 6, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . O O O O O O
O O . . O O O O O O
Square at column 4, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 7, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 6, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 5, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 4, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 5, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 6, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
. . . . . . . O O .
. . . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 7, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
. . . . . . O O . .
. . . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
. . . . . O O . . .
. . . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
. . . . O O . . . .
. . . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
. . . . . O O . . .
. . . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
. . . . . . O O . .
. . . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . O O .
. . . . . . . O O .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

O O . . . . . O O .
O O . . . . . O O .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O . . .
O O . . . O O . . .
O O . . O O . . . .
O O . . O O . . . .
O O . . . O O . . .
O O . . . O O . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . . . O O .
O O . . . . . O O .
O O . . O O O O O O
O O . . O O O O O O
Square at column 0, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
O O . . . . O O . .
O O . . . . O O . .
O O . . . O O O . .
O O . . . O O O . .
O O . . . O O O O .
O O . . . O O O O .
O O . . O O O O O .
O O . . O O O O O .
Square at column 2, rows cleared: 2

Sample Run 2

The following shows a sample run when using the file squares2.txt (which has also been copied into your directory by the pesetup command) as shown below.

0
3
6
1
4
7
2
5
8
0
2
4
6
8
0

Follow the sample run exactly or you will lose marks for the test cases.

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . . . . . . . .
O O . . . . . . . .
Square at column 0, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . O O . . . . .
O O . O O . . . . .
Square at column 3, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O . O O . O O . .
O O . O O . O O . .
Square at column 6, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. O O . . . . . . .
. O O . . . . . . .
O O . O O . O O . .
O O . O O . O O . .
Square at column 1, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. O O . O O . . . .
. O O . O O . . . .
O O . O O . O O . .
O O . O O . O O . .
Square at column 4, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 7, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O . . . . . .
. . O O . . . . . .
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 2, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O . O O . . .
. . O O . O O . . .
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 5, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O . O O . O O
. . O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 8, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
O O O O . O O . O O
O O O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 0, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O . . . . . .
. . O O . . . . . .
O O O O . O O . O O
O O O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 2, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O O O . . . .
. . O O O O . . . .
O O O O . O O . O O
O O O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 4, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O O O O O . .
. . O O O O O O . .
O O O O . O O . O O
O O O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 6, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . O O O O O O O O
. . O O O O O O O O
O O O O . O O . O O
O O O O . O O . O O
. O O . O O . O O .
. O O . O O . O O .
O O . O O . O O . .
O O . O O . O O . .
Square at column 8, rows cleared: 0

. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. O . . . . . . . .
. O . . . . . . . .
O O O O O O O O O .
O O O O O O O O O .
Square at column 0, rows cleared: 4

Remember to submit your program using the submit squares.c command, and check your submission using the check command.

All the best!

UNIX commands

Some useful UNIX commands (in case you forgot what you did in Lab 0):

  1. dir”: lists all the files in the directory.
  2. cp a.txt b.txt”: copies a.txt to b.txt.
  3. mv a.txt b.txt”: moves / renames a.txt to b.txt.
  4. cat a.txt”: shows the contents of a.txt.