2012-05-06 11 views
2

私は基本的なグリッドベースのダンジョンクローラを作ろうとしています。私が&をビルドし、プログラムがボード[7] [10]文字配列をプリントアウトすると、ボード上の1つのスペースだけが 'T'文字を持ちます。しかし、デバッガをステップバイステップで実行すると、完全に動作し、ボードに3 'T'文字を配置したいと思うようになります。私はどのようにこの問題を解決するか、それを引き起こしているのか分かりません。デバッガを使用しているときとC++をビルドして実行するときに異なる出力

#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 

#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"; 
    } 
} 

トークンDungeonBoard.cpp

main.cppに:私はそれだけで奇妙な出力ですが、コンパイラからエラーを取得していませんよ.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

Valgrindを試しましたか?その動作は多くのことができます...私の推測はいくつかの初期化されていない変数です... –

+1

あなたはたぶん同じ結果を得るように、これを理解するまで、固定された種を使用したいと思うでしょう。 –

+0

固定されたシードも使ってみましたが、出力されるものは常に同じ場所にある 'T'ですP – LSavage

答えて

3

問題は、あなたがTokens::rand0toN1の内側を使用するときに、同じシードで再初期化srandしておくことです。これは、time(NULL)に秒の解像度があるためです。

コードをステップ実行すると、srandが異なる値で初期化されるため、期待される結果が得られます。

srand前に呼び出されrandのすべての使用を必要としない、唯一、それを初期化するために必要とされ、あなたがDungeonBoard::start()の開始(のようなどこかにsrand(time(NULL));を移動した場合、基本的にはそれが最初の使用前に一度呼ばれています確認してくださいので、 rand)、プログラムは正常に動作するはずです。

+0

私はそれについて何か奇妙なことがあることを知っていた!私の父は私にそれを置くように言った、そして私は疑わしい。それをクリアしていただきありがとうございます! – LSavage

+0

ええ、私の息子もそのようなトリックのために落ち続ける;-) – Fraser