CS 0447 Computer Organization and Assembly Language
Midterm Project - Connect 4
Introduction
In this project, you will implement a 2 player game in MIPS assembly: Connect 4 aka Four-in-line. The game consists aboard representing the play area. Two players face each other and drop tokens, one at a time, until one of them manages to place four in line!
Start early
The deadline will approach fast! Life happens, sickness happens, so if you start early, you can minimize the impact. Do a little bit everyday! 1 hour everyday! 30 minutes everyday! SOMETHING!
Game mechanic
The game works like this:
1. Initially, the players have a blank board
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
2. Player 1 takes the first turn
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
3. When a valid number is input, a token is placed in that column, at the first (lowest) free position.
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|*|_|_|_|_|_|
4. Next, it’s player 2 turn.
Player 2, it's your turn.
Select a column to play. Must be between 0 and 6
5. The game ends when one of the players manages to place 4 tokens in a horizontal, vertical, or diagonal line.
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|*|_|_|_|_|_|_|
|_|*|_|_|_|_|_|
|_|_|*|_|_|_|_|
|_|_|_|*|_|_|_|
Congratulations player 1. You won!
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|*|_|_|_|
|_|_|*|_|_|_|_|
|_|*|_|_|_|_|_|
|*|_|_|_|_|_|_|
Congratulations player 1. You won!
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|_|+|+|+|+|_|_|
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
Congratulations player 2. You won!
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|+|_|_|_|_|_|
|_|+|_|_|_|_|_|
|_|+|_|_|_|_|_|
|_|+|_|_|_|_|_|
|_|_|_|_|_|_|_|
Congratulations player 2. You won!
Your assignment
Plan
Plan your implementation which includes data structures you are planning to use, user inputs that maybe invalid and you need to account for, etc.
1. Think of which functions you will need to implement, and what they will do.
1) Start from the main function and split your program into multiple steps.
2) This plan is not going to beenforced, but it should be thought through.
2. Think of possible invalid user inputs, and how they will impact the program negatively.
1) Board bounds.
2) Filling a column to the top.
Implement
Implement the MIPS assembly code that executes the game described above. Your program will manage all interactions with the user and the board:
1. It begins by displaying a welcome message and an explanation of what the user should do. How is the game played?
2. Print the empty board.
3. Then, the game begins, and your program will:
1) Ask player 1 to play:
Ask and validate user input (MARS will crash if the user gives no input or a letter, this is fine!)
Don’tallow the user to select anon-existing tile.
Don’tallow the user to select a full column.
“Drop” the token into the board at the requested column.
Check for a winning condition.
2) Ask player 2 to play:
Ask and validate user input (MARS will crash if the user gives no input or a letter, this is fine!)
Don’tallow the user to select anon-existing tile!
Don’tallow the user to select a full column!
“Drop” the token into the board at the requested column.
Check for a winning condition.
3) Repeat until one of the players winsor the board is full.
4. In the end, print a message letting the winning player know the game has ended.
The welcome message
Bear in mind that you do your own thing, as long as it fits the project! So use the welcome message to explain to the user exactly how it should play the game. Explain the rules,and how the player can score points.
User input
Your program needs to ask the user in which column he/she wants to drop a token. If the user inputs an invalid value, you inform the user of that and ask again.
You must validate the user input! The exact way you implement this is up to you. You must ask the user to input something to select the column.
Representing the board
Feel free to implement all data structures that you need. However, it is suggested you’d better use matrices. You can implement your board as a matrix of words to keep the status of the game. Here is one suggestion:
board: .word
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0
Note: The board refers only to the contents of the board, not the frame around the tiles! The frame. is always the same, it doesn’t need to be stored anywhere! If you include the frame, it’ll make your life harder!
For the status of each tile, it is suggested to create a matrix of 0s (empty) 1s (player 1 tokens), and 2s (player 2 tokens). When you want to print each tile, you simply need to check the status matrix to know if the tile was revealed.
if(board[i][j] == 0) { print('_') }
else if(board[i][j] == 1) { print('*') }
else { print('+') }
Check the example below:
The board - this is what you draw:
0 1 2 3 4 5 6
|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|
|*|_|_|_|_|_|_|
|*|*|_|_|_|_|_|
|+|*|*|_|_|_|_|
|+|+|+|*|+|_|_|
The matrix representing the board - contains 1sfor player 1, and 2 player 2:
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 0,
2, 1, 1, 0, 0, 0, 0,
2, 2, 2, 1, 2, 0, 0