我正在尝试制作一个基于网格的基于地牢的爬虫。当我构建并运行并且程序打印出板[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;
}
答案 0 :(得分:3)
问题是,当您在srand
内使用相同的种子时,您会继续使用相同的种子重新初始化Tokens::rand0toN1
。这是因为time(NULL)
具有秒分辨率。
通过逐步执行代码,您将使用不同的值初始化srand
,从而获得预期的结果。
srand
不需要在每次使用rand
之前调用,只需要初始化它,所以如果你将srand(time(NULL));
移到某个地方就像DungeonBoard::start()
的开头一样(基本上确保在第一次使用rand
之前调用它一次),你的程序应该按预期工作。