使用调试器与构建和运行C ++时输出不同

时间:2012-05-06 22:21:24

标签: c++ arrays debugging random

我正在尝试制作一个基于网格的基于地牢的爬虫。当我构建并运行并且程序打印出板[7] [10] char数组时,板上只有一个空格具有'T'字符。但是,如果我一步一步地使用调试器,它可以很好地工作,并在板上放置3'T'字符,就像我想要的那样。我不知道如何解决这个问题,甚至是什么导致它。我没有从编译器中得到任何错误,这只是奇怪的输出:

的main.cpp

#include <iostream>
#include "DungeonBoard.h"
#include "Tokens.h"


int main()
{
    DungeonBoard dungeonCrawl; // create DungeonBoard object
    dungeonCrawl.start(); // call start function
}

DungeonBoard.h

#ifndef DUNGEONBOARD_H
#define DUNGEONBOARD_H

class DungeonBoard
{
    public:
        DungeonBoard(){} // default constructor
        void start(); //gameplay
        void printBoard(); // print out the gameboard
    private:

};

#endif // DUNGEONBOARD_H

DungeonBoard.cpp

#include <iostream>
#include "DungeonBoard.h"
#include "Tokens.h"

const int ROW = 7;
const int COLUMN = 10;
char board[ROW][COLUMN]= {{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}};
bool occupied[ROW][COLUMN] = {{false, false, false, false, false, false, false, false, false, false},
{false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false},
{false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false},
{false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false}};

Tokens hero(0, 0); //creates user starting location at top left corner
Tokens treasure(6, 9); // creates treasure location at bottom left corner
Tokens trap1, trap2, trap3;

void DungeonBoard::start(){
    char userDirection; // user input
    bool gameOn = true; // sentinel value for while loop

    std::cout << "DUNGEON CRAWL 1.0\n";
    std::cout << "------------------\n\n";
    std::cout << "H is the hero, T are traps, X is the treasure and .'s are open spaces.\n";
    std::cout << "The goal is to move around the gameboard and reach the treasure while avoiding \ndtraps.\n\n";
    std::cout << "CONTROLS: W - UP, S - DOWN, A - LEFT, D - RIGHT.\n\n";
    std::cout << "Enjoy! :)\n\n";

    board[hero.get_row()][hero.get_col()] = 'H'; // set user starting position
    occupied[hero.get_row()][hero.get_col()] = true; // make space used
    board[treasure.get_row()][treasure.get_col()] = 'X'; // set treasure position
    occupied[treasure.get_row()][treasure.get_col()] = true; // make space used

    trap1.trap_loc(); // randomize location of trap 1
    while(occupied[trap1.get_row()][trap1.get_col()] == true){ //check to make sure space is not occupied
        trap1.trap_loc(); //if occupied, re-randomize
    }
    trap2.trap_loc(); //randomize location of trap 2
    while(occupied[trap2.get_row()][trap2.get_col()] == true){ //occupy check
        trap2.trap_loc(); // re-randomize
    }
    trap3.trap_loc(); //randomize location of trap 3
    while(occupied[trap3.get_row()][trap3.get_col()] == true){ //occupy check
        trap3.trap_loc(); //re-randomize
    }

    //set board spaces for traps to T and mark that space as used

    board[trap1.get_row()][trap1.get_col()] = 'T';
    occupied[trap1.get_row()][trap1.get_col()] = true;
    board[trap2.get_row()][trap2.get_col()] = 'T';
    occupied[trap2.get_row()][trap2.get_col()] = true;
    board[trap3.get_row()][trap3.get_col()] = 'T';
    occupied[trap3.get_row()][trap3.get_col()] = true;

    printBoard();
}

void DungeonBoard::printBoard(){
    for(int i = 0; i<7; i++){
        for(int r = 0; r<10; r++){
            if(r == 0)
                std::cout << "  ";
            std::cout << board[i][r] << " ";
        }
        std::cout << "\n\n";
    }
}

Tokens.h

#ifndef TOKENS_H
#define TOKENS_H


class Tokens
{
    public:
        Tokens(){} //default constructor
        Tokens(int row, int col); //constructor with coordinates already known
        void set_pos(int new_row, int new_col){ rowLoc = new_row; colLoc = new_col;} // set new row and col values
        int get_row(){return rowLoc;} //row getter
        int get_col(){return colLoc;} //col getter
        void trap_loc(); // randomize trap location
        int rand0toN1(int n); //psuedo random number generator
    private:
        int rowLoc, colLoc; //tokens location by row and column
};

#endif // TOKENS_H

Tokens.cpp

#include <ctime>
#include <cstdlib>
#include "Tokens.h"
#include "DungeonBoard.h"

Tokens::Tokens(int row, int col){ //sets the position of the token
    set_pos(row, col);
}


void Tokens::trap_loc(){ //gets random row and col for trap
    int trapRow = rand0toN1(6);
    int trapCol = rand0toN1(9);
    set_pos(trapRow, trapCol); // sets position of trap token to the random numbers created
}

int Tokens::rand0toN1(int n){ //psuedo-random num generator
    srand(time(NULL)); // set seed for randomization
    return rand()%n;
}

1 个答案:

答案 0 :(得分:3)

问题是,当您在srand内使用相同的种子时,您会继续使用相同的种子重新初始化Tokens::rand0toN1。这是因为time(NULL)具有秒分辨率。

通过逐步执行代码,您将使用不同的值初始化srand,从而获得预期的结果。

srand不需要在每次使用rand之前调用,只需要初始化它,所以如果你将srand(time(NULL));移到某个地方就像DungeonBoard::start()的开头一样(基本上确保在第一次使用rand之前调用它一次),你的程序应该按预期工作。