2012-02-01 81 views
0

所以我一直在嘗試用C編寫一個水池戰列艦遊戲。我已經寫了一個隨機生成的布爾值的簡單版本,但是我並不滿意船隻只有一個大小的區塊,他們太多了,但我離題了。C中的戰列艦遊戲出現故障

這裏,我已經寫了什麼,我相信這是一個混亂的一段代碼,和它的作品,有時...

這就是:

void generate_field(int *i, int *j, int n) 
{ 
    *i=rand()%n; 
    *j=rand()%n; 
} 
void map_gen(struct game *data,int n) 
{ 
    int i,j,k,l; 
    int return_value=0; 

    for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 
     { 
      data->tiles[i][j].ship=0; 
      data->tiles[i][j].uncovered=0; 
     } 
    } 

// **4** 
    generate_field(&k,&l,n); 
    if(k==0 || k==1) 
    { 
     data->tiles[k][l].ship=4; 
     data->tiles[k+1][l].ship=4; 
     data->tiles[k+2][l].ship=4; 
     data->tiles[k+3][l].ship=4; 
     data->shipcount++; 
    } 
    else if(k==(n-1) || k==(n-2)) 
    { 
     data->tiles[k][l].ship=4; 
     data->tiles[k-1][l].ship=4; 
     data->tiles[k-2][l].ship=4; 
     data->tiles[k-3][l].ship=4; 
     data->shipcount++; 
    } 
    else if(l==0 || l==1) 
    { 
     data->tiles[k][l].ship=4; 
     data->tiles[k][l+1].ship=4; 
     data->tiles[k][l+2].ship=4; 
     data->tiles[k][l+3].ship=4; 
     data->shipcount++; 
    } 
    else if(l==(n-1) || l==(n-2)) 
    { 
     data->tiles[k][l].ship=4; 
     data->tiles[k][l-1].ship=4; 
     data->tiles[k][l-2].ship=4; 
     data->tiles[k][l-3].ship=4; 
     data->shipcount++; 
    } 
// **3** 
    do{ 
    generate_field(&k,&l,n); 
    }while(data->tiles[k][l].ship!=0 && (data->tiles[k+1][l].ship!=0 || data->tiles[k-1][l].ship!=0 || data->tiles[k][l+1].ship!=0 || data->tiles[k][l-1].ship!=0) && (data->tiles[k+2][l].ship!=0 || data->tiles[k-2][l].ship!=0 || data->tiles[k][l+2].ship!=0 || data->tiles[k][l-2].ship!=0)); 
    if((k==0 || k==1) && (data->tiles[k+1][l].ship==0 && data->tiles[k+2][l].ship==0)) 
    { 
     data->tiles[k][l].ship=3; 
     data->tiles[k+1][l].ship=3; 
     data->tiles[k+2][l].ship=3; 
     data->shipcount++; 
    } 
    else if((k==(n-1) || k==(n-2)) && (data->tiles[k-1][l].ship==0 && data->tiles[k-2][l].ship==0)) 
    { 
     data->tiles[k][l].ship=3; 
     data->tiles[k-1][l].ship=3; 
     data->tiles[k-2][l].ship=3; 
     data->shipcount++; 
    } 
    else if((l==0 || l==1) && (data->tiles[k][l+1].ship==0 && data->tiles[k][l+2].ship==0)) 
    { 
     data->tiles[k][l].ship=3; 
     data->tiles[k][l+1].ship=3; 
     data->tiles[k][l+2].ship=3; 
     data->shipcount++; 
    } 
    else if((l==(n-1) || l==(n-2)) && (data->tiles[k][l-1].ship==0 && data->tiles[k][l-2].ship==0)) 
    { 
     data->tiles[k][l].ship=3; 
     data->tiles[k][l-1].ship=3; 
     data->tiles[k][l-2].ship=3; 
     data->shipcount++; 
    } 
// **2** 
    do{ 
    generate_field(&k,&l,n); 
    }while(data->tiles[k][l].ship!=0 && (data->tiles[k+1][l].ship!=0 || data->tiles[k-1][l].ship!=0 || data->tiles[k][l+1].ship!=0 || data->tiles[k][l-1].ship!=0)); 
    if((k==0 || k==1) && (data->tiles[k+1][l].ship==0)) 
    { 
     data->tiles[k][l].ship=2; 
     data->tiles[k+1][l].ship=2; 
     data->shipcount++; 
    } 
    else if((k==(n-1) || k==(n-2)) && (data->tiles[k-1][l].ship==0)) 
    { 
     data->tiles[k][l].ship=2; 
     data->tiles[k-1][l].ship=2; 
     data->shipcount++; 
    } 
    else if((l==0 || l==1) && (data->tiles[k][l+1].ship==0)) 
    { 
     data->tiles[k][l].ship=2; 
     data->tiles[k][l+1].ship=2; 
     data->shipcount++; 
    } 
    else if((l==(n-1) || l==(n-2)) && (data->tiles[k][l-1].ship==0)) 
    { 
     data->tiles[k][l].ship=2; 
     data->tiles[k][l-1].ship=2; 
     data->shipcount++; 
    } 

// **1** 
    do{ 
    generate_field(&k,&l,n); 
    }while(data->tiles[k][l].ship!=0); 
    data->tiles[k][l].ship=1; 
    data->shipcount++; 
} 

**#**的船型。

int n是矩陣陣列的尺寸大小(我有兩種規格:正常是5×5大是8×8)

無論如何,我知道這可能是編寫方式更簡單的方法,並且它實際上可以工作。 do-while循環太長,很多時候我的船隻一兩次都沒有生成。我認爲這是因爲我通過使用(k==0k==n-1)的東西來限制他們的產卵,但是我不知道該怎麼做。這裏的任何人都可以給我一些提示,我怎麼可能以不同的方式寫出這些不同的,更緊湊的方式,以及它的實際工作原理是什麼?

+2

聽起來[代碼審查(http://codereview.stackexchange.com/)。 – 2012-02-01 14:12:39

+2

我覺得你有點偏離主題。嘗試張貼在[codereview](http://codereview.stackexchange.com)上。 – dandan78 2012-02-01 14:12:52

+0

最簡單的方法可能是隨機獲取一個位置,並嘗試將您的船放在那裏。如果它不起作用,請嘗試另一個隨機位置。 – zneak 2012-02-01 14:13:58

回答

1

問題在於如何確定船舶的位置和方向。

我會做這樣的:

void place_ship(struct game* data, int n, int shipsize) 
{ 
    int x = 0, y = 0; // Uesd for ship direction 

    // Generate a direction 
    if (rand()%2) { 
     i=rand()%(n - shipsize + 1); 
     j=rand()%n; 
     x = 1; 
     y = 0; 
    } else { 
     i=rand()%n; 
     j=rand()%(n - shipsize + 1); 
     x = 0; 
     y = 1; 
    } 

    for (k = 0; k < shipsize; k++) { 
     if (data->tiles[i + x * k][j + y * k].ship != 0) { 
      // Space already occupied - retry! 
      return place_ship(data, n, shipsize); 
     } 
    } 
    for (k = 0; k < shipsize; k++) { 
     data->tiles[i + x * k][j + y * k].ship = shipsize; 
    } 
}