VC編譯的五子棋遊戲核心演算法分析 附原始碼

2021-06-05 21:21:08 字數 3685 閱讀 5701

1、 介面框架設計

整個遊戲的介面是建立的單文件的基礎上。

很多小遊戲不是建立在對話方塊的基礎上,而是在單文件或是自己建立視窗的基礎上。

因為它們自動提供了選單欄和狀態列,方便進行遊戲設定和控制項。

(1)函式lresult cmainframe::defwindowproc(uint message, wparam wparam, lparam lparam)

進行處理的,如最大化、最小化、滑鼠左鍵按下

(2) cwuziqiview類的響應訊息。

通過它的有如:左鍵單擊、右鍵單擊、右鍵雙擊

繪製介面的地方是在

void cwuziqiview::ondraw(cdc* pdc)

這裡不做介紹,大家可以自行去看.

2、 邏輯類設計

由於五子棋遊戲中的角色不多只有白棋子、黑棋子: chess

再加上棋盤: overall

主要的演算法集中在onlbuttondown函式裡,下面貼出此段**:

void cwuziqiview::onlbuttondown(uint nflags, cpoint point) 

// 判斷當前的位置是不是五子長連

int win = all.winchanglian(x, y);

if(win == 1) // 剛好有5個棋子顏色一樣,則黑棋勝

if(win == 0 && whohasjinshou==1) // 少於5個棋子顏色一樣,且自己是禁手了,黑棋輸

// 雙三且是禁手

if(all.shuangsan(x,y) == 1&& whohasjinshou == 1)

以下是遊戲的規則:

//以下是規則判斷,雙三,雙四都使禁手

//活三定義:再下一步成為活四

//活四定義:有多於一種的方法成為五顆

//衝四定義:只有一步能夠成為五顆

//同時形成兩個以上的活三,衝四,或者長連就是禁手

它們對應的函式如下:

1、判斷是不是雙衝四

// 判斷是不是雙衝四

// 衝四定義:只有一步能夠成為五顆

// 返回值:

//  1 是雙衝四

// 0 不是雙衝四

int overall::shuangsi(int x, int y)

// 清除臨時填充的棋子

allqipan[ncountx][y] = 0;

} // 橫向判斷,向左

for(ncountx=x + 1; allqipan[ncountx][y] == ncolor && ncountx<=17; ncountx++);

if(ncountx <= 17 && allqipan[ncountx][y] == 0)

allqipan[ncountx][y]=0;

} recordx = recordy = -50;

/*******************************===豎的方向***********************************===*/

// 豎的,向下

for(ncounty = y; allqipan[x][ncounty] == ncolor && ncounty >= 0; ncounty--);

if(ncounty >= 0 && allqipan[x][ncounty] == 0)

allqipan[x][ncounty]=0;

} // 豎的,向上

for(ncounty = y+1; allqipan[x][ncounty] == ncolor&&ncounty<=17;ncounty++);

if(ncounty <= 17 && allqipan[x][ncounty] == 0)

}allqipan[x][ncounty] = 0;

} recordx=recordy=-50;

/*******************************===左右的方向***********************************===*/

// 左右方向,先左

for(ncountx=x, ncounty=y; allqipan[ncountx][ncounty]==ncolor && ncountx >= 0 && ncounty>=0; ncountx--,ncounty--);

if(ncounty>=0&&ncountx>=0&&allqipan[ncountx][ncounty]==0)

allqipan[ncountx][ncounty]=0;

} // 左右方向,再右

for(ncountx=x+1,ncounty=y+1;allqipan[ncountx][ncounty]==ncolor&&ncountx<=17&&ncounty<=17;ncountx++,ncounty++);

if(ncounty<=17&&ncountx<=17&&allqipan[ncountx][ncounty]==0)

}allqipan[ncountx][ncounty]=0;

} recordx=recordy=-50;

/*******************************===右左的方向***********************************===*/

// 右左

for(ncountx=x,ncounty=y;allqipan[ncountx][ncounty]==ncolor&&ncountx>=0&&ncounty<=17;ncountx--,ncounty++);

if(ncounty>=0&&ncountx<=17&&allqipan[ncountx][ncounty]==0)

allqipan[ncountx][ncounty]=0;

} for(ncountx=x+1,ncounty=y-1;allqipan[ncountx][ncounty]==ncolor&&ncountx<=17&&ncounty<=17;ncountx++,ncounty--);

if(ncounty<=17&&ncountx>=0&&allqipan[ncountx][ncounty]==0)

}allqipan[ncountx][ncounty]=0;

} /*******************************===結果***********************************===*/

// 有兩個或兩個以上可能產生雙四

if(ncount >= 2)

return 1;

else

return 0;

}

2、 判斷當前的位置是不是五子長連

// 判斷當前的位置是不是五子長連

int overall::winchanglian(int x, int y)

3、判斷是不是雙三

五子棋核心演算法

五子棋是一種受大眾廣泛喜愛的遊戲,其規則簡單,變化多端,非常富有趣味性和消遣性。這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構 評分規則 勝負判斷方法和搜尋演算法過程。一 相關的資料結構 關於盤面情況的表示...

五子棋的核心演算法

五子棋是一種受大眾廣泛喜愛的遊戲,其規則簡單,變化多端,非常富有趣味性和消遣性。這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構 評分規則 勝負判斷方法和搜尋演算法過程。一 相關的資料結構 關於盤面情況的表示...

五子棋的核心演算法

五子棋是一種受大眾廣泛喜愛的遊戲,其規則簡單,變化多端,非常富有趣味性和消遣性。這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構 評分規則 勝負判斷方法和搜尋演算法過程。一 相關的資料結構 關於盤面情況的表示...