C++ NEED HELP fixing my program. need help creating 2 extra seperate patterns. i
ID: 3865630 • Letter: C
Question
C++
NEED HELP fixing my program. need help creating 2 extra seperate patterns. i created one with a U pattern. need help creating 2 more.
MY WORK
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <conio.h> //kbhit()
#include <windows.h> //Sleep()
using namespace std;
//=============================Global Variables==============================
const int MAX_COL = 80;
const int MAX_ROW = 40;
const int SLEEP_TIME = 800;
//stringstream string_to_int; //Used for converting strings to ints
//=============================Functions=====================================
void displayMenu()
{
cout << "[P]lay Press 'P' to play." << endl;
cout << "[Q]uit Press 'Q' to exit." << endl;
cout << "S[a]ve Press 'A' to Save." << endl;
cout << "Load [1], [2], or [3] to load and display a saved pattern." << endl;
cout << "[I]intial press 'I' to see the initial pattern." << endl;
cout << "[T] Press 't' to make your own custom pattern." << endl;
cout << "[C]lear press 'C' to clear the pattern." << endl;
}
void setZeroArray (char (&tempArray)[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
tempArray[i][j] = '.';
}
}
}
int setNextGenArrayHelper(char currentArray[MAX_ROW][MAX_COL], int row, int column)
{
int count=0;
//upper left corner
if(row==0 && column==0)
{
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
//lower left corner
if(row==(MAX_ROW-1) && column==0)
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
return count;
}
//upper right corner
if(row==0 && column==(MAX_COL-1))
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
return count;
}
//lower right corner
if(row==(MAX_ROW-1) && column==(MAX_COL-1))
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
return count;
}
//top side
if(row==0)
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
return count;
}
//bottom side
if(row==(MAX_ROW-1))
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row-1][column]=='O')
count++;
return count;
}
//left side
if(column==0)
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
//right side
if(column==(MAX_COL-1))
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
return count;
}
//middle
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
void setNextGenArray(char (&tempArray)[MAX_ROW][MAX_COL], char currentArray[MAX_ROW][MAX_COL])
{
int neighborNum=0;
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
neighborNum = setNextGenArrayHelper(currentArray,i,j);
if(neighborNum<2 || neighborNum>3)
tempArray[i][j]= '.';
else if(neighborNum==3)
tempArray[i][j] = 'O';
else
tempArray[i][j] = currentArray[i][j];
}
}
}
void copyArray(char tempArray[MAX_ROW][MAX_COL], char (¤tArray)[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
currentArray[i][j] = tempArray[i][j];
}
}
}
void displayArray (char arr[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
void setInitialPatternArray(char (&tempArray)[MAX_ROW][MAX_COL])
{
int temprow = rand() % 10 + 1;
int tempcol = rand() % 10 + 1;
for(int i=temprow;i<temprow+6;i++)
{
tempArray[i][tempcol] = 'O';
tempArray[i][tempcol+6] = 'O';
}
for(int i=tempcol;i<tempcol+6;i++)
{
tempArray[temprow+5][i] = 'O';
}
}
//===========================Main Code=======================================
int main()
{
char currentArray[MAX_ROW][MAX_COL];
char tempArray[MAX_ROW][MAX_COL];
char choice;
bool char_in;
do{
//initial state of the board, prints an empty and
setZeroArray(tempArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
while(!kbhit())
{
choice = getch();
}
if (choice == 'p')//while there is no keyboard press play the pattern
{
while(!kbhit())
{
system("cls");
setNextGenArray(tempArray,currentArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
choice = getch();
}
else if (choice == 'i') //print U pattern and returns to waiting for input
{
setZeroArray(tempArray);
setInitialPatternArray(tempArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
else if (choice == 'c') //displays dead cells only
{
displayMenu();
setZeroArray(tempArray);
copyArray(tempArray, currentArray);
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
else if (choice == 'a') //save the pattern in savedpattern.txt file as X Y coordinates
{
ofstream outfile;
outfile.open("savedpattern.txt");
for(int i = 0; i < MAX_ROW; i++){
for(int j = 0; j < MAX_COL; j++)
{
if(currentArray[i][j] == 'o')
{
outfile << i << " " << j << endl;
}
}
}
outfile.close();
}
else if (choice == 't') //enter a custom pattern to display
{
int x_cor = -1;
int y_cor = -1;
//create custom pattern
cout << "Please enter as many pairs of integer numbers as you want." <<endl;
cout << "The first number in each pair should be between 0 and 29." << endl;
cout << "The second number in each pair should be between 0 and 59." << endl;
cout << "Enter [R] or [r] after any pair of integers to [R]esume Game of Life." << endl;
setZeroArray(tempArray);
while(1)
{
while( x_cor > 29 || x_cor < 0)
{
cout << "The first number in each pair should be between 0 and 29." << endl;
cin >> x_cor;
}
while(y_cor > 59 || y_cor < 0)
{
cout << "The second number in each pair should be between 0 and 59." << endl;
cin >> y_cor;
}
tempArray[x_cor][y_cor] = 'O';
cin >> choice;
if(!cin)
{
//input was a interger and not string
cin >> x_cor;
}
else if( choice == 'R' || choice == 'r')
{
break;
}
}
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
}
else if(choice == '1' || choice == '2' || choice == '3')
{
int x_cor;
int y_cor;
ifstream infile;
setZeroArray(tempArray);
if (choice == '1') infile.open("pattern1.txt");
else if (choice == '2') infile.open("pattern2.txt");
else if (choice == '3') infile.open("pattern3.txt");
while(infile >> x_cor >> y_cor)
{
tempArray[x_cor][y_cor] = 'O'; //sets live cell in temp array
}
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
}
}while(choice != 'q');
return 0;
}
1. Change the size of the arrays:
const int MAX_ROW = 40;
const int MAX_COL = 80;
***Make sure that only global variables you have in your program are Max_ROW and MAX_COL. Move any global variables you declared to a function or functions.
***Make sure to update setNextGenArray(). Use the variable names, not 40 or 80.
***For testing, I will be changing the array size. Your program should work by only modifying the array size.
2. Use two-dimensional arrays (tempArray, currentArray) of type char, instead of type int.
3. Choose a character for live cells, and a character for dead cells.
4. When you start your program, it should display only dead cells.
5. Modify the menu to include the followings (you may change the menu and descriptions, but must contain all the following options):
Initial - 'I' to load the 'U' pattern.
Play - 'P' to play the game.
Stop - 'S' to stop the game.
Clear - 'C' to set the arrays to the dead cells.
Quit - 'Q' to exit the program
1) pattern1 name - '1' to load the pattern1.txt file to the screen. (Replace pattern1 name with an actual pattern name you have, ex: 1) spaceship ). The location of the loaded pattern should be randomized.
2) pattern2 name - '2' to load the pattern2.txt file to the screen. (Replace pattern2 name with actual pattern name you have, ex: 2) snake ). The location of the loaded pattern should be randomized.
3) pattern3 name - '3' to load the pattern3.txt file to the screen. (Replace pattern3 name with actual pattern name you have, ex: 3) phython ). The location of the loaded pattern should be randomized.
Custom - 'T' to create a pattern from the user's input (collect row and column numbers) and set each cell to a live cell.
Save - 'A' to save the current live cell pattern of the currentArray to a file; save the row and column numbers of the live cells. (You may allow the user to type a file name.)
Load - 'L' to load a saved file. (You may allow the user to type the file name the user wish to load.)
***Allow the user to type uppercase or lowercase characters.
6. Add three more patterns except the 'U' pattern. See the file below (do not use block and tub), or you may create your own patterns. Present the different patterns (at least 3 using files - pattern1.txt, pattern2.txt, pattern3.txt) to the user in the menu (see 5), then allow the user to load those files; create a function to access each file (pass filename as a parameter to the function). Each file contains the row and column numbers of live cells.
7. You may create additional variables and functions as necessary. (Name them properly)
****When declaring variables and functions, use a meaningful name; don't just use x, y, a, b, etc. Don't just use a single character.
output:
***********
Explanation / Answer
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <conio.h> //kbhit()
#include <windows.h> //Sleep()
using namespace std;
//=============================Global Variables==============================
const int MAX_COL = 80;
const int MAX_ROW = 40;
const int SLEEP_TIME = 800;
//stringstream string_to_int; //Used for converting strings to ints
//=============================Functions=====================================
void displayMenu()
{
cout << "[P]lay Press 'P' to play." << endl;
cout << "[Q]uit Press 'Q' to exit." << endl;
cout << "S[a]ve Press 'A' to Save." << endl;
cout << "Load [1], [2], or [3] to load and display a saved pattern." << endl;
cout << "[I]intial press 'I' to see the initial pattern." << endl;
cout << "[T] Press 't' to make your own custom pattern." << endl;
cout << "[C]lear press 'C' to clear the pattern." << endl;
}
void setZeroArray (char (&tempArray)[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
tempArray[i][j] = '.';
}
}
}
int setNextGenArrayHelper(char currentArray[MAX_ROW][MAX_COL], int row, int column)
{
int count=0;
//upper left corner
if(row==0 && column==0)
{
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
//lower left corner
if(row==(MAX_ROW-1) && column==0)
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
return count;
}
//upper right corner
if(row==0 && column==(MAX_COL-1))
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
return count;
}
//lower right corner
if(row==(MAX_ROW-1) && column==(MAX_COL-1))
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
return count;
}
//top side
if(row==0)
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
return count;
}
//bottom side
if(row==(MAX_ROW-1))
{
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row-1][column]=='O')
count++;
return count;
}
//left side
if(column==0)
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
//right side
if(column==(MAX_COL-1))
{
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
return count;
}
//middle
if(currentArray[row-1][column-1]=='O')
count++;
if(currentArray[row-1][column]=='O')
count++;
if(currentArray[row-1][column+1]=='O')
count++;
if(currentArray[row][column-1]=='O')
count++;
if(currentArray[row][column+1]=='O')
count++;
if(currentArray[row+1][column-1]=='O')
count++;
if(currentArray[row+1][column]=='O')
count++;
if(currentArray[row+1][column+1]=='O')
count++;
return count;
}
void setNextGenArray(char (&tempArray)[MAX_ROW][MAX_COL], char currentArray[MAX_ROW][MAX_COL])
{
int neighborNum=0;
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
neighborNum = setNextGenArrayHelper(currentArray,i,j);
if(neighborNum<2 || neighborNum>3)
tempArray[i][j]= '.';
else if(neighborNum==3)
tempArray[i][j] = 'O';
else
tempArray[i][j] = currentArray[i][j];
}
}
}
void copyArray(char tempArray[MAX_ROW][MAX_COL], char (¤tArray)[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
currentArray[i][j] = tempArray[i][j];
}
}
}
void displayArray (char arr[MAX_ROW][MAX_COL])
{
for(int i=0;i<MAX_ROW;i++)
{
for(int j=0;j<MAX_COL;j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
void setInitialPatternArray(char (&tempArray)[MAX_ROW][MAX_COL])
{
int temprow = rand() % 10 + 1;
int tempcol = rand() % 10 + 1;
for(int i=temprow;i<temprow+6;i++)
{
tempArray[i][tempcol] = 'O';
tempArray[i][tempcol+6] = 'O';
}
for(int i=tempcol;i<tempcol+6;i++)
{
tempArray[temprow+5][i] = 'O';
}
}
//===========================Main Code=======================================
int main()
{
char currentArray[MAX_ROW][MAX_COL];
char tempArray[MAX_ROW][MAX_COL];
char choice;
bool char_in;
do{
//initial state of the board, prints an empty and
setZeroArray(tempArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
while(!kbhit())
{
choice = getch();
}
if (choice == 'p')//while there is no keyboard press play the pattern
{
while(!kbhit())
{
system("cls");
setNextGenArray(tempArray,currentArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
choice = getch();
}
else if (choice == 'i') //print U pattern and returns to waiting for input
{
setZeroArray(tempArray);
setInitialPatternArray(tempArray);
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
else if (choice == 'c') //displays dead cells only
{
displayMenu();
setZeroArray(tempArray);
copyArray(tempArray, currentArray);
displayArray(currentArray);
Sleep(SLEEP_TIME);
}
else if (choice == 'a') //save the pattern in savedpattern.txt file as X Y coordinates
{
ofstream outfile;
outfile.open("savedpattern.txt");
for(int i = 0; i < MAX_ROW; i++){
for(int j = 0; j < MAX_COL; j++)
{
if(currentArray[i][j] == 'o')
{
outfile << i << " " << j << endl;
}
}
}
outfile.close();
}
else if (choice == 't') //enter a custom pattern to display
{
int x_cor = -1;
int y_cor = -1;
//create custom pattern
cout << "Please enter as many pairs of integer numbers as you want." <<endl;
cout << "The first number in each pair should be between 0 and 29." << endl;
cout << "The second number in each pair should be between 0 and 59." << endl;
cout << "Enter [R] or [r] after any pair of integers to [R]esume Game of Life." << endl;
setZeroArray(tempArray);
while(1)
{
while( x_cor > 29 || x_cor < 0)
{
cout << "The first number in each pair should be between 0 and 29." << endl;
cin >> x_cor;
}
while(y_cor > 59 || y_cor < 0)
{
cout << "The second number in each pair should be between 0 and 59." << endl;
cin >> y_cor;
}
tempArray[x_cor][y_cor] = 'O';
cin >> choice;
if(!cin)
{
//input was a interger and not string
cin >> x_cor;
}
else if( choice == 'R' || choice == 'r')
{
break;
}
}
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
}
else if(choice == '1' || choice == '2' || choice == '3')
{
int x_cor;
int y_cor;
ifstream infile;
setZeroArray(tempArray);
if (choice == '1') infile.open("pattern1.txt");
else if (choice == '2') infile.open("pattern2.txt");
else if (choice == '3') infile.open("pattern3.txt");
while(infile >> x_cor >> y_cor)
{
tempArray[x_cor][y_cor] = 'O'; //sets live cell in temp array
}
copyArray(tempArray, currentArray);
displayMenu();
displayArray(currentArray);
}
}while(choice != 'q');
return 0;
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.