Plz help me the game of life 2-d arrays assignment in c++ language and need thre
ID: 3768458 • Letter: P
Question
Plz help me the game of life 2-d arrays assignment in c++ language and need three separate files, incudes header file, main file, client file. My program doesn't work, help me get the correct program.
Your task is to write a program that plays the game of life. This game is a computer simulation of the life and death events in a population of single-cell organisms. Each position in a two-dimensional grid (Petri dish) can support one cell. The program determines whether each position will be able to support life in the next generation.
The grid of cells is represented by a two-dimensional array. The starting grid is generation 0 and is read from a supplied input file. Most positions in the grid have 8 neighbors like the center square in a tic-tac-toe game. The four corner positions have only 3 neighbors each. The remaining positions around the edge of the grid have 5 neighbors each. The rules for the state of each position in the next generation of the grid are as follows:
If the cell is currently empty:
If the cell has exactly three living neighbors, it will come to life in the next generation.
If the cell has any other number of living neighbors, it will remain empty.
If the cell is currently living:
If the cell has one or zero living neighbors, it will die of loneliness in the next generation.
If the cell has four or more living neighbors, it will die of overcrowding in the next generation.
If the cell has two or three neighbors, it will remain living.
All births and deaths occur simultaneously. This point is critical to the correct result.
The following three webpages are also available: the data file, the correct output, and the output including intermediate generations. The last webpage is available to help you debug your code.
The data file supplies the data for generation 0. Each line of data gives a pair of coordinates (row# column#) for a living cell in the original grid. Assume that every number in the text file is between 0 and 19. All other grid positions are empty. Please name your input file "life.txt".
After your program has created the two-dimensional array that represents generation 0, your program must allow life to proceed for the number of generations specified by the user. Start with five generations. Your program should then display a grid on the screen to show the final results. Use a star (*) to represent a live cell and a space to represent a dead cell. After the grid, display the following statistical information:
The number of living cells in the entire board.
The number of living cells in row 10.
The number of living cells in column 10.
Please make sure that your output matches the correct output exactly.
Your first step will be to create a class named boolMatrix for storing and processing a two-dimensional array of bool values. The class should be saved in a specification file and an implementation file. Your client program must use this class rather than declaring its own arrays. You must not use any arrays in your client program.
You'll be defining two constants in your class, but you need to know a little bit about "static" members of classes first. With all of the class members we have used so far, each class object that the client declares has its own copy. With a "static" member, there is just one copy of the member that all objects share. Since constants don't change, it makes sense to just have one copy that all objects share. So, when you declare constants, you must make them static.
In the public area of your class you must define two public constants, NUM_ROWS AND NUM_COLS. I'll give you this code for free:
There are a few places in the descriptions of the member functions below where you are required to use "assert()". Here is a quick tutorial on using assert. First, you need to place #include at the top of your implementation file. Then you can call a function named assert(), placing a logical expression inside the parentheses. If the logical expression is true, nothing happens. If the logical expression is false, the program exits and an error message is printed. For example, your assert might look like this:
Keep in mind as you write the class that it is to be completely unrelated to the game of Life. The class should not mention anything about life, cells, neighbors, etc. The class will have exactly one private data member that is an array of bool. The class will have seven member functions:
default constructor: initialize all of the array elements to false
get: return the current contents of a single array element. Use arguments to indicate the row and column of the array element that should be returned. This function must use assert to exit the program if the row or column is out-of-bounds. You will receive a 0 on the assignment if this is not implemented.
set: set the contents of a single array element. Use arguments to indicate the row and column of the array element that should be set, and the value to which it should be set. This function must use assert to exit the program if the row or column is out-of-bounds. You will receive a 0 on the assignment if this is not implemented.
rowcount: return the number of true values that exist in any given row. This function must use assert to exit the program if the row is out-of-bounds. You will receive a 0 on the assignment if this is not implemented.
colcount: return the number of true values that exist in any given column. This function must use assert to exit the program if the column is out-of-bounds. You will receive a 0 on the assignment if this is not implemented.
totalcount: return the number of true values that exist in the entire array
print: display the contents of the array, including the row and column indices (see the posted correct output). For each element of the array, a true value must be displayed as an asterisk ("*") and a false value must be displayed as a space. This member function is the only one that displays output.
Use const to indicate const functions and unchangeable reference parameters whenever possible.
In this program, a minimum of five functions is required in addition to main(). In my solution there are seven functions besides main(). Remember our discussions about stepwise refinement, value-returning vs. void functions, and value parameters vs. reference parameters.
The only documentation required is the initial file documentation for each of the three files. Note that this means you must provide pre/post conditions in your header file.
Hints
Use iterative development.
Keep straight that the array is a data member within the class object and must be accessed accordingly.
You should definitely have a function named countNeighbors() in your client program. I'm providing that function here. Note that it calls another function named "onGrid" that you will need to provide.
Here is what I got so far
//Header file
#include
#ifndef BOOLMATRIX_H
#define BOOLMATRIX_H
const int NUM_ROWS = 20;
const int NUM_COLS = 20;
class boolMatrix
{
public: // Available for clients use.
boolMatrix();
bool get(int row, int col) const;
void set(int row, int col, bool value);
int rowCount(int row) const;
int colCount(int col) const;
int totalCount() const;
void print()const;
private: // Can only be used within the class, Client cannot call it.
bool matrix[NUM_ROWS][NUM_COLS];
};
#endif // BOOLMATRIX_H
//main file
#include
#include
#include "boolmatrix.h" // class's header file
using namespace std;
// class constructor
boolMatrix::boolMatrix()
{
for (int row = 0; row < NUM_ROWS; row++){
for (int col = 0; col < NUM_COLS; col++){
matrix[row][col] = false;
}
}
}
bool boolMatrix::get(int row, int col) const
{
return matrix[row][col];
}
void boolMatrix::set(int row, int col, bool value)
{
matrix[row][col] = value;
}
int boolMatrix::rowCount(int row) const
{
int rowtotal = 0;
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
rowtotal++;
}
}
return rowtotal;
}
int boolMatrix::colCount(int col) const
{
int colTotal = 0;
for (int row = 0; row < NUM_ROWS; row++){
if ( matrix[row][col] == true ){
colTotal++;
}
}
return colTotal;
}
int boolMatrix::totalCount() const
{
int total = 0;
for (int row = 0; row < NUM_ROWS; row++){
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
total++;
}
}
}
return total;
}
void boolMatrix::print() const
{
cout << " ";
for (int col = 0; col < NUM_COLS; col++)
{
cout << col % 10;
}
cout << endl;
for (int row = 0; row < NUM_ROWS; row++)
{
cout << setw(2) << row % 100;
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
cout << "*";
} else if ( matrix[row][col] == false ){
cout << " ";
}
}
cout << endl;
}
}
//client file
#include
#include
#include
#include "boolmatrix.h"
using namespace std;
void firstgen(boolMatrix& generation);
void getNextGen(boolMatrix& generation,int liveNeighbors,int row,int col);
void fateDeadCell(boolMatrix& generation,int liveNeighbors,int row,int col);
void fateLiveCell(boolMatrix& generation,int liveNeighbors,int row,int col);
void checkOutBounds(int row, int col, int& liveNeighbors);
void printResults(boolMatrix& generation);
int tallyLiveNeighbors(const boolMatrix& generation, int& liveNeighbors,int row,int col);
int main()
{
boolMatrix generation;
int numGen, liveNeighbors, row, col;
cout << "How many generations in total?: " << endl;
cin >> numGen;
firstgen(generation);
generation.print(); //prints first generations.
cout << "Total alive in row 10 = " << generation.rowCount(10) << endl;
cout << "Total alive in col 10 = " << generation.colCount(10) << endl;
cout << "Total alive = " << generation.totalCount() << endl << endl;
for(int count = 1; count < numGen; count++)
{
getNextGen(generation,liveNeighbors,row,col);
printResults(generation);
}
system("pause");
return 0;
}
void firstgen(boolMatrix& generation) //stores data file info into array.
{
ifstream infile("lifedata.txt");
assert(infile);
int row, col;
infile >> row >> col;
while (infile) {
generation.set(row, col, true);
infile >> row >> col;
}
infile.close();
}
void getNextGen(boolMatrix& generation,int liveNeighbors,int row,int col) //gets all subsequent generations.
{
liveNeighbors = 0;
for(int row = 0; row < NUM_ROWS; row++)
{
for(int col = 0; col < NUM_COLS; col++)
{
if(generation.get(row,col) == false){
fateDeadCell(generation,liveNeighbors,row,col);
}else if(generation.get(row,col) == true){
fateLiveCell(generation,liveNeighbors,row,col);
}
}
}
}
int tallyLiveNeighbors(boolMatrix& generation,int& liveNeighbors,int row,int col)
{
if(generation.get(row-1,col-1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row-1,col) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row-1,col+1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row,col-1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row,col+1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row+1,col-1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row+1,col)== true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}else if(generation.get(row+1,col+1) == true){
liveNeighbors++;
checkOutBounds(row, col, liveNeighbors);
}
}
void fateDeadCell(boolMatrix& generation,int liveNeighbors,int row,int col)
{
tallyLiveNeighbors(generation,liveNeighbors,row,col);
if(liveNeighbors == 3){
generation.set(row,col,true);
}else if ((liveNeighbors < 3) || (liveNeighbors > 3)){
generation.set(row,col,false);
}
}
void fateLiveCell(boolMatrix& generation,int liveNeighbors,int row,int col)
{
tallyLiveNeighbors(generation,liveNeighbors,row,col);
if((liveNeighbors <= 1) || (liveNeighbors >= 4)){
generation.set(row,col,false);
}else if((liveNeighbors == 2) || (liveNeighbors == 3)){
generation.set(row,col,true);
}
}
void checkOutBounds(int row, int col, int& liveNeighbors)
{
if(((row-1) < 0) || ((row+1) > NUM_ROWS) || ((col-1)< 0) || ((col+1) < NUM_COLS))
{
liveNeighbors--;
}
}
void printResults(boolMatrix& generation)
{
generation.print(); //prints subsequent generations
cout << "Total alive in row 10 = " << generation.rowCount(10) << endl;
cout << "Total alive in col 10 = " << generation.colCount(10) << endl;
cout << "Total alive = " << generation.totalCount() << endl << endl;
}
It doesn't work plz help me out!
Here is correct output
Explanation / Answer
Below given are the fixed files for the problem. Sample input and output is shown. Please don't forget to rate the answer if it helped. Thank you very much.
boolmatrix.h
#ifndef BOOLMATRIX_H
#define BOOLMATRIX_H
class boolMatrix
{
public: // Available for clients use.
static const int NUM_ROWS = 20;
static const int NUM_COLS = 20;
boolMatrix();
bool get(int row, int col) const;
void set(int row, int col, bool value);
int rowCount(int row) const;
int colCount(int col) const;
int totalCount() const;
void print()const;
private: // Can only be used within the class, Client cannot call it.
bool matrix[NUM_ROWS][NUM_COLS];
};
#endif // BOOLMATRIX_H
boolmatrix.cpp
#include <iostream>
#include <iomanip>
#include <cassert>
#include "boolmatrix.h" // class's header file
using namespace std;
// class constructor
boolMatrix::boolMatrix()
{
for (int row = 0; row < NUM_ROWS; row++){
for (int col = 0; col < NUM_COLS; col++){
matrix[row][col] = false;
}
}
}
bool boolMatrix::get(int row, int col) const
{
assert(row>=0 && row<NUM_ROWS && col>=0 && col<NUM_COLS);
return matrix[row][col];
}
void boolMatrix::set(int row, int col, bool value)
{
assert(row>=0 && row<NUM_ROWS && col>=0 && col<NUM_COLS);
matrix[row][col] = value;
}
int boolMatrix::rowCount(int row) const
{
assert(row>=0 && row<NUM_ROWS );
int rowtotal = 0;
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
rowtotal++;
}
}
return rowtotal;
}
int boolMatrix::colCount(int col) const
{
assert(col>=0 && col<NUM_COLS);
int colTotal = 0;
for (int row = 0; row < NUM_ROWS; row++){
if ( matrix[row][col] == true ){
colTotal++;
}
}
return colTotal;
}
int boolMatrix::totalCount() const
{
int total = 0;
for (int row = 0; row < NUM_ROWS; row++){
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
total++;
}
}
}
return total;
}
void boolMatrix::print() const
{
cout << " ";
for (int col = 0; col < NUM_COLS; col++)
{
cout << col % 10;
}
cout << endl;
for (int row = 0; row < NUM_ROWS; row++)
{
cout << setw(2) << row % 100;
for (int col = 0; col < NUM_COLS; col++){
if ( matrix[row][col] == true ){
cout << "*";
} else if ( matrix[row][col] == false ){
cout << " ";
}
}
cout << endl;
}
}
main.cpp
//client file
#include <iostream>
#include <fstream>
#include <cassert>
#include "boolmatrix.h"
using namespace std;
void firstgen(boolMatrix& generation);
void getNextGen(boolMatrix& generation,boolMatrix &nextGeneration);
void fateDeadCell(boolMatrix& generation,boolMatrix &nextGeneration,int liveNeighbors,int row,int col);
void fateLiveCell(boolMatrix& generation, boolMatrix &nextGeneration, int liveNeighbors,int row,int col);
bool checkOutBounds(int row, int col);
void printResults(boolMatrix& generation);
void tallyLiveNeighbors(const boolMatrix& generation, int& liveNeighbors,int row,int col);
int main()
{
boolMatrix generation;
int numGen, liveNeighbors, row, col;
cout << "How many generations in total?: " << endl;
cin >> numGen;
firstgen(generation);
generation.print(); //prints first generations.
cout << "Total alive in row 10 = " << generation.rowCount(10) << endl;
cout << "Total alive in col 10 = " << generation.colCount(10) << endl;
cout << "Total alive = " << generation.totalCount() << endl << endl;
for(int count = 1; count <=numGen; count++)
{
boolMatrix nextGeneration;
getNextGen(generation,nextGeneration);
printResults(nextGeneration);
generation = nextGeneration; //for next iteration the new generation becomes starting point
}
system("pause");
return 0;
}
void firstgen(boolMatrix& generation) //stores data file info into array.
{
ifstream infile("lifedata.txt");
assert(infile);
int row, col;
infile >> row >> col;
while (infile) {
generation.set(row, col, true);
infile >> row >> col;
}
infile.close();
}
void getNextGen(boolMatrix& generation,boolMatrix &nextGeneration) //gets all subsequent generations.
{
int liveNeighbors;
for(int row = 0; row < boolMatrix::NUM_ROWS; row++)
{
for(int col = 0; col < boolMatrix::NUM_ROWS; col++)
{
liveNeighbors = 0;
if(generation.get(row,col) == false){
fateDeadCell(generation,nextGeneration, liveNeighbors,row,col);
}else if(generation.get(row,col) == true){
fateLiveCell(generation,nextGeneration,liveNeighbors,row,col);
}
}
}
}
void tallyLiveNeighbors(boolMatrix& generation,int& liveNeighbors,int row,int col)
{
if(checkOutBounds(row-1, col-1) && generation.get(row-1,col-1) == true){
liveNeighbors++;
}
if(checkOutBounds(row-1, col) && generation.get(row-1,col) == true){
liveNeighbors++;
}
if(checkOutBounds(row-1,col+1) && generation.get(row-1,col+1) == true){
liveNeighbors++;
}
if( checkOutBounds(row, col-1) && generation.get(row,col-1) == true){
liveNeighbors++;
}
if(checkOutBounds(row, col+1) && generation.get(row,col+1) == true){
liveNeighbors++;
}
if(checkOutBounds(row+1, col-1) && generation.get(row+1,col-1) == true){
liveNeighbors++;
}
if(checkOutBounds(row+1, col) && generation.get(row+1,col)== true){
liveNeighbors++;
}
if(checkOutBounds(row+1, col+1) && generation.get(row+1,col+1) == true){
liveNeighbors++;
}
}
void fateDeadCell(boolMatrix& generation, boolMatrix &nextGeneration,int liveNeighbors,int row,int col)
{
tallyLiveNeighbors(generation,liveNeighbors,row,col);
if(liveNeighbors == 3){
nextGeneration.set(row,col,true);
}else {
nextGeneration.set(row,col,false);
}
}
void fateLiveCell(boolMatrix& generation,boolMatrix &nextGeneration,int liveNeighbors,int row,int col)
{
tallyLiveNeighbors(generation,liveNeighbors,row,col);
if((liveNeighbors <= 1) || (liveNeighbors >= 4)){
nextGeneration.set(row,col,false);
}else if((liveNeighbors == 2) || (liveNeighbors == 3)){
nextGeneration.set(row,col,true);
}
}
bool checkOutBounds(int row, int col)
{
if(row < 0 || row >= boolMatrix::NUM_ROWS || col< 0 || col >= boolMatrix::NUM_COLS)
{
return false;
}
else
return true;
}
void printResults(boolMatrix& generation)
{
generation.print(); //prints subsequent generations
cout << "Total alive in row 10 = " << generation.rowCount(10) << endl;
cout << "Total alive in col 10 = " << generation.colCount(10) << endl;
cout << "Total alive = " << generation.totalCount() << endl << endl;
}
input file lifedata.txt
0 0
0 5
0 9
0 19
1 6
1 14
1 16
2 4
2 7
2 11
2 14
2 15
2 16
2 18
3 2
3 5
3 9
3 10
3 17
3 19
4 0
4 3
4 5
4 9
5 2
5 3
5 5
5 15
5 16
5 17
6 5
6 6
6 10
6 11
6 13
6 14
6 17
6 18
7 6
7 8
7 14
7 16
8 1
8 5
8 8
8 10
8 17
9 3
9 4
9 6
9 7
10 0
10 9
10 19
11 1
11 2
11 3
11 5
11 7
11 8
11 14
11 17
11 19
12 4
12 5
12 6
12 8
13 0
13 1
13 7
13 10
13 11
13 14
13 15
13 16
13 17
13 18
14 2
14 11
14 13
14 15
14 17
14 19
15 11
15 13
15 18
16 1
16 2
16 5
16 8
16 17
17 5
17 6
18 6
18 16
18 18
19 0
19 3
19 4
19 7
output
How many generations in total?:
5
01234567890123456789
0* * * *
1 * * *
2 * * * *** *
3 * * ** * *
4* * * *
5 ** * ***
6 ** ** ** **
7 * * * *
8 * * * * *
9 ** **
10* * *
11 *** * ** * * *
12 *** *
13** * ** *****
14 * * * * * *
15 * * *
16 ** * * *
17 **
18 * * *
19* ** *
Total alive in row 10 = 3
Total alive in col 10 = 4
Total alive = 100
01234567890123456789
0
1 ** * **
2 ** * * * *
3 * ** *** ****
4 * * ** ** **
5 ** * * *****
6 **** ** *
7 * ** **** *
8 ** **
9 ******
10 * * *
11 *** * *** *
12* *** ** *
13 * *** *** ** **
14 * * * * *
15 ** * ***
16 **
17 *** *
18 * **
19
Total alive in row 10 = 3
Total alive in col 10 = 6
Total alive = 112
01234567890123456789
0
1 ** **
2 * * *
3 * * * * *
4 * ** * * *
5 ** * ** **** *
6 ** * *** **
7 *** ** * *
8 * **
9 * *
10 * *
11** * * * *
12* * * *** **
13*** ******** ** *
14** * ** * *
15 ** *****
16 * * * *
17 *
18 *
19
Total alive in row 10 = 2
Total alive in col 10 = 6
Total alive = 98
01234567890123456789
0
1 *
2 ****
3 ***** ** **
4 * * *** * **
5 * ** * *** *
6 *** * ***
7 ** *** ** ** *
8 * ****
9
10** * *
11** * *
12 * * * *** **
13 * ***** ** **
14 ** * * *
15*** * *** **
16 * *
17 *
18
19
Total alive in row 10 = 4
Total alive in col 10 = 3
Total alive = 95
01234567890123456789
0
1 **
2 *** ** *
3 ***** **
4 * **
5 * * ** ****
6 * **** * * * *
7 * * ****** **
8 **** **
9 **
10***
11** * * ***
12 * * * ** * ***
13 ** ** ** *
14 * **
15 * *** *** **
16 * * **
17
18
19
Total alive in row 10 = 3
Total alive in col 10 = 5
Total alive = 95
01234567890123456789
0
1 * *
2 * * *** *
3 * **** *
4 * * * **
5 * * ***** *
6 ** * * *** *
7 * *** * *
8 ****
9 * ******
10* * *
11 * * ** *
12** **** ***
13 * *** ** *
14 * * * ***
15 ** *** ** **
16 * * **
17
18
19
Total alive in row 10 = 3
Total alive in col 10 = 1
Total alive = 95
sh: pause: command not found
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.