開發工具:VC++
1.1新建一個MFC工程
1.2往這個工程裏面添加一些資源,裏面的內容暫時可以先不管,等到後面我們再往裏面添加東西
1.3修改MainFrm.h一些變量,供我們後面使用
1.4開始定義變量
1.5在」工程名+View.cpp」的文件中開始寫我們的方法
void CFiveChessView::OnDraw(CDC* pDC)
{
CFiveChessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// 1.修改背景顏色
//1.1 創建一個畫刷
CBrush mybrush;
//1.2 創建畫刷的顏色
mybrush.CreateSolidBrush(RGB(192,192,192));
//1.3 設置你要刷塗的矩陣區域
CRect myrect(0,0,1200,800);
//1.4 pDC就是在這裏就是一個獲取到當前窗口的指針,利用FillRect函數對窗口進行塗刷
pDC->FillRect(myrect,&mybrush);
//2.開始畫棋盤上面的框線
//2.1先定義一隻畫筆
CPen mypen;
//2.2 設置畫筆
// 第一個參數 表示樣式 PS_SOLID表示實線 PS_DASH表示虛線
// 第二個參數 表示畫筆的寬度
// 第三個參數 表示畫筆的顏色
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
//2.3選擇這個對象. 其實這個函數會返回上一次的被選對象指針,以便我們做完任務時返回它
pDC->SelectObject(&mypen);
int WZQ_LENGTH = 20; //定義每個框的長度爲20
for(int i=0;i<=20;i++){
//行
//移到畫線的起始點
pDC->MoveTo(40,40+i*WZQ_LENGTH);
//畫線的終點
pDC->LineTo(40*11,40+i*WZQ_LENGTH);
//列
pDC->MoveTo(40+i*WZQ_LENGTH,40);
pDC->LineTo(40+i*WZQ_LENGTH,40*11);
}
//3.重畫的時候顯示棋子
//3.1創建一個CDC對象,CDC對象提供了處理窗口繪圖的工具
CDC Dc;
//CreateCompatibleDC這個函數表示創建一個與設備兼容的設備描述表(DC),設備描述表包含了繪製屬性等相關信息
//AfxMessageBox表示消息的提示框
if(Dc.CreateCompatibleDC==FALSE)AfxMessageBox("Can't create DC");
//3.2開始重繪製
for(int n=0;n<20;n++){
for(int m=0;m<20;m++){
//我們用1表示白棋
if(WZQ_BOARD[n][m]==1){
//選擇我們繪製的圖形
Dc.SelectObject(m_bmwhite);
//利用pDC進行繪製.BitBlt函數的作用就是從源設備中的位圖複製到目標設備
//第1,2個參數是目標區域的x和y座標
//第3,4個參數是在目標設備中繪製位圖的寬度和高度
//第5個參數表示源設備中的指針對象
//第6,7個參數表示源設備中的x和y開始複製位圖到目標設備
//第8個參數表示光柵操作代碼 這裏選的SCPCOPY表示直接複製
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
//用-1表示黑棋
else if(WZQ_BOARD[n][m]==-1){
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
}
}
}
//構造器裏面的函數
CFiveChessView::CFiveChessView()
{
// TODO: add construction code here
//1.導入鼠標的圖像和棋子在棋盤中的圖像
//AfxGetApp()這個函數能夠得到當前應用程序的指針
hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1);
hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2);
m_bmwhite.LoadBitmap(IDB_WHITE);
m_bmblack.LoadBitmap(IDB_BLACK);
//2.整理棋盤,將所有的位置賦值爲0,0表示空,-1表示黑棋,1表示白棋
for(int n=0;n<20;n++){
for(int m=0;m<20;m++){
WZQ_BOARD[n][m]=0; //初始化所有的位置爲空
}
}
//3.白棋先下,colorwhite爲true時白棋先下,false時表示黑棋先下
colorwhite = true;
}
2.1鼠標按下的監聽事件
在這個文件的最後面找到
//這裏是鼠標按下的處理函數OnLButtonUp
void CFiveChessView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
}
系統自動生成的代碼不要去動它
//這裏是鼠標按下的處理函數
void CFiveChessView::OnLButtonUp(UINT nFlags, CPoint point) //point這個點就是鼠標點擊的點
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
CDC *pDC = GetDC();
CDC Dc;
//如果 設備描述表Dc 創建失敗
if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");
//1.將這個點的座標化成棋盤上每個交點座標
int px = (point.x-30)/20;
int py = (point.y-30)/20;
//2.對按鍵的座標的合理性進行判斷
if(px>=0&&px<=20&&py>=0&&py<=20){
//2.1如果是白棋
if(colorwhite){
//並且這個位置沒有被按下
if(WZQ_BOARD[px][py]==0)WZQ_BOARD[px][py] = 1;
//在這個位置畫一個棋子
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
//換成黑棋下
colorwhite = false;
}
//2.2否則是黑棋
else if(WZQ_BOARD[px][py]==0){
WZQ_BOARD[px][py] = -1;
//在這裏畫一個棋子
Dc.SelectObject(m_bmblack);
pDC->BitBlt(px*20+30,py*20+30,160,160,&Dc,0,0,SRCCOPY);
//換成白棋下
colorwhite = true;
}
}
}
在這個文件的最下面可以看到
BOOL CFiveChessView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
return CView::OnSetCursor(pWnd, nHitTest, message);
}
原來有的代碼我們不用去動它
BOOL CFiveChessView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
//nHitTest這個參數表示擊中的區域,HTCLIENT表示當前的客戶區
if(nHitTest==HTCLIENT){
//如果現在是白棋正在下
if(colorwhite)SetCursor(hcursorwhite);
//黑棋
else SetCursor(hcursorblack);
return 1;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
這樣我們就基本實現了五子棋的下,這裏沒有提供電腦判斷是否有一方勝利和人機對戰的功能,適合初學者學習MFC的相關API