mfc游戲編程實例
❶ 急求井字游戲的編程源代碼(MFC格式)
「井字棋」游戲(又叫「三子棋」),是一款十分經典的益智小游戲,想必很多玩家都有玩過。「井字棋」的棋盤很簡單,是一個3×3的格子,很像中國文字中的「井」字,所以得名「井字棋」。「井字棋」游戲的規則與「五子棋」十分類似,「五子棋」的規則是一方首先五子連成一線就勝利;「井字棋」是一方首先三子連成一線就勝利。
井字棋(英文名Tic-Tac-Toe)
井字棋的出現年代估計已不可考,西方人認為這是由古羅馬人發明的;但我們中國人認為,既然咱們都發明了圍棋、五子棋,那發明個把井字棋自然是不在話下。這些純粹是口舌之爭了,暫且不提。
想起小時候上課喜歡玩井字棋,只要一張草稿紙、一支筆、同桌兩人就可以玩了。上體育課,也可以拿著樹枝在沙坑裡玩。但一直感覺這游戲太簡單了,後來接觸了五子棋,著迷了一陣,但水平總是很差,便也不玩了。
一字棋游戲極小極大分析法
設有九個空格,由MAX,MIN二人對弈,輪到誰走棋誰就往空格上放一隻自己的棋子,誰先使自己的棋子構成「三子成一線」(同一行或列或對角線全是某人的棋子),誰就取得了勝利。
用叉號表示MAX,用圓圈代表MIN。
比如右圖中就是MIN取勝的棋局。
為了不致於生成太大的博弈樹,假設每次僅擴展兩層。估價函數定義如下:
設棋局為P,估價函數為e(P)。
(1) 若P對任何一方來說都不是獲勝的位置,則e(P)=e(那些仍為MAX空著的完全的行、列或對角線的總數)-e(那些仍為MIN空著的完全的行、列或對角線的總數)
(2) 若P是MAX必勝的棋局,則e(P)=+∞。
(3) 若P是B必勝的棋局,則e(P)=-∞。
比如P如右圖示,則e(P)=6-4=2
要注意利用棋盤位置的對稱性,在生成後繼節點的位置時,下列博弈結局
都是相同的棋局(在博弈中,一宇棋的分枝系數比較小起初是由於對稱性,而後是由於棋盤上未布子的空格減少所致)。圖3.15畫出了經過兩層搜索生成的博弈樹,靜態估值記在端節點下面,倒推值記在圓圈內。
由於右圖所示位置具有最大的倒推值,它應當選取為MAX的第一步(正好是MAX的最好的優先走步)。
現在我們假設MAX走了這一步,而MIN的回步是直接在X上方的空格里放上一個圓圈(對MAX來說這是一步壞棋,他一定沒有採用好的搜索策略)。下一步,MAX又在新的格局下搜索兩層,產生如圖3.16所示的搜索圖。
現在圖中MAX有兩個可能「最好的」優先走步,假設MAX走了圖上指明的那一步。而MIN為了避免立即敗北被迫走了另一步,從而產生如下棋局:MAX再次搜索,產生如圖3.17所示的樹。
在這棵樹中某些端節點(例如其中一個標記著A)代表MIN獲勝,因此它們的估值為—∞。當這些估值被倒推回去時,可看到MAX的最好的也是唯一能使他避免立即失敗的一個走步。現在,MIN可以看出MAX必然在他的下一走步中獲勝,因此,MIN只好認輸。
按極大極小演算法編程下一字棋的演示(右圖,可以點擊操作)...
我們就利用Visual Basic編寫一個「井字棋」的小游戲。
【設計思路】
首先,我們要知道,「井字棋」游戲是一款典型的棋類游戲,游戲時一方式是電腦,另一方是玩家。所以,這類游戲在開始時有兩種方式:一種是玩家先走;另一種是電腦先走。這是我們要考慮的第一個問題。
其次,由於與玩家對戰的是計算機,所以我們要編寫一個過程(Chuqi),它可以使程序模擬人的思維與人下棋(其實就是「人工智慧」的體現),這個Chuqi過程也是本游戲軟體的關鍵。此外,我們還要編寫兩個過程(Lianxian和Shuying),Lianxian過程用來時刻判斷棋盤中是否有三個棋子連成一線;Shuying過程用來判斷如果有三個棋子連成一線,是哪一方連成一線的,即判斷哪一方獲勝。
以上幾個問題就是該「井字棋」游戲實現的關鍵思路。....
❷ 用mfc設計貪吃蛇游戲源代碼,最好有解析
1.演算法
1. 首先,用一個結構體數組來標記蛇的X位置和Y位置,還有每一節的方向。用一變數標識蛇的長度。
2. 在蛇非轉彎的移動時用定時器來自動移動,不管蛇是哪種形狀,都只需在每次移動時先將各節向後移動(蛇尾舍棄,新的蛇尾由蛇尾的上一節代替):如蛇本身為snake[0]到snake[3],就是將snake[0]到snake[2]一起移動到snake[1]到snake[3]: 將 snake[2]的XY坐標賦值snake[3]的XY坐標 ,snake[1]的XY坐標 賦值給snake[2]的XY坐標 ,snake[0]的XY坐標 賦值給snake[1]的XY坐標 。再判斷蛇頭的方向,然後將蛇頭順著這個方向向前移動一格就是蛇頭snake[0]的XY坐標 。而蛇除蛇頭外各節的方向由函數SetDirection()來確定(明顯此種情況,蛇頭的方向不變),SetDirection()的思想是根據蛇的每一節的前一節的相對位置來確定本節的方向。(其實這個函數是多餘的,真正用到的只有蛇頭的方向)。
3. 蛇在轉彎時,也是各節一次向後移,蛇頭的位置順著轉彎的方向移動,方向由轉彎方向確定。
4. 蛇在吃到食物時,長度加一,蛇頭的位置變成食物的位置,方向不變。蛇的本身每節的XY位置都向後移。如蛇本身為snake[0]到snake[3], 就是將snake[0]到snake[3]一起移動到snake[1]到snake[4]。
5. 基於對話框的應用程序,響應按鍵消息需在PreTranslateMessage里,而不是像文檔視圖模式那樣在OnKeyDown里響應。
6. 每次蛇在轉彎時只能有一種方向按鍵能響應,即要麼左右轉,要麼上下轉。蛇頭方向向左或向右時,只能上下轉;蛇頭方向向上或向下時,只能左右轉。
7. 食物的位置由rand函數隨機產生。
2.添加如下函數和變數
1 void HuaFangGe(int bianChang, int gridShumu); //如在400*400的方格里繪制20*20個格子,則bianChang = 400;gridShumu = 20;
2 void InitSnackSite(); //初始化蛇的位置
3
4 int snakeLength; //表示蛇的長度
5 int foodX; //食物的X位置
6 int foodY; //食物的Y位置
7 bool start; //標志是否開始
8 bool reStart; //標志是否重新開始
9
10 struct SNAKE
11 {
12 int x;
13 int y;
14 char direction; //某位置的方向為前一個位置相對於該位置的方向,由SetDirection()確定
15 }snake[200];
16
17 void DrawRed(int x, int y); //指定點0*0到20*20,畫相應顏色,下同(紅頭綠身藍尾)
18 void DrawGreen(int x, int y);
19 void DrawBlue(int x, int y);
20 void DrawBlack(int x, int y); //根據SetFoodXY()所確定的foodX和foodY來畫食物。
21
22 void DrawSnakeFood(); //根據數組snakeSite數組的標識信息類繪制蛇的形狀位置顏色。
23 void SetFoodXY(); //隨機繪制食物的XY位置
24
25 bool leftRight; //確定是否能上下走(蛇本身在上下走,再按上下就無用了)
26 bool upDown; //確定是否能左右走(蛇本身在左右走,再按左右就無用了)
27
28 void MoveSite(); //蛇移動過程中,設置「除蛇頭」外各節的x和y的位置,順序前移。
29 void SetDirection(); //蛇移動過程中,設置「除蛇頭」外各節的方向
30
31 void TurnLeft(); //當蛇左轉時
32 void TurnRight(); //當蛇右轉時
33 void GoUp(); //當蛇向上時
34 void GoDown(); //當蛇向下時
可以參考這里:http://www.cnblogs.com/jncpp/archive/2012/07/24/2606908.html
【原創】基於MFC的 貪吃蛇 小游戲的實現,附源碼下載