2013-07-20 46 views
0
#include <iostream> 
#include <stdlib.h> 
#include <ctime> 

class Minesweeper { 
    public: 
     void buildBoards(); 
     void printTopLvlBoard(); 
     void printBottomLvlBoard(); 
     void userEntry(int x, int y); 
     void gameOver(); 
     bool stateGood(); 
    private: 
     static const int CLMN_MAX_SIZE = 5; 
     static const int ROW_MAX_SIZE = 5; 
     char topLvlBoard[ROW_MAX_SIZE][CLMN_MAX_SIZE]; 
     char bottomLvlBoard[ROW_MAX_SIZE][CLMN_MAX_SIZE]; 
     bool gameState; 
    }; 

void Minesweeper::printTopLvlBoard(){ 
    std:: cout << "Board" << std:: endl; 
    for(int i = 0; i < ROW_MAX_SIZE; i++) { 
     for(int j = 0; j < CLMN_MAX_SIZE; j++) { 
      std::cout << topLvlBoard[i][j]; 
     } 
    std::cout << std::endl; 
    } 
} 

void Minesweeper::buildBoards(){ 
    for(int i = 0; i < ROW_MAX_SIZE; i++){ 
     for(int j = 0; j < CLMN_MAX_SIZE; j++){ 
      bottomLvlBoard[i][j] = 'O'; 
      topLvlBoard[i][j] = 'x'; 
     } 
    } 
    for(int k = 0; k < 5; k++) { 
     bottomLvlBoard[**rand()%5**][**rand()%5**] = 'B'; 
    } 
    gameState = true; 
} 

void Minesweeper::printBottomLvlBoard(){ 
    for(int i = 0; i < CLMN_MAX_SIZE; i++){ 
     for(int j = 0; j < ROW_MAX_SIZE; j++){ 
     std::cout << bottomLvlBoard[i][j]; 
     } 
     std::cout << std:: endl; 
    } 
} 

void Minesweeper::userEntry(int x,int y){ 
    char bottomTmp = bottomLvlBoard[x-1][y-1]; 

    if(bottomTmp == 'O'){ 
     topLvlBoard[x-1][y-1] = '*'; 
     bottomLvlBoard[x-1][y-1] = 'C'; 
    } 
    else if(bottomTmp == 'B'){ 
     gameOver(); 
    } 
} 
void Minesweeper::gameOver() { 

    std::cout << std:: endl; 
    std::cout << "**********************" << std:: endl; 
    std::cout << "**********************" << std:: endl; 
    std::cout << "*** BOMB BOMB BOMB ***" << std:: endl; 
    std::cout << "*** BOMB BOMB BOMB ***" << std:: endl; 
    std::cout << "*** BOMB BOMB BOMB ***" << std:: endl; 
    std::cout << "*** BOMB BOMB BOMB ***" << std:: endl; 
    std::cout << "**********************" << std:: endl; 
    std::cout << "**********************" << std:: endl; 
    std::cout << std:: endl; 

    std::cout << "You have landed on a bomb!" << std:: endl; 
    std::cout << std:: endl; 

    printBottomLvlBoard(); 
    gameState = false; 
} 

bool Minesweeper::stateGood(){ 
    bool tmpYesNo = (gameState == true) ? true : false; 
    return tmpYesNo; 
} 

是否有通過rand()函數強制執行顯式隨機性的方法?每次我運行這個程序時,我都會在網格中獲得相同的可預測炸彈模式。即使我改變main()中的種子,我仍然只能得到大約3種模式的變體。如何使用rand()執行顯式隨機性

+1

播種是關鍵。你打電話給srand()怎麼樣? –

+0

嘿!沒有任何明確的東西堆棧溢出! –

回答

0

請參閱Why do I always get the same sequence of random numbers with rand()?

實質上,rand()沒有一個種子總是會返回相同的僞隨機數 - 在這種情況下,種子通常是'1'。蘭德()與固定種子將始終返回相同的僞隨機數字以及。

+0

我沒有使用固定的種子。它包含在我的實現中。可能是因爲即使播種,我也會得到一小部分價值差異。 –

+0

@ user2069483:如果你不調用'srand()',那麼你*是*使用固定的種子;這相當於在程序開始時調用'srand(1)'。 'srand(time(NULL))'應該給你一個獨特的序列,每次你的程序運行時,只要你的運行間隔超過1秒。 –

1

首先使用種子初始化僞隨機生成器(PRNG),一個簡單的方法是使用下面的當前時間。

#include <ctime> 

// and put the following before calling rand, and where it is only called once 
srand(time(NULL)); 

即一個好地方,叫srand可以成爲你的main()函數的開始。

+2

並把它放在只被調用一次的地方。 –

0

如果在初次調用srand(n)(srand()只在main的開始處調用一次)之後在程序中重複運行rand(),並且基本上得到了一個小的重複當你期待更多樣化的結果時,結果集合,然後在數學上幾乎可以保證問題不在rand()中 - 這就是你如何使用隨機數字。也就是說,可以使用「真隨機性」作爲算法的一部分,但仍然會使您的算法傾向於以高概率收斂到常見狀態(或幾個常見狀態之一)。看看你的代碼,你沒有提供一個main()或者描述什麼時候/你在打印什麼,給出了「相同3種模式的變化」,或者描述了3種模式的變化意味着什麼,或描述你期望看到的其他類型的模式。沒有這些信息,就很難再對你的問題有更多的瞭解。也許所有3種模式的「變化」都是人們期望看到的,具有很高的可能性。

+0

在仔細查看代碼後更新了答案 – user2566092