999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于MFC的黑白棋的設計與實現

2022-08-29 06:59:06鐘闖
電腦知識與技術 2022年20期
關鍵詞:程序游戲

鐘闖

(湖北大學計算機與信息工程學院,湖北武漢430062)

1 概述

黑白棋,又名翻轉棋。黑白棋由于規則簡單,易于上手,逐漸在各個國家流行起來。游戲通過翻轉對方的棋子成為自己的棋子,最后以棋盤上誰的棋子多來判斷勝負。這個棋的規則雖然簡單易懂,上手容易,但是它的變化又非常復雜。黑白棋的棋盤是64(8×8) 個格子,初始會有2 黑2 白放在棋盤的正中央。黑白棋的游戲規則是:1)不管黑方或白方,下的棋子必須要造成棋子的翻轉,如果兩個相同的棋子相鄰中間沒有可以翻轉的棋子則一方不可以下子。2)如果一方的下一步無法造成棋子的翻轉就將下棋權移交給另一方。3)當棋盤下滿或者兩方都沒棋子可以轉換的時候,游戲結束,統計棋盤上雙方的棋子,誰剩余棋子多誰勝利。由于黑白棋的特殊性,就導致下子的時候不能像圍棋或五子棋那樣隨意下子到棋盤邊緣沒有棋子的位置,這就給算法的實現增加了難度。

MFC 是微軟公司創建的C++的基礎類庫,目的是減少Win32編程開發的難度。這個類庫將Windows編程中的API封裝成C++類,這些封裝是輕量級封裝,與原來的C 語言的Win‐dows編程速度相比并沒損失多少,所以MFC在出來的時候,企業對其很是追捧,但過了幾年后C#中的Winform、C++圖形框架Qt 等對MFC 的沖擊,又由于MFC 本身的缺陷導致MFC 逐漸沒落,但想弄清楚Windows 中的消息和繪制機制就必須學習

MFC。

GDI是圖形設備接口英文的縮寫,它存在的目的是減少程序員繪圖的工作量。原來的程序員在程序中繪圖時,必須考慮底層硬件的驅動,這無疑加大了程序員的工作量和思考時間。GDI出現后讓程序員的工作成本大大減少,讓程序員不用再考慮底層的硬件驅動,直接使用簡便的圖形接口來操作復雜的底層繪制[1]。

雖然現在MFC和GDI很少人直接使用,但它們在計算機技術發展的歷史上有著舉足輕重的基石作用,很多桌面開發技術都是由這兩者拓展而來,所以本文將用MFC和GDI來實現黑白棋游戲。

2 黑白棋游戲功能分析

游戲功能分為3個模塊:

1)繪制模塊,主要包括初始化繪制棋盤,棋子和游戲提示信息。

2)游戲判斷模塊,主要包括對雙方下子位置判斷,判斷游戲是否結束,判斷一方能否下子。

3)游戲控制模塊,主要包括鍵盤交互,人機對戰,統計雙方棋子數量和重置游戲。

其功能圖如圖1。

圖1 黑白棋功能圖

3 黑白棋游戲各個模塊的總體概述

繪制模塊。功能主要包括初始化棋盤大小,用GDI的繪制函數繪制棋子,游戲提示信息等。首先在800×680大小的窗口中將窗口640×640的區域分割成64個格子,并將格子的坐標信息放在一個二維數組m_rcSquares里方便使用繪制函數進行繪制,窗口底部的空位用于顯示游戲的基本信息。接著用一個二維數組表示對應格子里是否下了棋子,1 代表黑棋,2 代表白棋,0則表示沒有下棋,再用一個二維數組表示其余的空格能否下棋子,能則為1,不能則為0,初始棋盤中央是有2黑2白。在棋盤底端顯示游戲的基本信息,用來顯示當前棋盤黑白雙方棋子的數量等信息。

游戲判斷模塊。此模塊主要是為了判斷雙方下子位置的合法性,眾所周知,黑白棋一旦下子就必須造成棋子的轉換。所以首先需要判斷下子位置能不能造成棋子的轉換。其次,還要判斷雙方是否可以下棋,一旦雙方的下一步都無法造成棋子的轉換,那么游戲結束。如果只是一方無法下棋而另一方可以,那么要交換下棋方。最后,棋盤的64個格子放滿了棋子則游戲結束。

游戲控制模塊。這個模塊主要的功能是監視鍵盤和鼠標的輸入,根據用戶的輸入來進行相應的反應,在MFC中使用消息映射來實現對用戶鍵盤或者鼠標輸入的響應[2]。游戲中,鼠標左鍵是黑棋下子,鼠標右鍵是白棋下子(一開始是黑棋先下),鼠標中鍵是開啟人機模式,在進入人機模式后,人機是白子,如果想推出人機模式就點擊鼠標右鍵退出人機模式。F1鍵是重置游戲,F2鍵是游戲規則說明。該程序中的人機對戰主要是采用的是貪心算法,所謂貪心算法,就是每一次的行動都是選擇最優解[3],在這個游戲中就是人機每次下棋的時候選擇盡可能多地轉換棋子的位置,而不考慮之后的結果,直到游戲結束。

4 黑白棋游戲核心內容詳述

1)程序結構

該游戲程序并沒有使用MFC經典的文檔視圖結構,而是使用了比較簡便的方法。通過繼承MFC 中的CWinApp 類和CWnd類來簡化程序。在繼承CWinApp類后,需要在實現類中重寫它的虛函數InitInstance[4]。虛函數是實現多態的必要條件,可以通過父類的指針來找到具體實現虛函數的子類,如果子類沒有實現,則只調用父類的定義虛函數[5]。程序內,類和類中函數概述如表1。

表1 程序中核心函數和類介紹

2)初始化和繪制功能詳述

在窗口類CMyMainWindow 的構造函數中,首先加入了初始化棋盤的代碼,這個時候只能先構建棋盤在窗口中位置坐標并將其放到二維數組中,因為此時窗口還沒有建立所以不能在此類的構造函數中直接加入繪制圖形函數,同時將棋盤中間的4個格子設置為已有棋子放置,保存在二維數組中。之后還是在構造函數加入窗口的初始化代碼,設置該窗口的大小為800×600。最后在類CMainWindow 中的消息響應函數OnPaint 中添加對棋盤線,4個初始棋子(2黑2白,位置在棋盤中央)的繪制。

除了上面初始化繪制的時候不需要判斷,其余每次繪制都需要通過二維數組m_iChess來判斷對應棋盤位置有沒有棋子。有時需要棋盤位置上有棋子的時候才能繪制,因為這個時候要通過繪制來實現棋子顏色反轉的效果,有時也需要棋盤位置上沒有棋子的時候才能繪制,因為這個時候是下子,必須保證下子位置沒有棋子。

該程序通過成員變量m_iBlackChess 和m_iWhiteChess 來統計棋盤上黑棋和白棋的數量,通過成員變量m_iChessTotal統計棋子總數。這3 個成員變量通過函數void DisplayGameInfo()來繪制到窗口下方,來實時顯示當前游戲信息。

3)游戲判斷功能詳述

這個功能可以說是游戲核心中的核心了,有了這個功能黑白棋的規則才能付諸實現。首先當一方下子的時候,要判斷他下子的8個方向(上,下,左,右,上左,下左,上右,下右)有沒有和下棋方一樣的棋子同時中間必須夾著另一方的棋子,在這種情況下才可以下棋,否則就無法下棋。當然不是所有的格子都需要判斷8 個方向,比如棋盤的4 個角只用判斷3 個方向(以右上角為例,只用判斷左,下左,下3個方向),除了4個角,棋盤邊緣的格子也只用判斷3 個方向(以最右一列為例,只用判斷左,上左,下左3 個方向)。表1 中的函數BOOL FindRightChess(int iLine,int iVertical,int ChessType)函數中的代碼是查找落子位置右邊方向的相同棋子,其他位置的查找函數也是一樣的。其次,前一棋子落完子后,需要立即判斷當前棋盤空位能不能再下接下來一方的棋子(比如前一方是白子,接下來就要判斷黑子有沒有地方下了),如果沒有合法的位置,跳過當期下棋方,回到前一下棋方繼續下棋,這個功能所對應的函數就是表1中的BOOL ChessRevarsal(int iLine,int iVertical)函數。除此之外已經下過棋子的位置不能再下子,通過類成員變量m_iChess,這個變量是個8×8的bool類型的二維數組,用于存儲64個棋盤位置有沒有棋子,所以每次下子前需先遍歷該二維數組,然后再判斷下棋位置是否合法。當兩方的下一步都不能造成棋子轉換或者棋盤下滿了的時候游戲結束。通過成員變量m_iChess‐Total統計棋子總數,如果棋子總數達到了64個,則游戲結束。

4)游戲控制功能

這個功能主要是管理鍵盤交互,人機對戰和游戲基本信息的顯示。在MFC中鍵盤和鼠標所響應的函數是已經規定好的,只需要在窗口類中重寫對應的方法就可以了。在該程序中,需重寫鍵盤F1,F2按鍵被按下的消息事件,鼠標左鍵,鼠標右鍵,鼠標中鍵被按下的事件。注意,在鼠標點擊的事件響應中要加入對鼠標點擊時坐標的判斷,有可能鼠標點擊的時候剛好點擊到了棋盤線上,通過MFC 中CRect 類中的PtInRect 方法就可以進行判斷。在之前程序的初始化中,已經將棋盤中每個格子的坐標放在了二維數組中,這個數組類型是CRect 所以通過遍歷數組然后調用該方法。

通過按下鼠標中鍵進入人機對戰,在人機對戰中,人機使用的是白色棋子,玩家使用的是黑色棋子,人機下子所采用的算法是比較經典的貪心算法,就是在玩家下完棋子后查找轉換棋子最多的位置,所用的函數是將上面的BOOL FindRightChess(int iLine, int iVertical,int ChessType)等7 個函數進行改造就可以了。上面的FindRightChess函數是在查找的時候同時進行棋子的翻轉,而對于人機來說則是先去找能轉換棋子最多的位置,這個過程不需要進行翻轉,等找到了合適的位置,再調用繪制函數,除了某些細節不一樣,其余代碼都是和人下棋的代碼是一樣的。重置函數ResetGame(),這個函數在棋盤滿了,雙方無法下子和玩家按下F1鍵的時候啟用。在函數內部將二維數組初始化到游戲開始的狀態然后調用MFC的窗口更新函數進行窗口圖形刷新,當窗口刷新時程序會自動調用繪制函數。

5 程序測試與結果

該程序基本實現了黑白棋游戲的基本功能,運行界面如圖2所示。

圖2 黑白棋運行界面

可以看到現在是由白棋下,之前的黑棋已經造成了翻轉,底部的信息提示現在棋盤上的情況和人機對戰是否開啟。當玩家覺得自己下得不好時,可以按下鍵盤上的F1鍵重置游戲,但前提是你要和你的對手商量好。當你找不到對手跟你一起下時可以按下鼠標中鍵進行人機對戰。當游戲雙方不清楚游戲規則時可以按下鍵盤上的F2鍵了解游戲規則。

6 結束語

該程序通過繼承MFC 提供的類和實現MFC 消息響應函數,設計并實現了一個黑白棋游戲。程序的總體結構并不復雜,但內容卻集合了數據結構、算法、圖形繪制等復雜內容。選擇一個好的數據結構能提升數據組織效率,選擇一個好的算法能提升程序運行速度。除此之外,擁有良好的代碼風格能夠使程序言簡意賅同時在程序出BUG 的時候能快速找到位置進而提升工作時的效率。

猜你喜歡
程序游戲
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
游戲
數獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
第八章直接逃出游戲
小學科學(2015年7期)2015-07-29 22:29:00
主站蜘蛛池模板: 69精品在线观看| 亚洲国内精品自在自线官| 制服丝袜 91视频| 狠狠色狠狠综合久久| 秘书高跟黑色丝袜国产91在线 | 欧美日韩91| 国产99在线| 91亚瑟视频| 午夜丁香婷婷| 国产成人亚洲精品无码电影| 欧美成人午夜视频| 91丝袜美腿高跟国产极品老师| 国产资源站| 无码在线激情片| 香蕉久人久人青草青草| 国产导航在线| 国产成人综合日韩精品无码首页| 91久久精品日日躁夜夜躁欧美| 国产精品一线天| 国产网站黄| 亚洲国产中文综合专区在| 婷婷六月激情综合一区| 香港一级毛片免费看| 青青久久91| 亚洲视屏在线观看| 免费高清毛片| 国产三级精品三级在线观看| 中文字幕无码制服中字| 在线观看热码亚洲av每日更新| 波多野结衣一区二区三视频| 亚洲婷婷丁香| 在线免费观看a视频| 免费国产在线精品一区 | 浮力影院国产第一页| 欧美成人一级| 国产女人爽到高潮的免费视频| 亚洲免费毛片| 国产微拍一区二区三区四区| 日本午夜在线视频| 欧美性爱精品一区二区三区| 成人综合网址| 日韩a级片视频| 无码精油按摩潮喷在线播放| 狠狠色丁香婷婷| 亚洲成人精品在线| 国产一区二区影院| 伊人久久大香线蕉影院| 日韩一区二区在线电影| 最新国产麻豆aⅴ精品无| 波多野结衣中文字幕一区二区| 无码国内精品人妻少妇蜜桃视频 | 亚洲日韩在线满18点击进入| 大香网伊人久久综合网2020| 综合天天色| 欧美不卡视频在线观看| 伊人久热这里只有精品视频99| 日韩欧美中文字幕在线韩免费| 99热这里只有免费国产精品| 国产成人1024精品下载| 欧美精品H在线播放| 亚洲精品天堂自在久久77| 97国产一区二区精品久久呦| 亚洲日韩每日更新| 亚洲中文字幕无码mv| 色香蕉影院| 九九免费观看全部免费视频| 国产精品综合久久久| 国产三区二区| 中文无码毛片又爽又刺激| 蝌蚪国产精品视频第一页| 欧美97色| 波多野结衣一区二区三区四区 | 亚洲丝袜中文字幕| jizz在线免费播放| 亚洲欧美另类日本| 国产成人精品免费视频大全五级| 美女无遮挡免费视频网站| 久久精品一品道久久精品| 欧美亚洲另类在线观看| 97精品伊人久久大香线蕉| 国产欧美在线观看一区| 日韩在线欧美在线|