Qt象棋遊戲 02 繪畫象棋棋盤

2021-10-01 06:33:03 字數 4127 閱讀 8392

進行**編寫之前,在chessarea.h 增加相關成員和方法定義,同時加入qt需要使用到的基本標頭檔案。主要用到qt繪畫類:qpen,qbrush,qpoint,qpaintevent等,重寫paintevent,達到繪製棋盤線功能。

#

ifndef

chessarea_h

#define

chessarea_h

#include

// 基本視窗widget

#include

// 畫筆

#include

// 畫刷

#include

// 畫布

#include

// 點

#include

// 顏色

#include

// 顏色dialog

#include

// 滑鼠事件

#include

// 繪畫事件

#include

"chess.h"

class

chessarea

:public

qwidget;#

endif

// chessarea_h

修改棋盤顏色比較簡單,直接修改widget背景顏色。在chessarea.cpp的建構函式中新增以下**,修改棋盤的背景色為公尺黃色。

//設定棋盤去區的背景顏色和大小

qpalette palette;

// 設定棋盤成了公尺黃

qlineargradient lineargradient(0

,0,400

,400);

lineargradient.

setcolorat

(0.0

,qcolor

(216

,180,80

)); lineargradient.

setcolorat

(0.2

,qcolor

(216

,160,72

)); lineargradient.

setcolorat

(1.0

,qcolor

(216

,156,72

)); palette.

setbrush

(qpalette::background,

qbrush

(lineargradient));

setpalette

(palette)

;setautofillbackground

(true);

setminimumsize

(600

,660

);

*paintevent(qpaintevent)**函式是qwidget類中的虛函式,用於繪製ui。

乙個重繪事件用來重繪乙個部件的全部或者部分區域,下面幾個原因的任意乙個都會發生重繪事件:

(1)repaint()函式或者update()函式被呼叫;

(2)被隱藏的部件現在被重新顯示;

(3)其他一些原因。

)// 3.楚河 漢界

p.drawline

(chessarea, chessarea*

5, chessarea, chessarea*6)

; p.

drawline

(chessarea*

9, chessarea*

5,chessarea*

9, chessarea*6)

;// 4.畫棋盤的10條水平線

for(

int i=

1;i<=

10; i++

) p.

drawline

(chessarea,chessarea*i, chessarea*

9, chessarea*i)

;// 5.畫棋盤「士」行走的斜線

p.drawline

(chessarea*

4, chessarea, chessarea*

6, chessarea*3)

; p.

drawline

(chessarea*

6, chessarea, chessarea*

4, chessarea*3)

; p.

drawline

(chessarea*

4, chessarea*

8,chessarea*

6, chessarea*10)

; p.

drawline

(chessarea*

6, chessarea*

8,chessarea*

4, chessarea*10)

;// 6. 寫上楚河漢界

qpointf point

(chessarea*

2.6, chessarea*

5.7)

; p.

setfont

(qfont

("arial",25

)); p.

drawtext

(point,

"楚河 漢界");

}此時基本的棋盤樣子就出來了,樣子大概是這樣的:

通過步驟02和03,棋盤基本形狀就出來了,但和現實生活中的棋盤相比還欠缺一點瑕疵,於是,可以在 paintevent 函式裡面繼續新增以下**,增加棋盤上面棋子炮和兵的站位直角。(接著上面的第 6 步寫)

// 7. 直角折線

pen.

setwidth(4

);p.

setpen

(pen)

;for

(int j=

2; j>

0; j--);

p.drawpolyline

(points1,3)

; qpoint points2[3]

=;p.

drawpolyline

(points2,3)

; qpoint points3[3]

=;p.

drawpolyline

(points3,3)

; qpoint points4[3]

=;p.

drawpolyline

(points4,3)

;if(i <3)

/* 炮的井字格 */

; p.

drawpolyline

(points5,3)

; qpoint points6[3]

=;p.

drawpolyline

(points6,3)

; qpoint points7[3]

=;p.

drawpolyline

(points7,3)

; qpoint points8[3]

=;p.

drawpolyline

(points8,3)

;}}}

新增完棋子站位直角後,棋盤繪製成形了。和現實生活的棋盤就比較像,同時也美觀了很多,到此,棋盤的繪製就成功了。

象棋棋盤繪製主要是在 chessarea.cpp 中的 paintevent 重繪事件中實現 ,主要用到 qpainter 類的畫筆,其次是使用qpalette 類調整了棋盤witget背景色。接下來分析如何把棋子擺放上繪畫好的象棋棋盤上,下回見!

Qt開發人機象棋

3.qt開發象棋過程問題記錄 4.專案尚存在的問題 5.專案體驗位址 前段時間在網上看到有人在用qt做象棋,心血來潮準備自己也實現一下,先看一波效果圖 專案存在一些瑕疵 本程式較為簡單,設計上分為四個沒有繼承關係的類 由於博弈樹會很大,如果將所有的計算都放在widget類中計算會出現卡介面問題 所以...

中國象棋 QT版

由於當時對象棋人工智慧非常感興趣,索性自己藉著實踐qt又重新開發了乙個。這個版本通過參考圖書館借的 c 中國象棋入門與提高 從頭到尾自己徹徹底底做了一遍,雖然到最後因為有別的事沒有把啟發式演算法寫入,總的來說打菜鳥還是很輕鬆的。其實工作量真的挺大的,ui 後台全由自己設計。演算法方面 1 棋子的走法...

中國象棋AI實現02

過了好幾個星期了,我的兩人結對專案已經結束,老師拿去給好多人玩了 得出的結論是太坑 有很多需要改進的地方,準備將它作為乙個長期的練手專案在後續的學習中不斷的改進吧!首先介紹一下基礎所需的知識點 需要掌握c語言 windows程式設計 資料結構 演算法導論中的一些內容 使用工具 我使用了一張560 6...