2016-05-26 27 views
-4

乱数を2次元配列に格納していますが、いくつかの数値は側部/境界線にあるように見えます。私は何が間違っているのか分かりません。私が望むのは、すべての乱数を2次元配列の境界の内側に持つことです。ここで乱数を2次元配列に格納する

#include <stdio.h> 
#include <stdlib.h> 

#define ROW 9 
#define COL 9 


void gameboard(char box[ROW][COL]) 
{ 
    int x,y; 

    for(x = 0; x < ROW; x++) 
    { 
     for(y = 0; y <COL; y++) 
     { 
      box[x][y] =' '; 
     } 
    } 
    for(x = 0; x < ROW; x++) 
    { 
     box[0][x]='#'; 
     box[x][8]='#'; 

     box[x][0]='#'; 
     box[8][x]='#'; 
    }  
} 


void rnum(char box[ROW][COL]) 
{ 
    int x,r1,r2,r3,r4; 
    char r='1'; 
    srand((unsigned) time(NULL)); 

    for(x=0;x<9;x++) 
    { 
     r1 = rand()%9; 
     r2 = rand()%9; 
     r3 = rand()%9; 
     r4 = rand()%9; 

     box[r1][r2]= r + x; 
     box[r3][r4]= r + x; 
    }  
} 


int main(void) 
{ 
    char box[ROW][COL]; 
    char name[20]; 
    int x,y,choice; 

    gameboard(box); 

    rnum(box);  

    for(x = 0; x < ROW; x++) 
    { 
     for(y = 0; y < COL; y++) 
     { 
     printf(" %c ",box[x][y]); 
     } 
     printf("\n\n"); 
    } 

    rnum(box); 

    return 0; 
} 

は出力です:

Screen shot of output

+0

境界に注意してください。 '# '記号がすでに存在しているため、要素' 0 'または' 8 'は上書きされません。 rnum()のforループは次のとおりです。for(x = 0; x <7; x ++) { r1 = 1 + rand()%7;r2 = 1 + rand()%7; r3 = 1 + rand()%7;r4 = 1 + rand()%7; box [r1] [r2] = r + x; ボックス[r3] [r4] = r + x; } ' – user3078414

+0

恐ろしい!できます !ありがとうございました。 – CODEr

答えて

0

あなたはランダムな数字は1-9の間の範囲に維持する必要がある場合は、機能の下に使用することができます。しかし、ブロックを埋めるために必要な乱数の数がわからないので、私はそれをあなたに任せます。

void rnum(char box[ROW][COL]) { 
     int x,r1,r2,r3,r4; 
     char r='1'; 
     srand((unsigned) time(NULL)); 
     int iter = 9; 
     x = 0; 
     while (iter != 0) { 
     r1 = rand()%9; 
     r2 = rand()%9; 
     r3 = rand()%9; 
     r4 = rand()%9; 
     if (r1 == 0 || r2 == 0 || r1 == 8 || r2 == 8 || 
      r3 == 0 || r4 == 0 || r3 == 8 || r4 == 8) 
      continue; 
     else { 
      box[r1][r2]= r + x; 
      box[r3][r4]= r + x; 
      iter--; 
     } 
     x++; 
    } 
    } 
0

rand() % 90と含ま8間の数を返します。しかし、あなたの配列の境界線は、インデックス08を占めています。それを上書きしないように

17間の乱数を選択:rand()のスケーリング出力(あなたの上限を掛ける次いでRAND_MAX + 1で割る)が余りを使用して未満のバイアスを有すること

r1 = 1 + rand() % 7; 

注あなたのケースではおそらく重要ではないでしょう。

+0

私はそれを変更しましたが、同じ結果を得ています。 – CODEr

0

私は鍵がここにあると思う:

for(x=0;x<9;x++) 
{ 
    r1 = rand()%9; 
    r2 = rand()%9; 
    r3 = rand()%9; 
    r4 = rand()%9; 

    box[r1][r2]= r + x; 
    box[r3][r4]= r + x; 
    } 

R1、R2、R3、R4は乱数であり、境界線の座標がそれらに含まれているため。だから、数字が側部/境界にあるように見えるのは普通です。

0

境界に注意してください。要素[0]または[7]は、すでに#文字が存在するため、上書きしないでください。また、カウンタはがアレイの境界を超えているわけではありません。ここでrnum()for loopです:

for(x=0; x<7; x++) { 
    r1 = 1 + rand()%7; //always between 1 and 6 ! 
    r2 = 1 + rand()%7; 
    r3 = 1 + rand()%7; 
    r4 = 1 + rand()%7; 
    box[r1][r2] = r + x; 
    box[r3][r4] = r + x; 
    } 
0

uは次のコードを試すことができます:

#include <stdio.h> 
#include <stdlib.h> 

#define ROW 9 
#define COL 9 

void gameboard(char box[ROW][COL]) { 
    int x,y; 
    for(x = 0; x < ROW; x++) { 
     for(y = 0; y <COL; y++) { 
      box[x][y] =' '; 
     } 
    } 
} 

void rnum(char box[ROW][COL]) { 
    int x,r1,r2,r3,r4; 
    char r='1'; 
    srand((unsigned) time(NULL)); 

    for(x=0;x<9;x++) { 
     r1 = rand()%9; 
     r2 = rand()%9; 
     r3 = rand()%9; 
     r4 = rand()%9; 

     box[r1][r2]= r + x; 
     box[r3][r4]= r + x; 
    } 

    for(x = 0; x < ROW; x++) { 
     box[0][x]='#'; 
     box[x][8]='#'; 

     box[x][0]='#'; 
     box[8][x]='#'; 
    } 
} 

int main(void) { 
    char box[ROW][COL]; 
    char name[20]; 
    int x,y,choice; 

    gameboard(box); 

    rnum(box);  

    for(x = 0; x < ROW; x++) { 
     for(y = 0; y < COL; y++) { 
      printf(" %c ",box[x][y]); 
     } 
     printf("\n\n"); 
    } 

    rnum(box); 

    return 0; 
} 
関連する問題