2016-03-04 102 views
1

我想弄清楚如何將用戶輸入的船放置在戰艦遊戲中。 x和y整數是10x10板上的位置。水平方向爲0,垂直方向爲1。 boat_length顯然是船的長度(從2到5)。如果船不能放在10x10板上,如果有另一艘船,我不能將它放在那裏。任何幫助是極大的讚賞!戰艦遊戲C++,放置用戶輸入船

bool userboat(char boatArray[][BOARD_SIZE],int x, int y, int orientation, int boat_length){ 
    for(int yy = 0; yy < BOARD_SIZE; yy++){ 
    for(int xx = 0; xx < BOARD_SIZE; xx++){ 
     if(yy == y && xx == x){ 
     boatArray[yy][xx] = 'B'; 
     if(orientation == 0){ 
      if(x+boat_length< BOARD_SIZE){ 
      for(int boat = 0; boat<boat_length; boat++){ 
       boatArray[yy][boat] =BOAT; 
      } 
      }else{ 
      return false; 
      break; 
      } 
     } 
     }else{ 
      if(yy+boat_length< BOARD_SIZE){ 
      for(int boat = 1; boat<boat_length; boat++){ 
       boatArray[boat][yy] =BOAT; 
      } 
      }else{ 
      return false; 
      break; 
      } 
     } 
     } 
    } 
    return true; 
} 
+0

那麼,什麼是您的實際問題?什麼部分不工作或者你不知道如何檢查這些條件? – NathanOliver

+0

整個代碼工作不正常,它沒有返回正確的值。這是我對解決方案的嘗試,但我想不出其他任何東西 – noobprogger

+1

這聽起來像您可能需要學習如何使用調試器來逐步執行代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

0

您需要更改下面的代碼:

boatArray[yy][boat] = BOAT; 

要:

boatArray[yy][xx + boat] = BOAT; 

讓我們在來看看一個簡單的例子。如果我們想把船放在位置(2,2),我們將整個2D陣列循環,直到達到xx == 2 & & yy == 2對不對? 好。現在我們檢查這個位置(boatArray [yy] [xx])是否爲空(你應該實現這個)。如果它是空的,我們進行數學計算,看看船是否可以放置在陣列中。 現在你的循環是這樣的:

for(int boat = 0; boat<boat_length; boat++) 
      boatArray[yy][boat] = BOAT; 

這意味着boatArray [YY] [0],boatArray [YY] [1],..將得到船的價值。但你不想那樣。這些是每一次的第一列。你應該做的,而不是爲這個(正如我前面提到的):

boatArray[yy][xx + boat] = BOAT; 

編輯:爲其他環同樣的事情。

0

使用兩個數組,以建立一個地圖的方向邁出第一步:

// orientation 
// 
// 7 8 9 
// \|/ 
// 4- -6 
// /|\ 
// 1 2 3 
//     0 1 2 3 4 5 6 7 8 9 
const int dir_x[] = { 0, -1, 0, 1, -1, 0, 1, -1, 0, 1 }; 
const int dir_y[] = { 0, 1, 1, 1, 0, 0, 0, -1, -1, -1 }; 

之前將新的船,如果這個地方是empty首先你應該測試。

#define BOAT 'B' 
#define BOARD_SIZE 10 

bool userboat(char boatArray[][BOARD_SIZE], int x, int y, int orientation, int boat_length) 
{ 
    if (orientation < 1 || orientation > 9 || orientation == 5 || boat_length < 1) 
     return false; 

    int dx = dir_x[orientation]; 
    if (x < 0 || x >= BOARD_SIZE || 
     x + dx * boat_length < 0 || x + dx * boat_length > BOARD_SIZE) // test if x is in bounds 
     return false; 

    int dy = dir_y[orientation]; 
    if (y < 0 || y >= BOARD_SIZE || 
     y + dy * boat_length < 0 || y + dy * boat_length > BOARD_SIZE) // test if y is in bounds 
     return false; 

    // test if the boat can be placed 
    for (int i = 0; i < boat_length; ++ i) 
     if (boatArray[x+dx*i][y+dy*i] == BOAT) // test if a boat is already there 
      return false; 

    // the boat can be placed 
    for (int i = 0; i < boat_length; ++ i) 
     boatArray[x+dx*i][y+dy*i] = BOAT; 
    return true; 
} 


注意,一個C++解決方案可能是這樣的:

const char BOAT  = 'B'; 
const int BOARD_SIZE = 10; 
using TBoard = std::array<std::array<char, BOARD_SIZE>, BOARD_SIZE>; 

bool userboat(TBoard &boatArray, int x, int y, int orientation, int boat_length) 
{ 
    static const std::array<int, 10> dir_x{ 0, -1, 0, 1, -1, 0, 1, -1, 0, 1 }; 
    static const std::array<int, 10> dir_y{ 0, 1, 1, 1, 0, 0, 0, -1, -1, -1 }; 

    try 
    { 
     int dx = dir_x.at(orientation); 
     int dy = dir_y.at(orientation); 

     // test if the boat can be placed 
     for (int i = 0; i < boat_length; ++ i) 
      if (boatArray.at(x+dx*i).at(y+dy*i) == BOAT) // test if a boat is already there 
       return false; 

     // the boat can be placed 
     for (int i = 0; i < boat_length; ++ i) 
      boatArray[x+dx*i][y+dy*i] = BOAT; 
    } 
    catch (...) 
    { 
     return false; 
    } 
    return true; 
}