無聊用Qt寫個五子棋(一)

五子棋是小時候玩的比較多的一種遊戲。規則也比較簡單,誰先將5個棋子連成一條線誰就贏了。

由於不想花費太多的時間,所以目標只是寫一個最簡單的五子棋程序,最終效果如下:

無聊用Qt寫個五子棋(一)


五子棋的數據結構只需要一個二維數組就夠了。不過我這裡並沒有用二維數組,而是定義了三個類。


第一個類是棋子類:

無聊用Qt寫個五子棋(一)

一個Piece表示一個棋子,這裡只有座標屬性,可以根據需要增加顏色、大小等屬性。 重載了== 用來判斷兩個棋子是否在同一個座標上。


第二個類是玩家類:

無聊用Qt寫個五子棋(一)

玩家的屬性有名字、是否為白棋和棋子列表。 函數addPiece表示玩家下一個棋子,返回true表示下了該棋後至少有5個棋子成線了。代碼如下:

無聊用Qt寫個五子棋(一)

分別獲取新棋子水平、垂直和斜線方向上連續的棋子,如果大於3(也就是4個)再加上新棋子就有五個了。getHorizontalPieces、getVerticalPieces、getSlopPieces和getReverseSlopePieces獲取棋子的思路是類似的,就是以新棋子為中心,按照一定的偏移量去遍歷,直到遍歷的位置沒有棋子時停止。


第三個類是遊戲類:

無聊用Qt寫個五子棋(一)

這個類是不是一個純粹的遊戲類,它把繪製(界面)、邏輯和交互混在一起了。因為懶。

成員變量m_player1和m_player2表示兩個玩家,m_chessboard_row和m_chessboard_col分別表示棋盤的行和列。m_isPre1用於區分該誰下棋了。m_drawArea用來控制繪製的區域。


遊戲的繪製在paintEvent中進行,繪製的關鍵就在於將遊戲中的座標值轉換為界面上的座標值,關鍵代碼如下:

無聊用Qt寫個五子棋(一)

x座標值為繪製區域的x值加上游戲x座標乘以水平方向上每小格的寬度。y座標值同理。


遊戲的交互在鼠標按下事件中進行,它剛好和繪製相反,需要將界面上的座標值轉換為遊戲中的座標,關鍵代碼如下:

無聊用Qt寫個五子棋(一)

轉換思路和paintEvent中是相反的,只不過鼠標一般不會剛好點到棋盤中棋子的中心位置,所以多了一個判斷棋子離哪個格子更近一些。小數點後數字大於0.5則遊戲座標加1即可。


源碼地址:頭條不讓加鏈接地址


分享到:


相關文章: