基於MFC的五子棋(詳細介紹,適合初學者)

基於MFC的五子棋遊戲

開發工具:VC++

1. 建立界面,即先建立一個棋盤

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個參數是目標區域的xy座標

//3,4個參數是在目標設備中繪製位圖的寬度和高度

//5個參數表示源設備中的指針對象

//6,7個參數表示源設備中的xy開始複製位圖到目標設備

//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.白棋先下,colorwhitetrue時白棋先下,false時表示黑棋先下

colorwhite = true;

}


2. 爲界面添加一些事件(鼠標按下,光標改變)

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