2017-01-15 29 views
1

我正在創建一個正常的國際象棋遊戲自動矢量邊界檢查不會造成我的程序崩潰

我的國際象棋引擎有一個棋盤。該板是一個2D板[Y] [X],其內部是件。碎片是枚舉,它代表黑色碎片,白色碎片和NONE。

class ChessBoard 
{ 
    vector<vector<Piece>> board(); //I made it 8*8 in the constructor 
    enum Piece{NONE, white pieces, black pieces etc..} 
} 

我的問題是驗證廣場是否在我的董事會。請讓我詳細說明。例如,在爲A2典當可能的行動看時,典當行可以向上移動1 2或捕捉左右,或順便左,右:

(X,Y+1), (X,Y+2), (X+1,Y+1), (X-1,Y+1), (X+1,Y+2), (X-1,Y-2) 

但是,如你所知,X-1會引起該片段走出界限。

是的,我可以實現一個簡單的bool isSquareValid()函數。但這意味着,我試圖訪問或設置board[][]的地方,我需要調用此函數。

有沒有一種方法來實現Board [] [],以便當我試圖訪問綁定索引時,它會拋出一個錯誤消息或某些東西而不會崩潰我的程序?

謝謝

+0

除了同時使用兩個'operator []'外,沒有辦法實現'operator [] []'。 'std :: vector'提供了一個'at()'成員函數來檢查有效的索引,但是有必要捕獲異常以防止程序終止。注意'vector > board(8 * 8)'指定了一個包含64個「vector」的vector,每個vector都沒有元素。它不創建任何形式的8x8數組。 – Peter

+0

當然,在國際象棋中,即使目標廣場位於棋盤上,棋子也不能穿過其他棋子。 – Peter

+0

是的,我知道,我有點寫了僞代碼只是爲了表明董事會是8 * 8 ...反正,我真的不想做如果(isValidSquare(x,y))每次我嘗試看或訪問董事會。 ...有沒有一個聰明的方法來做到這一點?我想可能使它成爲一個10 * 10板,外層爲ERROR可能會有所幫助。 – Telenoobies

回答

1

你混淆了兩個不同的問題。

首先是如何確保遊戲阻止棋子在棋盤之外結束。這是不是錯誤處理;你必須確保這件作品永遠不會在那裏結束。換言之,在向用戶(或者AI組件)提供選擇之前,必須將程序邏輯限制爲有效的移動。如果你喜歡捕捉從at拋出的異常,然後將電路板恢復到有效狀態的想法,請在此停下來,不要這樣做。這將是最好的例外濫用。

第二個是如何處理由於代碼中的錯誤而導致的錯誤。您可能已經編寫了代碼來防止遊戲將棋子放置在棋盤之外,但是您可能犯了一個錯誤,因爲我們都這麼做,所以最終最終會導致非法的矢量索引。在這種情況下,operator[]導致的崩潰實際上是一件好事,因爲立即終止錯誤程序通常是可能發生在您身上的最好的事情。另一種方法是「以某種方式繼續」,繼續使用損壞的數據和破壞的遊戲規則,甚至可能不會很快發現錯誤。因爲它不能保證錯誤的operator[]調用導致崩潰,並強制運行時庫執行檢查可能有點麻煩(當然,錯誤的operator[]索引是正式未定義的行爲),您可能需要添加一些你自己的assert陳述,並確保NDEBUG不妨礙他們做他們的工作。

如果將std::vector包裝在您自己的類中,這會變得相當容易。當你在它,你就可以簡化元素訪問與operator()

class Board 
{ 
public: 
    Piece& operator()(int x, int y) 
    { 
     assert(x >= 0); 
     assert(x < 16); 
     assert(y >= 0); 
     assert(y < 16); 
     return data[y][x]; 
    } 

    Piece operator()(int x, int y) const 
    { 
     assert(x >= 0); 
     assert(x < 16); 
     assert(y >= 0); 
     assert(y < 16); 
     return data[y][x]; 
    } 

    Board() 
    { 
     for (int row_index = 0; row_index < 16; ++row_index) 
     { 
      data.emplace_back(16, Piece::None); 
     } 
    } 

private: 
    std::vector<std::vector<Piece>> data; 
}; 

還要注意的是std::vector是一個棋盤一個糟糕的選擇,因爲棋盤不收縮或增長。考慮改用std::array

+0

好吧,所以當我試圖訪問一個董事會的位置,我只是如果(董事會(x,y))..我真的很喜歡這個解決方案... – Telenoobies