Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <stdlib.h>
- #include <time.h>
- class Organism
- {
- private:
- int x;
- int y;
- int id;
- int roundsSurvived;
- int roundsNotEaten;
- bool hasMoved;
- bool hasEaten;
- public:
- static constexpr int UP = 1;
- static constexpr int DOWN = 2;
- static constexpr int LEFT = 3;
- static constexpr int RIGHT = 4;
- Organism(int x, int y, int id)
- {
- if (y < 0) {
- std::cout << std::endl;
- }
- this->x = x;
- this->y = y;
- this->id = id;
- this->roundsSurvived = 0;
- this->roundsNotEaten = 0;
- this->hasMoved = false;
- this->hasEaten = false;
- }
- virtual ~Organism() {}
- virtual void move(Organism *grid[20][20]) = 0;
- virtual char getType() const = 0;
- virtual void breed(Organism *grid[20][20], int &) = 0;
- virtual void starve(Organism *grid[20][20])
- {}
- // Getters
- int getX() const { return x; }
- int getY() const { return y; }
- int getID() const { return id; }
- int getRoundsSurvived() const { return roundsSurvived; }
- bool getIfMoved() const { return hasMoved; }
- bool getIfAte() const { return hasEaten; }
- int getRoundsNotEaten() const { return roundsNotEaten; }
- // Setters
- void setX(int x) { this->x = x; }
- void setY(int y) { this->y = y; }
- void setID(int id) { this->id = id; }
- void setRoundsSurvived(int roundsSurvived) { this->roundsSurvived = roundsSurvived; }
- void setRoundsNotEaten(int roundsNotEaten) { this->roundsNotEaten = roundsNotEaten; }
- void setIfMoved(bool condition) { this->hasMoved = condition; }
- void setIfAte(bool condition) { this->hasEaten = condition; }
- };
- constexpr int Organism::UP;
- constexpr int Organism::DOWN;
- constexpr int Organism::LEFT;
- constexpr int Organism::RIGHT;
- class Doodlebug : public Organism
- {
- private:
- char type;
- int getDirection(Organism* grid[20][20])
- {
- int x = this->getX(), y = this->getY();
- // find directions which has ants and ones which are empty
- std::vector<int> antDirections;
- std::vector<int> emptyDirections;
- if (x - 1 >= 0) {
- if (grid[x - 1][y] == NULL) {
- emptyDirections.push_back(UP);
- } else if (grid[x - 1][y]->getType() == 'o') {
- antDirections.push_back(UP);
- }
- }
- if (x + 1 <= 19) {
- if (grid[x + 1][y] == NULL) {
- emptyDirections.push_back(DOWN);
- } else if (grid[x + 1][y]->getType() == 'o') {
- antDirections.push_back(DOWN);
- }
- }
- if (y - 1 >= 0) {
- if (grid[x][y - 1] == NULL) {
- emptyDirections.push_back(LEFT);
- } else if (grid[x][y - 1]->getType() == 'o') {
- antDirections.push_back(LEFT);
- }
- }
- if (y + 1 <= 19) {
- if (grid[x][y + 1] == NULL) {
- emptyDirections.push_back(RIGHT);
- } else if (grid[x][y + 1]->getType() == 'o') {
- antDirections.push_back(RIGHT);
- }
- }
- // if any directions has ants, choose one of them
- if (!antDirections.empty())
- {
- int randomIndex = rand() % antDirections.size();
- return antDirections[randomIndex];
- }
- else if (!emptyDirections.empty())
- {
- // else choose a random movable direction
- int randomIndex = rand() % emptyDirections.size();
- return emptyDirections[randomIndex];
- } else {
- // else the Doodle is stuck
- return 0;
- }
- }
- public:
- Doodlebug(int x, int y, int id) : Organism(x, y, id), type('X') {}
- virtual ~Doodlebug() {}
- char getType() const { return type; }
- void move(Organism *grid[20][20]);
- void breed(Organism *grid[20][20], int &doodlebugID);
- void starve(Organism *grid[20][20]);
- };
- void Doodlebug::move(Organism *grid[20][20])
- {
- /*
- 1. Randomize a direction
- (.) Let's define the directions by the following integers
- (a) Up: 1
- (b) Down: 2
- (c) Left: 3
- (d) Right: 4
- 2. Depending on which direction you're going make sure it's a valid direction
- (a) A direction is valid if the doodlebug doesn't fall off the grid
- 3. Swap x, y with that point in the grid by creating a new object and marking
- that object as one that moved
- */
- if (this->getIfMoved() == true) {
- return;
- }
- this->setRoundsSurvived(this->getRoundsSurvived() + 1);
- int direction = this->getDirection(grid);
- if (direction == 0) {
- // the Doodle is stuck
- return;
- }
- int x = this->getX(), newX = this->getX();
- int y = this->getY(), newY = this->getY();
- int newID = this->getID();
- switch (direction) {
- case UP:
- newX = x - 1;
- break;
- case DOWN:
- newX = x + 1;
- break;
- case LEFT:
- newY = y - 1;
- break;
- case RIGHT:
- newY = y + 1;
- break;
- default:
- break;
- }
- //------------------------------------------------
- if (grid[newX][newY] && grid[newX][newY]->getType() == 'o') {
- this->setIfAte(true);
- this->setRoundsNotEaten(0);
- } else {
- this->setIfAte(false);
- this->setRoundsNotEaten(this->getRoundsNotEaten() + 1);
- }
- if (newY < 0) {
- std::cout << std::endl;
- }
- this->setX(newX);
- this->setY(newY);
- grid[newX][newY] = this;
- grid[x][y] = NULL;
- this->setIfMoved(true);
- //------------------------------------------------
- }
- void Doodlebug::breed(Organism *grid[20][20], int &doodlebugID)
- {
- setRoundsSurvived(0);
- if (getX() - 1 >= 0 && grid[getX() - 1][getY()] == NULL)
- {
- ++doodlebugID;
- grid[getX() - 1][getY()] = new Doodlebug(getX() - 1, getY(), doodlebugID);
- }
- else if (getX() + 1 <= 19 && grid[getX() + 1][getY()] == NULL)
- {
- ++doodlebugID;
- grid[getX() + 1][getY()] = new Doodlebug(getX() + 1, getY(), doodlebugID);
- }
- else if (getY() - 1 >= 0 && grid[getX()][getY() - 1] == NULL)
- {
- ++doodlebugID;
- grid[getX()][getY() - 1] = new Doodlebug(getX(), getY() - 1, doodlebugID);
- }
- else if (getY() + 1 <= 19 && grid[getX()][getY() + 1] == NULL)
- {
- ++doodlebugID;
- grid[getX()][getY() + 1] = new Doodlebug(getX(), getY() + 1, doodlebugID);
- }
- }
- void Doodlebug::starve(Organism *grid[20][20])
- {
- /*
- Implement this after implementing the ant class
- //*/
- if (getRoundsNotEaten() == 3)
- {
- if (getIfAte() == false)
- {
- delete grid[getX()][getY()];
- grid[getX()][getY()] = NULL;
- }
- }
- }
- class Ant : public Organism
- {
- private:
- char type;
- public:
- Ant(int x, int y, int id) : Organism(x, y, id), type('o') {}
- virtual ~Ant() {}
- char getType() const { return type; }
- void move(Organism *grid[20][20]);
- void breed(Organism *grid[20][20], int &);
- };
- void Ant::move(Organism *grid[20][20])
- {
- int direction = rand() % 4 + 1;
- if (direction == 1 && getX() - 1 >= 0 && getIfMoved() == false)
- {
- if (grid[getX() - 1][getY()] == NULL)
- {
- int newX = getX() - 1;
- int newY = getY();
- int newID = getID();
- int newRoundsSurvived = getRoundsSurvived() + 1;
- delete grid[getX()][getY()];
- grid[getX()][getY()] = NULL;
- grid[newX][newY] = new Ant(newX, newY, newID);
- grid[newX][newY]->setRoundsSurvived(newRoundsSurvived);
- grid[newX][newY]->setIfMoved(true);
- return;
- }
- }
- if (direction == 2 && getX() + 1 <= 19 && getIfMoved() == false)
- {
- if (grid[getX() + 1][getY()] == NULL)
- {
- int newX = getX() + 1;
- int newY = getY();
- int newID = getID();
- int newRoundsSurvived = getRoundsSurvived() + 1;
- delete grid[getX()][getY()];
- grid[getX()][getY()] = NULL;
- grid[newX][newY] = new Ant(newX, newY, newID);
- grid[newX][newY]->setRoundsSurvived(newRoundsSurvived);
- grid[newX][newY]->setIfMoved(true);
- return;
- }
- }
- if (direction == 3 && getY() - 1 >= 0 && getIfMoved() == false)
- {
- if (grid[getX()][getY() - 1] == NULL)
- {
- int newX = getX();
- int newY = getY() - 1;
- int newID = getID();
- int newRoundsSurvived = getRoundsSurvived() + 1;
- delete grid[getX()][getY()];
- grid[getX()][getY()] = NULL;
- grid[newX][newY] = new Ant(newX, newY, newID);
- grid[newX][newY]->setRoundsSurvived(newRoundsSurvived);
- grid[newX][newY]->setIfMoved(true);
- return;
- }
- }
- if (direction == 4 && getY() + 1 <= 19 && getIfMoved() == false)
- {
- if (grid[getX()][getY() + 1] == NULL)
- {
- int newX = getX();
- int newY = getY() + 1;
- int newID = getID();
- int newRoundsSurvived = getRoundsSurvived() + 1;
- delete grid[getX()][getY()];
- grid[getX()][getY()] = NULL;
- grid[newX][newY] = new Ant(newX, newY, newID);
- grid[newX][newY]->setRoundsSurvived(newRoundsSurvived);
- grid[newX][newY]->setIfMoved(true);
- return;
- }
- }
- setRoundsSurvived(getRoundsSurvived() + 1);
- }
- void Ant::breed(Organism *grid[20][20], int &antID)
- {
- setRoundsSurvived(0);
- if (getX() - 1 >= 0 && grid[getX() - 1][getY()] == NULL)
- {
- ++antID;
- grid[getX() - 1][getY()] = new Ant(getX() - 1, getY(), antID);
- }
- else if (getX() + 1 <= 19 && grid[getX() + 1][getY()] == NULL)
- {
- ++antID;
- grid[getX() + 1][getY()] = new Ant(getX() + 1, getY(), antID);
- }
- else if (getY() - 1 >= 0 && grid[getX()][getY() - 1] == NULL)
- {
- ++antID;
- grid[getX()][getY() - 1] = new Ant(getX(), getY() - 1, antID);
- }
- else if (getY() + 1 <= 19 && grid[getX()][getY() + 1] == NULL)
- {
- ++antID;
- grid[getX()][getY() + 1] = new Ant(getX(), getY() + 1, antID);
- }
- }
- void initialize(Organism *grid[20][20])
- {
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- grid[i][j] = NULL;
- }
- }
- }
- void render(Organism *grid[20][20])
- {
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] == NULL)
- {
- std::cout << "-"
- << " ";
- }
- else if (grid[i][j]->getType() == 'X')
- {
- std::cout << "X"
- << " ";
- }
- else if (grid[i][j]->getType() == 'o')
- {
- std::cout << "o"
- << " ";
- }
- }
- std::cout << std::endl;
- }
- std::cout << std::endl;
- }
- int countTheDoodles(Organism *grid[20][20])
- {
- int count = 0;
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'X')
- {
- count++;
- }
- }
- }
- }
- return count;
- }
- int countTheAnts(Organism *grid[20][20])
- {
- int count = 0;
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'o')
- {
- count++;
- }
- }
- }
- }
- return count;
- }
- int main()
- {
- Organism *grid[20][20];
- initialize(grid);
- std::srand(time(NULL));
- // Create 5 doodlebugs on the heap
- int doodlebugCount = 0;
- int doodlebugID = 0;
- while (doodlebugCount < 5)
- {
- // Get a random x and y coordinate for the grid
- int randomX = rand() % 20;
- int randomY = rand() % 20;
- if (grid[randomX][randomY] == NULL)
- {
- grid[randomX][randomY] = new Doodlebug(randomX, randomY, doodlebugID);
- doodlebugCount++;
- doodlebugID++;
- }
- }
- // Create 100 ants on the heap
- int antCount = 0;
- int antID = 100;
- while (antCount < 100)
- {
- int randomX = rand() % 20;
- int randomY = rand() % 20;
- if (grid[randomX][randomY] == NULL)
- {
- grid[randomX][randomY] = new Ant(randomX, randomY, antID);
- antCount++;
- antID++;
- }
- }
- std::cout << "Intial Grid" << std::endl;
- render(grid);
- bool flag = true;
- int step = 0;
- while (flag)
- {
- std::cout << "Press Enter to continue..." << std::endl;
- std::cin.ignore();
- ++step;
- std::cout << "****** Time Step: " << step << " ******" << std::endl;
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'X' && !grid[i][j]->getIfMoved())
- {
- grid[i][j]->move(grid);
- }
- }
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'o' && !grid[i][j]->getIfMoved())
- {
- grid[i][j]->move(grid);
- }
- }
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'X' || grid[i][j]->getType() == 'o')
- {
- grid[i][j]->setIfMoved(false);
- }
- }
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'X')
- {
- grid[i][j]->starve(grid);
- }
- }
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'X' && grid[i][j]->getRoundsSurvived() == 8)
- {
- grid[i][j]->breed(grid, doodlebugID);
- }
- }
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (grid[i][j] != NULL)
- {
- if (grid[i][j]->getType() == 'o' && grid[i][j]->getRoundsSurvived() == 3)
- {
- grid[i][j]->breed(grid, antID);
- }
- }
- }
- }
- render(grid);
- if (countTheAnts(grid) == 400 || countTheDoodles(grid) == 400)
- {
- flag = false;
- }
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- delete grid[i][j];
- grid[i][j] = NULL;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement