0

I have made this method that creates a 2D array for co-ordinates and places objects (item, treasure, enemy) in random locations. I want to make a new method that takes in the current Player object (so I can keep the current hp, stats, points) and spawn a set of co-ordinates and objects in random locations.

void Game::newGame() {
    srand(time(0));

    int count = 0;
    int row = 0;
    int col = 0;

    Room* newRoom = new Room;
    room = newRoom;
    m_alive = true;

    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            room->aRoom[i][j] = NULL;
        }
    }

    //spawn player at 0,0
    room->aRoom[0][0] = new Player("Lemmiwinks", rand()%9+11, rand()%6+7, rand()%6+7);
    m_player = room->aRoom[0][0];
    room->currentRow = 0;
    room->currentCol = 0;
    printMoves();

    //spawn boss
    room->aRoom[rand()%rows][cols-1] = new Boss("Demon Lord", rand()%9 + 10, rand()%7 + 8, rand()%7 + 8);

    //spawn meat cleaver
    count = 0;
    while(count < 1) {
        row = rand()%rows;
        col = rand()%cols;
        if (room->aRoom[row][col] == NULL) {
            room->aRoom[row][col] = new Item("Rusty Shank", 0, 3, 1);
            count++;
        }
    }

    //spawn barrel lid
    count = 0;
    while(count < 1) {
        row = rand()%rows;
        col = rand()%cols;
        if (room->aRoom[row][col] == NULL) {
            room->aRoom[row][col] = new Item("Barrel Lid", 0, 1, 3);
            count++;
        }
    }

    //place potion at random loc
    count = 0;
    while(count < 2) {
        row = rand()%rows;
        col = rand()%cols;
        if (room->aRoom[row][col] == NULL) {
            room->aRoom[row][col] = new Item("Potion", 10, 0, 0);
            count++;
        }
    }   

    //place 5 enemies at random loc
    count = 0;
    while(count < 5) {
        row = rand()%rows;
        col = rand()%cols;
        if (room->aRoom[row][col] == NULL) {
            room->aRoom[row][col] = new Enemy("Demon", rand()%5 + 5, rand()%4 + 4, rand()%4 + 4);
            count++;
        }
    }

    //place 5 treasures at random loc
    count = 0;
    while(count < 5) {
        row = rand()%rows;
        col = rand()%cols;
        if (room->aRoom[row][col] == NULL) {
            room->aRoom[row][col] = new Treasure("Artifact", rand()%5 + 5);
            count++;
        }
    }

    cout << "\n---Stats---" << endl;
    m_player->printEntity();

}

Is there any way I can dupe this method and pass in a player object so I can reuse the same player on a new map?

2
  • 1
    Suggestion: You might want to save yourself from a lot of problems by switching to std::vector. Commented May 25, 2012 at 8:06
  • 1
    Did you try passing the Player object as a parameter? Commented May 25, 2012 at 8:13

1 Answer 1

1

Not sure if this is what you are after, but should do it:

void Game::newGame() {

...
    if (!m_player) {
        m_player = new Player("Lemmiwinks", rand()%9+11, rand()%6+7, rand()%6+7);
    }
    room->aRoom[0][0] = m_player; 
...
}

void Room::clear(Item* player) {
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            if (room->aRoom[i][j] != player) {
                delete room->aRoom[i][j];
            }
            room->aRoom[i][j] = NULL;
        }
    }
}

I'd consider maybe using smart pointers for your game objects. Maybe you are already, but I wouldn't be able to tell from you example code.

You could always restructure your program and simply have a list(s) of game objects and each contains its coordinates. This would save iterating over a potentially large 2d array in the rest of the game logic. Would also potentially avoid many of the double-dispatches that you'll be having.

Sign up to request clarification or add additional context in comments.

1 Comment

Yep. That one 'if' condition in the first block of code solved my whole problem. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.