4

マインスイーパ タイプのゲームのコーディングを終えたところですが、アプリケーションを実行するたびに同じ数値が生成されることを除けば、すべて問題ありません (3 回実行し、出力を 3 つのテキスト ファイルに保存しdiff、Linux でコマンドを使用しました。違いは見つかりませんでした)。によってシードされtime(NULL)ているので、毎回変更する必要がありますよね?

これが私のコードです:

main.cpp

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <string>
#include "Minesweeper/box.h"
#include <cstdio>

int main(int argc, char** argv){
using namespace std;
bool gameOver  = false;
int x, y, score = 0;
const int HEIGHT = 10;
const int WIDTH = 10;
unsigned int Time = time(0);

cout << "Welcome to Minesweeper. " << endl;


//setup grid
Box grid[10][10];

for(int i = 0; i < WIDTH; i++)
for(int n = 0; n < HEIGHT; n++){
  unsigned int value = rand() %100 + 1;
  cout << value << endl;
  if(value <= 38){
grid[i][n].setFill(MINE);
//cout << i << "," << n << " is mined." << endl;
  }
  else
grid[i][n].setFill(EMPTY);
}

for(int r = 0; r < WIDTH; r++)
for(int l = 0; l < HEIGHT; l++)
  if(grid[r][l].getFill() == EMPTY)
cout << r << "," << l << " - EMPTY." << endl;
  else if (grid[r][l].getFill() == MINE)
cout << r << "," << l << " - MINE." << endl;

while(!gameOver){
cout << "Enter coordinates (x,y): ";
scanf("%i,%i",&x,&y);
if(grid[x][y].getFill() == MINE)
  gameOver = true;
else{
  cout << "Good job! (You chose " << x << "," << y << ")" << endl;
  score++;
}
}

cout << "You hit a mine! Game over!" << endl;
cout << "Final score: " << score  << endl;
getchar();

return EXIT_SUCCESS;
}
4

3 に答える 3

9

時間でシードされます(NULL)

もしそうなら、私はそれを見ることができません。実際、コード内で検索しても何も返されません。明示的にシードしない場合のデフォルトの動作は、値 1 でシードした場合と同じです。

次のように明示的に述べる必要があります。

srand (time (NULL));

どこかの開始時に(そして、これを一度mainだけ行うようにしてください)。

ただし、これにより現在の時間に依存することに注意してください。複数のジョブを同じ秒 (または時間分解能が何であれ) に開始すると、それらは同じシードで開始されます。

C 標準 (これらの互換性機能のベースとなっている C++) から:

srand 関数は、以降の rand の呼び出しによって返される疑似乱数の新しいシーケンスのシードとして引数を使用します。srand が同じシード値で呼び出された場合、疑似乱数のシーケンスが繰り返されます。srand の呼び出しが行われる前に rand が呼び出された場合、シード値 1 で srand が最初に呼び出されたときと同じシーケンスが生成されます。

于 2011-09-29T03:32:18.880 に答える
1

他の人の回答に追加するには、C++11 ライブラリの一部である Mersenne Twister Algorithm を使用できます。乱数を生成するために、多くの一般的なソフトウェアで急速に標準になりつつあります。

たとえば、これは私が書いた関数で、他のコードで乱数を生成するためによく使用します。

 std::vector<double> mersennetwister(const int& My,const int& Mz,
 const int& Ny,const int& Nz)
 {
 int ysize = (My + 2*Ny + 1);
 int zsize = (Mz + 2*Nz + 1);
 int matsize = ysize*zsize;
 unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
 // Seeding the generator with the system time
 std::mt19937_64 generator (seed);
 // Calling the Mersenne-Twister Generator in C++11
 std::uniform_real_distribution<double> distribution(0,1);
 // Specifying the type of distribution you want
 std::vector<double>  randarray(matsize,0);
 // Saving random numbers to an array
 for (int i=0;i<matsize;++i)
 {
    randarray[i] = distribution(generator); // Generates random numbers fitting the 
    // Distribution specified earlier
 }
 return(randarray);
 } 

結論: C++11 には数値演算用の優れた機能がいくつかあり、それらを調べることをお勧めします。メルセンヌ ツイスターについては、http://en.wikipedia.org/wiki/Mersenne_twister

于 2013-06-05T01:11:47.433 に答える
1

ランダマイザーをシードする必要があります。srand()冒頭に電話。

于 2011-09-29T03:32:41.877 に答える