minesweeper

Feb 15, 2009 at 3:57pm
Hey, I'm making my own version of minesweeper.

I've made an string-array (called a) of 10 rows and 10 columns. I fill the array with zero's. Next I place 10 bombs at random places. The corner has to remain empty of bombs. I figured out how to pick a number from 1 to 8 (because the corner has to remain empty of bombs!), and assign this random number to een variable "row" and "column". Problem: when the place a[row][column] already has a bomb (sign:"*") the proces of picking a random number from 1 to 8 has to be started all over again. That's why it works so slow.
For as far as I know minesweeper of Windows works much faster!

Here is a piece of the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//the array a is already filled with zero's
int rows=sizeof(a)/sizeof(a[0]);
int columns=sizeof(a[0])/sizeof(a[0][0]);
int numberBombs=10;int counting=0;
    	 while(numberBombs > counting)
    	 	{bool go_on=false;
    	 	 long random_row;long random_column;
    	 	 long test_value;
    	 	 while(!go_on)
    	 	 	{srand(time(0));//set random number
    	 	 	 test_value=rand();
    	 	 	 random_row=test_value%(rows-2)+1;//pick a number from 1 to 8
    	 	 	 srand(time(0));
    	 	 	 test_value=rand();
    	 	 	 random_row=test_value%(columns-2)+1;
                         if(a[random_row][random_column]!="*"){go_on=true;}
    	 	 	 	
    	 	 	}
    	 	 a[random_row][random_column]="*";//"*" is a bomb
    	 	 counting++;
    	 	}


Thanks a lot in advance
Feb 15, 2009 at 4:15pm
srand() should be called only once.
Feb 15, 2009 at 4:25pm
It doesn't make a difference. The program works even slower now.
Feb 15, 2009 at 6:58pm
The old eyes are what they used to be - but are you using random_row twice - Lines 12 and 15.??

Should line 15 be random_column=test_value%(columns-2)+1; ??
Feb 15, 2009 at 8:14pm
That's right. I see now. When I copied the code in this forum, I changed the names of some vars (I had my own Dutch names), and that was the moment when I mistypied that.

But that isn't the case in the real code on my computer.
Feb 16, 2009 at 7:34am
helios already said it, srand should be called only once. Not just once for each mine, once for the whole snippet. Call srand before the for loop (the outer while).
Feb 16, 2009 at 12:39pm
Indeed, you're so right! Thanks a lot. I just overlooked the problem.

although I just do not understand why it works slower when you reset the random every time.
Feb 16, 2009 at 12:57pm
1. The way you're doing it, not only the corners, but all the rim is free of bombs...

2. You have to call srand(time(NULL)) only once at the beginning of the program, because time(NULL) changes every second. In your implementation, you have to wait one second until rand() gives a new number.
And in your implementation random_row and random_column are only different when time(NULL) changes between line 11and line 12. But you are looking for 10 pairs out of 8 numbers, you need this seldom occurance twice...

Anyhow, i would suggest to have one array with 100 entries rather than a two-dimensional array, but it should work this way, too
Topic archived. No new replies allowed.