2

基本的なグリッドベースのダンジョンクローラーを作ろうとしています。ビルドして実行し、プログラムがboard [7] [10] char配列を出力すると、ボード上の1つのスペースだけに「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;
}
4

1 に答える 1

3

srand問題は、内部で使用するときに同じシードで再初期化し続けることですTokens::rand0toN1。これは、time(NULL)秒単位の解像度があるためです。

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

srandを毎回使用する前に呼び出す必要はありませんrand。初期化するためだけに必要なのでsrand(time(NULL));、の開始のような場所に移動するとDungeonBoard::start()(基本的に、を最初に使用する前に 1 回呼び出されるようにしrandます)、プログラムは期待どおりに動作するはずです。

于 2012-05-06T22:49:29.510 に答える