Infection Simulation | C++

austinleath

March 3rd, 2021 06:03:38 PM

					
/* this program will simulate the spreading of a disease through a grid of people, starting from a user-defined person. It will count the number of turns taken before everyone on the grid is immunized to the disease after having caught it once. This program will user the SIR model (Susceptible, Infectious, Recovered) and cellular automata to simulate the people in the grid. */ #include <iostream> using namespace std; /* Any and all global variables */ const int SIZE = 8; //Size of the square person array /* Any and all functions */ void gridDefaultify(char[][SIZE], int); //Purpose: Sets each item in the person array to 's' //Parameters: A square, two-dimensional array // The size of that array's bounds void gridDisplay(char[][SIZE], int); //Purpose: Formats and prints the information in the person grid //Parameters: A square, two-dimensional array // The value of the current day void nextTurn(char[][SIZE], char[][SIZE], int&); //Purpose: Updates the grid of people, and the current day //Parameters: Two square, two-dimensional arrays // A reference to the current day (so that it can be updated) int countInfected(char[][SIZE], int); //Purpose: Counts the number of infectious people on the grid //Parameters: A square, two-dimensional array // The size of that array's bounds int main(){ int currentDay = 0; //Infection begins on day 0, and ends one day after the last person is Recovered char gridCurrent[SIZE][SIZE]; //Grid of all people char gridUpdate[SIZE][SIZE]; //Where the user chooses to start the infection int xToInfect; int yToInfect; //Set of coordinates for the initial infection position, given by user //Initializes the grids to all 's' gridDefaultify(gridCurrent, SIZE); gridDefaultify(gridUpdate, SIZE); //The below block gets the initial infection coordinates from the user cout << "Please enter a location to infect: "; while(true){ cin >> xToInfect >> yToInfect; xToInfect--; yToInfect--; if(xToInfect < 0 || yToInfect < 0 || xToInfect >= SIZE || yToInfect >= SIZE){ cout << "Those coordinates are outside the bounds of this region." << endl; cout << "Please enter another location to infect: "; continue; } else { gridCurrent[xToInfect][yToInfect] = 'i'; break; } } //Displays the initial state of the grid gridDisplay(gridCurrent, currentDay); //The below block will display and update the grid until the infection is done. while(true){ nextTurn(gridCurrent, gridUpdate, currentDay); gridDisplay(gridCurrent, currentDay); if(countInfected(gridCurrent, SIZE) == 0) break; //Once there are no more infected, the game is done } //Displays the number of days taken for the infection to end cout << "It took " << currentDay + 1 << " days for the outbreak to end"; cout << endl; return 0; } void gridDefaultify(char arr[][SIZE], int arrSize){ for(int x = 0; x < arrSize; x++){ for(int y = 0; y < arrSize; y++){ arr[x][y] = 's'; //Sets all items in the passed-in array to 's' } } return; } void gridDisplay(char arr[][SIZE], int day){ cout << "Day " << day << endl; //Prints the current day for(int x = 0; x < SIZE; x++){ for(int y = 0; y < SIZE; y++){ cout << arr[x][y] <<" "; //Prints the array's contents } cout << endl; //Formats with newlines } cout << endl; //Some spacing return; } void nextTurn(char today[][SIZE], char update[][SIZE], int& day){ day++; //Updates the day int xCheck; //X coordinate to be checked int yCheck; //Y coordinate to be checked for(int x = 0; x < SIZE; x++){ for(int y = 0; y < SIZE; y++){ //Sets all 'i' to 'r' in the new grid if(today[x][y] == 'i' || today[x][y] == 'r'){ update[x][y] = 'r'; //Updates all infectious to recovered, and keeps current recovered } if(today[x][y] == 's'){ // If the person is susceptible... for(int xCheck = x-1; xCheck <= x+1; xCheck++){ // Check all x coordinates around the person for(int yCheck = y-1; yCheck <= y+1; yCheck++){ // Check all y coordinates around the person if(xCheck == x && yCheck == y){ // Don't check at the person because there is no need to check there } else { if(xCheck >= 0 && yCheck >= 0 && xCheck < SIZE && yCheck < SIZE){ // Make sure the checked coordinates are in bounds if(today[xCheck][yCheck] == 'i'){ //Is the person at the checked coordinates infected? update[x][y] = 'i'; //If so, update the 's' to 'i' in the new grid } } } } } } } } for(int x = 0; x < SIZE; x++){ for(int y = 0; y < SIZE; y++){ today[x][y] = update[x][y]; //Updates today's grid with the new values } } } int countInfected(char arr[][SIZE], int arrSize){ int count = 0; for(int x = 0; x < arrSize; x++){ for(int y = 0; y < arrSize; y++){ if(arr[x][y] == 'i') count++; //Increments count for each infected person in the grid } } return count; }

Featured Posts