畢業(yè)論文-五子棋游戲系統(tǒng)設(shè)計與實現(xiàn)_第1頁
畢業(yè)論文-五子棋游戲系統(tǒng)設(shè)計與實現(xiàn)_第2頁
畢業(yè)論文-五子棋游戲系統(tǒng)設(shè)計與實現(xiàn)_第3頁
畢業(yè)論文-五子棋游戲系統(tǒng)設(shè)計與實現(xiàn)_第4頁
畢業(yè)論文-五子棋游戲系統(tǒng)設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 PAGE 1河北農(nóng)業(yè)大學 本科畢業(yè)論文(設(shè)計)題 目: 五子棋游戲系統(tǒng)設(shè)計與實現(xiàn) 學 院: 信息科學與技術(shù)學院 專業(yè)班級: 軟件工程0902班 學 號: 學生姓名: 指導(dǎo)教師姓名: 指導(dǎo)教師職稱: 講師 2013 年 5 摘 要人工智能是研究、開發(fā)用于模擬、延伸和擴展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門新的技術(shù)科學。從人工智能開始發(fā)展到現(xiàn)在,已經(jīng)延伸深并深入到各個領(lǐng)域,各個行業(yè)。其中,計算機人機對弈就是人工智能的主要成果之一。五子棋游戲是一種兩人對弈的純策略型棋類游戲,由于規(guī)則簡單,容易上手,老少皆宜,而且趣味橫生,引人入勝,深受人民的喜愛。自從計算機實現(xiàn)以來,五子棋就一直受到廣大電腦

2、玩家的青睞。而五子棋人機對弈,是計算機人機對弈中比較重要的一種。本文主要介紹基于MFC的五子棋人機對弈系統(tǒng)的設(shè)計與實現(xiàn)過程。首先介紹了此系統(tǒng)的背景分析,國內(nèi)外現(xiàn)狀。接著對系統(tǒng)進行需求分析,確定系統(tǒng)的業(yè)務(wù)需求,性能功能。對C+和VC+6.0開發(fā)環(huán)境進行了簡單的介紹。然后對系統(tǒng)總的設(shè)計進行了詳細的描述。最后,對各個功能模塊進行了詳細的論述,在系統(tǒng)的設(shè)計中著重對人機對戰(zhàn)的設(shè)計,滿足了系統(tǒng)運行。本系統(tǒng)意在于研究人工智能的算法。通過對算法的分析和研究,讓我們對于人工智能有一定的了解。同時對于本身,也有助于增強思維能力,提高智力。關(guān)鍵詞:人工智能,計算機人博弈,五子棋,算法AbstractArtifici

3、al intelligence is one of new science that research, development for analog extension and expansion of human intelligence theory, methods, technology and applications. From artificial intelligence to the present, Artificial intelligence has been extended deep into the various fields and industries.

4、Among it, human-computer chess is one of the major achievements of artificial intelligence. The Gobang is a games of two person paly,and pure strategy board games, Because the simple rules, easy use, all ages paly, and amusing, fascinating, it loved by the people. Since the computer implementation,

5、Gobang has been pro-gaze of the majority of computer players. Gobang man-machine chess is the man-machine chess more important one.This paper describes the MFC-based Gobang man-machine chess system design and implementation process,F(xiàn)irst it analysises the background of this system, the status quo at

6、 home and abroad. Then the system needs analysis, determine the systems business requirements, performance features. A brief introduction to C + + and VC + +6.0 development environment. Then a detailed description of the design of the overall system. Finally, the various functional modules are discu

7、ssed in detail in the design of the system focuses on the design of man-machine players to meet the system is running.The intention of this system is to study artificial intelligence algorithms. Algorithm analysis and research, let us have a certain understanding for artificial intelligence. For its

8、elf, but also help to enhance thinking skills, improve intelligence.Key words: Artificial Intelligence, Man-machine Cchess Computer, Gobang, Algorithm目錄 TOC o 1-3 u 摘 要 PAGEREF _Toc358386008 h 1Abstract PAGEREF _Toc358386009 h 21 研究五子棋游戲系統(tǒng)的背景和意義 PAGEREF _Toc358386010 h 11.1背景分析 PAGEREF _Toc358386011

9、 h 11.2目的和意義 PAGEREF _Toc358386012 h 12 系統(tǒng)需求分析 PAGEREF _Toc358386013 h 22.1業(yè)務(wù)需求 PAGEREF _Toc358386014 h 22.1.1 功能要求 PAGEREF _Toc358386015 h 22.1.2性能需求 PAGEREF _Toc358386016 h 32.2系統(tǒng)平臺需求 PAGEREF _Toc358386017 h 32.2.1 系統(tǒng)開發(fā)平臺 PAGEREF _Toc358386018 h 32.2.2 語言和開發(fā)環(huán)境的介紹 PAGEREF _Toc358386019 h 33 系統(tǒng)的基本設(shè)計

10、 PAGEREF _Toc358386020 h 53.1系統(tǒng)流程圖 PAGEREF _Toc358386021 h 53.2系統(tǒng)類圖 PAGEREF _Toc358386022 h 73.3主界面的實現(xiàn) PAGEREF _Toc358386023 h 83.4人人對戰(zhàn) PAGEREF _Toc358386024 h 123.5其他一些小功能 PAGEREF _Toc358386025 h 143.5.1和棋的代碼 PAGEREF _Toc358386026 h 143.5.2輸贏判斷的代碼 PAGEREF _Toc358386027 h 143.5.3重新開局的代碼 PAGEREF _Toc

11、358386028 h 164 人工智能的設(shè)計與實現(xiàn) PAGEREF _Toc358386029 h 184.1難度為初級的現(xiàn)實 PAGEREF _Toc358386030 h 184.1.1.基本思路 PAGEREF _Toc358386031 h 184.1.2.代碼實現(xiàn) PAGEREF _Toc358386032 h 194.2難度為中級的實現(xiàn) PAGEREF _Toc358386033 h 214.2.1.基本思路 PAGEREF _Toc358386034 h 214.2.2.代碼實現(xiàn) PAGEREF _Toc358386035 h 22總結(jié) PAGEREF _Toc35838603

12、6 h 27致 謝 PAGEREF _Toc358386037 h 28參考文獻 PAGEREF _Toc358386038 h 29 PAGE26 1 研究五子棋游戲系統(tǒng)的背景和意義娛樂是人類不可或缺的生活內(nèi)容?,F(xiàn)在,在網(wǎng)絡(luò)上各種游戲鋪天蓋地,本人將學以致用,用所學的C+編程,開發(fā)一款簡單又使用的單擊游戲,五子棋。1.1背景分析五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為“連珠”,英譯為“Ren-ju”,英文稱之為“Gobang”或“FIR”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。五子棋不僅能增強

13、思維能力,提高智力,而且變化多端,非常富有趣味性,因此為人民群眾所喜聞樂見。人工智能是利用機器來模擬或者實現(xiàn)人類的智能。主要研究如何用人工的方法和技術(shù),使用各種自動化機器或智能機器(主要指計算機)模仿、延伸和擴展人的智能,實現(xiàn)某些機器思維或腦力勞動自動化。人工智能在最近幾年發(fā)展十分迅速。人們不斷的研究出機器,使它能勝任人們能做的一些復(fù)雜的事,或是一些人們不適宜做的事,如水下探測等。人工智能始終處于計算機發(fā)展的最前沿。高級計算機語言、計算機界面及文字處理器的存在或多或少都得歸功于人工智能的研究。人工智能研究帶來的理論和洞察力指引了計算技術(shù)發(fā)展的未來方向。現(xiàn)有的人工智能產(chǎn)品相對于即將到來的人工智能

14、應(yīng)用可以說微不足道,但是它們預(yù)示著人工智能的未來。而隨著人們工作的加大,運動的時間也越來越少,大部分呆在家里或是工作的地方。這樣人們就通過上網(wǎng)、購物等之類的事來取代生活中的不足。當然也有一部分群體在玩游戲之類的了。而五子棋由于其經(jīng)典、易學等。深受人們的喜愛。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學的高深學問“陰陽易理”;它既有簡單易學的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理

15、的結(jié)晶。1.2目的和意義五子棋是從剛開始的民間的競技小游戲,到現(xiàn)在的國際大型比賽,一直深受人們的喜愛。同時通過對人機對戰(zhàn)五子棋的研究和開發(fā),可以更好對人工智能的了解,這種將包含感知、思維等各種智能集于一身的技術(shù),將為并正在為人類做著巨大貢獻,人類對它的研究更加透徹也將更加全面,各種還未涉及或研究并不成熟的人工智能將被開發(fā),使人工智能技術(shù)更趨于成熟,使被賦予人工智能的機器們更趨于生命化,對以后人工智能的提高和發(fā)展有著深遠的影響。同時由于自己開發(fā)系統(tǒng),對于自身的編碼能力也會有很大的提高。而五子棋是一種雙人博弈的游戲,能夠更加的了解五子棋,增強自身思維能力,提高智能,修身養(yǎng)性,一舉多得。2 系統(tǒng)需求

16、分析為了開發(fā)出真正滿足用戶需求量的軟件產(chǎn)品,首先必須知道用戶的需求。軟件需求中包括了多個方面來說明用戶需求。在這一章中,主要從以下幾方面來說明系統(tǒng)的需求。2.1業(yè)務(wù)需求此游戲系統(tǒng)為智力游戲,適合于各類游戲愛好者。由于其經(jīng)典性,各類人士都愛玩。人們在與電腦對戰(zhàn)時,也會體會到自己的智力也會有所提升。也可以人人對戰(zhàn),既能夠提升樂趣,增加智力,也是綠色環(huán)保的體現(xiàn)。2.1.1 功能要求圖 2-圖 2-1 五子棋功能模塊圖初級中級五子棋游戲人人對戰(zhàn)人機對戰(zhàn)(1)人機對戰(zhàn)下子初級:在此功能模塊中,電腦智能下子。在玩家下子之后,電腦要分析當前的情況,根據(jù)自定義的規(guī)則去判斷,尋找最佳位置,之后把電腦的子放在最佳

17、位置。只不過這個最佳位置是由比較簡單的算法算出來的。(2)人機對戰(zhàn)下子中級:在玩家下完子后,電腦要分析當前的情況,根據(jù)自定義的規(guī)則去判斷,進攻和防守對手,通過權(quán)衡利弊,尋找最佳位置,之后把電腦的子放在最佳位置。這個最佳位置是電腦通過一些較復(fù)雜的算法而算出,較有一定的難度。(3)人人對戰(zhàn)下子:當然如果感覺電腦的智商很低,可以和自己的棋友來娛樂一下,系統(tǒng)會自動檢測輸贏。2.1.2性能需求雖然系統(tǒng)不大,但是能夠滿足玩家的基本需求,電腦有一定的智能,能給新手一定的幫助。也可以和棋友一起相互切磋,有助于提高智商。2.2系統(tǒng)平臺需求任何一個系統(tǒng)本質(zhì)上都是信息處理系統(tǒng),系統(tǒng)必須處理信息和系統(tǒng)應(yīng)該產(chǎn)生的信息很

18、大程度上決定了系統(tǒng)的面貌。因此,系統(tǒng)的開發(fā)語言和開發(fā)平臺在系統(tǒng)的需求中占著重要的作用。2.2.1 系統(tǒng)開發(fā)平臺操作系統(tǒng):Windows XP開發(fā)工具:Visual C+ 6.02.2.2 語言和開發(fā)環(huán)境的介紹1對c+語言的簡介C+語言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計語言,它在C語言的基礎(chǔ)上發(fā)展而來,但它比C語言更容易為人們學習和掌握。C+以其獨特的語言機制在計算機科學的各個領(lǐng)域中得到了廣泛的應(yīng)用。面向?qū)ο蟮脑O(shè)計思想是在原來結(jié)構(gòu)化程序設(shè)計方法基礎(chǔ)上的一個質(zhì)的飛躍,C+完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性。C+這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus

19、”,“CPP”。 它是一種使用非常廣泛的計算機編程語言。C+是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計語言。它支持過程化程序設(shè)計、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計、制作圖標等等泛型程序設(shè)計等多種程序設(shè)計風格。 總的來說,C+是一門通用目的的程序設(shè)計語,它是一個更好的C,支持數(shù)據(jù)抽象,支持面對象程序設(shè)計,支持范型程序設(shè)計。C+的設(shè)計目標,就是要讓C+既具有適合于系統(tǒng)程序設(shè)計的C語言所具有的可適應(yīng)性和高效性,又能在其程序組織結(jié)構(gòu)方面具有像Simula那樣的語言設(shè)施(Simula所支持的這種程序組織結(jié)構(gòu)通常被稱為面向?qū)ο蟪绦蛟O(shè)計風格)。在設(shè)計的時候,還做了很大的努力,使得引借自Simula的

20、高層次的程序設(shè)計技術(shù)能夠應(yīng)用于系統(tǒng)程序設(shè)計之中。這即是說,C+所提供的抽象機制能夠被應(yīng)用于那些對效率和可適應(yīng)性具有極高要求的程序設(shè)計任務(wù)之中。2 .對開發(fā)環(huán)境VC+6.0的簡介Visual C+是一個功能強大的可視化軟件開發(fā)工具。自1993年 Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問世,Visual C+已成為專業(yè)程序員進行軟件開發(fā)的首選工具雖然微軟公司推出了Visual C+.NET(Visual C+7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C

21、+6.0為平臺。Visual C+6.0不僅是一個C+編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C+6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。 Visual C+它大概可以分成三個主要的部分: 1Developer Studio。這是一個集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標題赫然寫著“Micros

22、oft Visual C+”,所以很多人理所當然的認為,那就是Visual C+了。其實不然,雖然Developer Studio提供了一個很好的編輯器和很多Wizard,但實際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會介紹。我們也知道,Developer Studio并不是專門用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當成Visual C+, 它充其量只是Visual C+的一個殼子而已。這一點請切記! 2MFC。從理論上來講,MFC也不是專用于Visual C+,Borland

23、 C+,C+Builder和Symantec C+同樣可以處理MFC。同時,用Visual C+編寫代碼也并不意味著一定要用MFC,只要愿意,用Visual C+來編寫SDK程序,或者使用STL,ATL,一樣沒有限制。不過,Visual C+本來就是為MFC打造的,Visual C+中的許多特征和語言擴展也是為MFC而設(shè)計的,所以用Visual C+而不用MFC就等于拋棄了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3Platform SDK。這才是Visual C+和整個Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,Platf

24、orm SDK是以Microsoft C/C+編譯器為核心,配合MASM,輔以其他一些工具和文檔資料。上面說到Developer Studio沒有編譯程序的功能,那么這項工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。3 系統(tǒng)的基本設(shè)計經(jīng)過分析,對五子棋流程進行整理,得出其執(zhí)行過程如下:進入系統(tǒng)之后。玩家根據(jù)提示可以選擇雙人對戰(zhàn)還是人機對戰(zhàn)。當選擇人機對戰(zhàn)后,系統(tǒng)會默認難度為中級水平,首先是玩家下子(左擊單擊,玩家為白子),然后電腦下子。在電腦或是玩家下了子后,電腦立即計算,是否獲勝、和棋。若有一種情況出現(xiàn),則

25、暫停游戲顯示出相應(yīng)的結(jié)果。然后可以根據(jù)提示重新開始或者從菜單中重新開始游戲。當選擇人人對戰(zhàn)后,白子先下(左擊單擊),然后是黑子(右擊單擊),電腦會在每次落子后判斷是否獲勝、和棋。若有一種情況出現(xiàn),則暫停游戲顯示出相應(yīng)的結(jié)果。3.1系統(tǒng)流程圖流程圖是流經(jīng)一個系統(tǒng)的信息流、觀點流或部件流的圖形代表。在企業(yè)中,流程圖主要用來說明某一過程。這種過程既可以是生產(chǎn)線上的工藝流程,也可以是完成一項任務(wù)必需的管理過程。流程圖是揭示和掌握封閉系統(tǒng)運動狀況的有效方式。作為診斷工具,它能夠輔助決策制定,讓管理者清楚地知道,問題可能出在什么地方,從而確定出可供選擇的行動方案。流程圖有時也稱作輸入-輸出圖。該圖直觀地描

26、述一個工作過程的具體步驟。流程圖對準確了解事情是如何進行的,以及決定應(yīng)如何改進過程極有幫助。這一方法可以用于整個企業(yè),以便直觀地跟蹤和圖解企業(yè)的運作方式。系統(tǒng)流程圖如圖3-1所示。首先進入主界面前選擇是人機對戰(zhàn)還是人人對戰(zhàn)。系統(tǒng)默認為人機對戰(zhàn)。當選擇人機對戰(zhàn)后,會提示用戶:單擊左擊放白子,電腦自動放黑子。接著看到的界面是我們熟悉的棋盤。系統(tǒng)默認難度為中級,如果需要修改難度,可點擊菜單欄游戲-難度,選擇相應(yīng)的難度。用戶(白字)先下子,之后電腦根據(jù)算法計算,是否和棋,是否玩家獲勝,若有一種情況發(fā)生,則進入暫停階段,此時下子則無效,電腦顯示相應(yīng)的結(jié)果,否則電腦就根據(jù)自己的得分算法,計算出最佳位置,電

27、腦把子落到最佳位置上。電腦下子了后,則電腦繼續(xù)判斷是否和棋,是否電腦獲勝,若有一種情況發(fā)生,同樣進入到暫停階段,顯示相應(yīng)的結(jié)果。當選擇人人對戰(zhàn)后,會提示用戶:白方單擊鼠標左鍵下子,黑方單擊鼠標右鍵下子。白方先下。接著顯示人人對戰(zhàn)的棋盤。 白方左擊單擊先下子,之后電腦根據(jù)算法計算,是否雙方和棋,是否獲勝,若有一種情況發(fā)生,則進入暫停階段,此時下子則無效,電腦顯示相應(yīng)的結(jié)果,否則輪到黑方下子。黑方下子后,電腦判斷,是否雙方和棋,是否玩家獲勝,若有一種情況發(fā)生,則進入暫停階段,顯示相應(yīng)的結(jié)果。用戶可以在菜單欄中游戲-重新開局,直接中斷游戲,重新開始新的游戲。退出則直接點關(guān)閉按鈕就行。雙人對戰(zhàn)雙人對戰(zhàn)

28、NNNN單機對戰(zhàn)NNYYY進入雙人界面和棋獲勝獲勝白子下子(左擊)黑子下子(右擊)停止并顯示結(jié)果開始游戲選擇模式進入單機界面玩家下子和棋電腦下子獲勝獲勝停止并顯示結(jié)果重新開始當前頁面NY圖3-1 五子棋系統(tǒng)流程圖3.2系統(tǒng)類圖類圖是顯示了模型的靜態(tài)結(jié)構(gòu),特別是模型中存在的類、類的內(nèi)部結(jié)構(gòu)以及它們與其他類的關(guān)系等。類圖一般在詳細設(shè)計過程中出現(xiàn),主要用來描述系統(tǒng)中各個模塊中類之間的關(guān)系,包括類或者類與接口的繼承關(guān)系,類之間的依賴、聚合等關(guān)系。通過類圖,就能實際的把系統(tǒng)中的各個類,即對象描述清清楚楚。類圖就像建造房屋使用的藍圖,決定著系統(tǒng)的優(yōu)劣。圖3-2就是五子棋的系統(tǒng)類圖。圖3-2 五子棋系統(tǒng)類圖

29、本系統(tǒng)是基于MFC開發(fā)的,從類圖中可以明顯的看出MFC的框架結(jié)構(gòu),了解MFC程序的整個運行機制。 利用全局變量theAPP啟動應(yīng)用程序,調(diào)用CTryApp的構(gòu)造函數(shù)來初始化一些工作,然后,進入WinMain函數(shù),調(diào)用CTryApp的InitInstance函數(shù),初始化窗口,包括窗口類的注冊、創(chuàng)建,窗口的顯示和更新。接著,進入消息循環(huán)。由CTryView類調(diào)用CTryDoc類和三個對話框類來接受消息,處理消息。以上剛剛實現(xiàn)了MFC的基本框架結(jié)構(gòu),使得系統(tǒng)能夠正常運行。在CTryView中實現(xiàn)了系統(tǒng)主界面的設(shè)計和實現(xiàn),并且系統(tǒng)的基本操作捕捉和相應(yīng)都在此類中實現(xiàn)。CTryDoc被CTryView調(diào)用

30、,實現(xiàn)系統(tǒng)的核心功能,人工智能。在CTryDoc中的ComputerThink1()和ComputerThink2(),實現(xiàn)了人機對戰(zhàn)中,電腦通過對棋盤上棋子的掃面,計算出最佳落子位置。除此之外,系統(tǒng)的和棋判斷,輸贏判斷都在此類中。還有四個對話框類,實現(xiàn)了基本的人機交互,玩家對戰(zhàn)電腦的設(shè)計。3.3主界面的實現(xiàn)由于系統(tǒng)的核心是人工智能的設(shè)計和實現(xiàn),則對于其他的一些功能,由于本人的技術(shù)和精力有限,目前只是實現(xiàn)了一些基本的功能。主窗口是基于MFC而建立起來的,包括主界面和菜單欄。主界面實現(xiàn)只要固定主窗口的大小,然后填充主窗口的背景顏色,接著在窗口中央繪畫棋盤即可。關(guān)于菜單欄,由于其他的功能沒有實現(xiàn),

31、只是實現(xiàn)了重新開局和難度的選擇這兩個基本的功能,所以只需要一個菜單就可以了。其他的選擇都是簡單的基于對話框而實現(xiàn)的。本系統(tǒng)首先印入眼簾的是選擇模式對話框,選擇是雙人對戰(zhàn)還是人機對戰(zhàn)如圖3-3; 當選擇人機對戰(zhàn)時進入的,系統(tǒng)會提醒玩家,如圖3-4;單擊確定就進入熟悉的五子棋界面。如圖3-5所示。圖3-3 模式選擇 圖3-4 提示圖3-5 人機對戰(zhàn)的主界面利用MFC建立一個MFC工程。在選擇模式之后,調(diào)用CTryView中的void CTryView:OnDraw(CDC* pDC);函數(shù),根據(jù)所選擇的模式初始化游戲的主界面。void CTryView:OnDraw(CDC* pDC)CTryDo

32、c* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereif(mode=WITH_COMPUTER)/如果選擇人機對戰(zhàn),則繪畫DrawBoard()DrawBoard(pDC);else/否則繪畫DrawBoard1();DrawBoard1(pDC); /人機對戰(zhàn)主界面void CTryView:DrawBoard(CDC *pDC) CTryDoc* pDoc = GetDocument(); /畫背景色/CBrush brush2(RGB(0,120,0);pDC-Selec

33、tObject(&brush2);pDC-Rectangle(0,0,1024,768);/寫文字/LOGFONT lf;CFont cf;memset(&lf,0,sizeof(LOGFONT);lf.lfHeight=-80;lf.lfCharSet=GB2312_CHARSET;:lstrcpy(lf.lfFaceName,華文行楷);cf.CreateFontIndirect(&lf);CFont* oldfont=pDC-SelectObject(&cf);pDC-SetTextColor(RGB(255,255,0);pDC-SetBkColor(RGB(0,120,0);pDC-

34、TextOut(50,70, 人);pDC-TextOut(50,140,機);pDC-TextOut(50,210,對);pDC-TextOut(50,280,戰(zhàn));pDC-TextOut(50,350,五);pDC-TextOut(50,420,子);pDC-TextOut(50,490,棋); CBrush brush3(RGB(192,0,0);pDC-SelectObject(&brush3); pDC-Ellipse(825,480,1000,540);CFont cf1; LOGFONT lf1;memset(&lf1,0,sizeof(LOGFONT);lf1.lfHeight

35、=-25;lf1.lfCharSet=GB2312_CHARSET;:lstrcpy(lf1.lfFaceName,華文行楷);cf1.CreateFontIndirect(&lf1);pDC-SelectObject(&cf1);pDC-SetTextColor(RGB(0,255,255);pDC-SetBkColor(RGB(192,0,0);pDC-TextOut(845,500,五子棋 ver 1.0); pDC-SetBkColor(RGB(0,120,0);if(difficulty=EMPTY)pDC-TextOut(60,580,(初級);elsepDC-TextOut(60

36、,580,(中級);pDC-SelectObject(oldfont);cf.DeleteObject();/畫棋盤/CBrush brush1(RGB(0,0,192);pDC-SelectObject(&brush1);/CPen* pOldPen=pDC-SelectObject(&pen1);/pDC-MoveTo(10,10);/pDC-LineTo() pDC-Rectangle(185,15,815,645); CPen pen(PS_SOLID,2,RGB(0,192,0);CPen* pOldPen=pDC-SelectObject(&pen); for(int k=0;kM

37、oveTo(200+k*40,30); pDC-LineTo(200+k*40,630);pDC-MoveTo(200,30+k*40);pDC-LineTo(800,30+k*40);pDC-SelectObject(pOldPen); /導(dǎo)入位圖/CBitmap m_bmp;m_bmp.LoadBitmap(IDB_BITMAP3);BITMAP bm;m_bmp.GetObject(sizeof(BITMAP),&bm); CDC dcMem;dcMem.CreateCompatibleDC(pDC);CBitmap *pOldbmp=dcMem.SelectObject(&m_bmp)

38、;pDC-BitBlt(818,15,200,740,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(pOldbmp);dcMem.DeleteDC();/畫黑白子/for(int i=0;i15;i+)for(int j=0;jGetCondition(i,j)=PEOPLE)DrawWhite(pDC,i,j);else if(pDoc-GetCondition(i,j)=COMPUTER)DrawBlack(pDC,i,j);人人對戰(zhàn)的界面和人機對戰(zhàn)的界面很相似,只是左側(cè)的文字不一樣罷了,在這就不進行分析了。圖3-6為人人對戰(zhàn)的界面圖:圖3-6 人人對戰(zhàn)的主

39、界面圖3.4人人對戰(zhàn)為了能夠更好的滿足玩家,開發(fā)了人人對戰(zhàn)模式。在此模式下,玩家可以相互切磋,共同提升!為了避免下錯,設(shè)置白子單擊鼠標左擊下子,黑子單擊鼠標右擊下子。白子先行。其主界面如圖3-4。當白子單擊下子后,計算機會根據(jù)所點的位置而下白子,其代碼如下:void CTryView:OnLButtonDown(UINT nFlags, CPoint point)/左擊單擊所下的子/*部分無關(guān)的代碼省略*/if(pDoc-ISHeQi()/判斷是否和棋AfxMessageBox(好厲害,竟然能和棋,真是旗鼓相當?。?;OnRestart();/*部分無關(guān)的代碼省略*/ /雙人游戲模式if(pD

40、oc-decided=TRUE)return; if(point.x800|point.y630)return;if(next=BLACK)return;CPoint pos; pos.x=(point.x-200)/40; pos.y=(point.y-30)/40; if(pDoc-GetCondition(pos.x,pos.y)!=EMPTY)return; pDoc-SetCondition(pos.x,pos.y,PEOPLE); DrawWhite(&dc,pos.x,pos.y);next=BLACK; if(pDoc-IsGameOver() pDoc-decided=TRU

41、E; AfxMessageBox(恭喜恭喜!白方獲勝!);OnRestart(); CView:OnLButtonDown(nFlags, point);說明:首先判斷是否分出勝負,如果分出則,返回。沒有分出則檢測是否和棋,若和棋則返回,沒有再檢測所點擊的位置是否在棋盤上,是否在所點位置為空子,如果是,則下子,畫子,并且置下一個下子為黑子,然后判斷是否分出勝負。當白子下之后輪到黑子下子則,右擊單擊下黑子,計算機會根據(jù)所點位置下黑子,其代碼如下:void CTryView:OnRButtonDown(UINT nFlags, CPoint point) /*部分無關(guān)的代碼省略*/if(pDoc-

42、decided=TRUE)/判斷是否分出勝負 return;if(pDoc-ISHeQi()/判斷是否和棋AfxMessageBox(好厲害,竟然能和棋,真是旗鼓相當??!);OnRestart();if(mode=WITH_COMPUTER)/判斷是否為雙人對戰(zhàn)return;if(next=WHITE)return; if(point.x800|point.y630)/判斷子是否落在棋盤上 return; CPoint pos; pos.x=(point.x-200)/40; pos.y=(point.y-30)/40; if(pDoc-GetCondition(pos.x,pos.y)!=E

43、MPTY)/判斷是否已經(jīng)落子 return; pDoc-SetCondition(pos.x,pos.y,COMPUTER);/存儲落子位置 DrawBlack(&dc,pos.x,pos.y);next=WHITE;if(pDoc-IsGameOver()/判斷是否分出勝負 pDoc-decided=TRUE; AfxMessageBox(黑方獲勝!);OnRestart(); CView:OnRButtonDown(nFlags, point);說明:首先判斷是否分出勝負,如果分出則,返回。沒有分出則檢測是否和棋,若和棋則返回,沒有再檢測所點擊的位置是否在棋盤上,是否在所點位置為空子,如果

44、是,則下子,畫子,并且置下一個下子為白子,然后判斷是否分出勝負。就這樣,一直落子,直到有結(jié)果為止。3.5其他一些小功能對于棋類博弈游戲,最重要的當然是結(jié)果了,下面就是系統(tǒng)的和棋判斷和勝負判斷的代碼。3.5.1和棋的代碼和棋代碼位于CTryDoc類中,在每次下子之前都會判斷。BOOL CTryDoc:ISHeQi()if(number=180)/number存儲所下黑子的個數(shù)return TRUE;elsereturn FALSE;說明:和棋的判斷是根據(jù)棋盤中是否還有空子可下。棋盤上共有361個格可下子,由于白子和黑子是交替的下,只要黑子的個數(shù)乘以2則是棋盤上目前棋子的個數(shù)(如果是白子下后,黑子

45、沒有下,則棋子個數(shù)為黑子的個數(shù)*2+1)。棋盤上由于number存儲的是所下黑子的個數(shù),總共有361個格,最終落子的肯定是白字,所以只需要在落白子之前判斷黑子的個數(shù)就可以知道是否和棋。3.5.2輸贏判斷的代碼判斷輸贏的代碼也位于CTryDoc類中是在每次下子之后才會判斷:BOOL CTryDoc:IsGameOver() int i,j,countw=0,countb=0,ccount,m,n;/countw用于計算people的子的連續(xù)數(shù),countb為存儲電腦子的連續(xù)個數(shù), for(i=0;i15;i+)/ccount用于記數(shù)(5),m,n用于存儲要檢測的子的坐標 for(j=0;j=0,

46、ccount0;n-,ccount-)if(conditionmn=1) countw+;else if(conditionmn=2) countb+;if(countw=5|countb=5) return TRUE;/對于這個方向的檢測,如果從現(xiàn)在這個子開始,往方向數(shù)五個子都是相同顏色的子則獲勝。for(m=i,n=j,ccount=5,countw=0,countb=0;m=0,ccount0;m+,n-,ccount-)/ne if(conditionmn=1) countw+;else if(conditionmn=2) countb+;if(countw=5|countb=5) r

47、eturn TRUE;/對于這個方向的檢測,如果從現(xiàn)在這個子開始,往方向數(shù)四個子都是相同顏色的子則獲勝。for(m=i,n=j,ccount=5,countw=0,countb=0;m0;m+,ccount-) /e if(conditionmn=1) countw+;else if(conditionmn=2) countb+;if(countw=5|countb=5) return TRUE;/對于這個方向的檢測,如果從現(xiàn)在這個子開始,往方向數(shù)四個子都是相同顏色的子則獲勝。for(m=i,n=j,ccount=5,countw=0,countb=0;m15,n0;m+,n+,ccount-

48、)if(conditionmn=1) countw+;else if(conditionmn=2) countb+;if(countw=5|countb=5) return TRUE; return FALSE;程序說明:對于輸贏的判斷,要對棋盤上的所有子進行遍歷,當檢測某個子時,只需要對其上,左上,左,左下,四個方向上進行判斷,查看是否有五個連續(xù)相同顏色的子。如果在某個方向上有五個連續(xù)的相同顏色的子,則此顏色子獲勝。注意,此獲勝函數(shù)對黑白子都可適用。只要落子就會檢測是否獲勝,所以在獲勝前的最后落的子的玩家,就是獲勝者。3.5.3重新開局的代碼當然系統(tǒng)還會有其他的小功能,由于時間原因,只實現(xiàn)了

49、重新開局這一小功能。無論玩什么模式,用戶都可以隨時重新開始一局新的游戲。其實現(xiàn)代碼如下:void CTryView:OnRestart() CDlg dlg;dlg.DoModal();if(dlg.reset=TRUE) CDlg2 dlg2; dlg2.DoModal(); mode=dlg2.mode; ResetGame();void CTryView:ResetGame() CClientDC dc(this);CTryDoc* pDoc = GetDocument();pDoc-ResetData();if(mode=WITH_COMPUTER) DrawBoard(&dc); A

50、fxMessageBox(操作提示:單擊左鍵放白子,電腦自動下黑子。);else DrawBoard1(&dc); AfxMessageBox(操作提示:白方單擊鼠標左鍵放子,黑方單擊鼠標右鍵放子。白方先下!);程序說明:分別調(diào)用CDlg和CDlg2這兩個對話框類,在系統(tǒng)的提示下初始化棋盤,重新開局。4 人工智能的設(shè)計與實現(xiàn)本章節(jié)將要探討系統(tǒng)的核心內(nèi)容人工智能的設(shè)計思路和代碼實現(xiàn)。其具體的實現(xiàn)包括以下幾點:1難度為初級的現(xiàn)實2難度為中級的實現(xiàn)。4.1難度為初級的現(xiàn)實4.1.1.基本思路一個子對要是對其他子造成影響,則這些受影響的子必定在這個子的周圍。以圖3-1中的A點為例,受A影響的所有的子都

51、在以A為中心,八個方向上的四個子。如3-1圖中的A子周圍的子。但是由于規(guī)則,五個的相同顏色的子能夠連在成一條線,就可以獲勝。所以,A子對其周圍的子的影響也不是一樣的。越是離A越近,則受到A的影響就越大,反之,受A的影響就越小。如圖4-1中的B點和C點就不受A點的影響!那么怎么判斷是否應(yīng)該在A點下子,要是下子,是黑子還是白子呢。1 2 3 4 5 15 16 17 18 192211111112221212A121121112222221311452345P54325 43圖41五子棋棋盤我用的是記分規(guī)則。在游戲中,為了讓電腦找到最佳的走法,必須計算出電腦下到棋盤中任一格的分數(shù),得到其中最高分即

52、是電腦下的位置。由于一個子對其他子的影響與距離相關(guān),我們這樣規(guī)定,以圖4-1中的P點為例,離點P越近,它對P點的影響就越大,對于點P在此點所要加(減)的分數(shù)就越大,反之,越遠則所要加(減)的分就越小,我們以1為單位來計算。如圖3-1下部分點P周圍的數(shù)字就是這些點對點P所要加(減)的分數(shù)。這樣,在玩家下子后,對棋盤中的所有的空子進行遍歷計算其得分情況。為了討論方便,我只畫了一個10X10的表格(其中C表示電腦的子,P表示玩家的子,以下統(tǒng)計的是電腦的得分情況),途中的數(shù)字就是每個格所得的分數(shù)。ABABCDEFGHIJ2002500120330370130004449140002355P543211

53、11CP5111100159540000144744300130350332020023002210001100011圖4-2 難度為初級的電腦的得分情況以圖4-2中格F5為例,首先計算F5上方方向的得分。由于D5和E5都是玩家子,則F5在上方的得分是sco_n=5+4(我們先以玩家對其的影響為正);其中5分是E5的玩家子對F5的影響,4分是D5的玩家子對F5的影響。這樣就算出F5在上方的得分為9。同理,F(xiàn)5在左上方的得分請情況是sco_wn-=5;其中減5是因為,其左上方的子為電腦子。這樣F5在左上方的得分為-5。按照上面所說的記分規(guī)則計算出一個空子周圍的子對其影響而得的分。這樣我們就會得到

54、八個分數(shù)。由于左右方向,上下方向,左上至右下方向,左下至右上的方向,這四個大的方向沒有計算其分數(shù),只要把八個方向的值相對應(yīng)的兩兩相加(注意此時還區(qū)分正負),就得到這四個方向上的得分情況了。然后所得到的12個數(shù)取絕對值,其中最大的那個數(shù),也就是周圍點對其影響的最大程度,就是此點的得分情況了。遍歷棋盤上所有空子,計算其所得的分數(shù),得到其中最高分就是電腦下的位置。這就難度為初級的基本思路和得分計算規(guī)則。4.1.2.代碼實現(xiàn)難度為初級的代碼:CPoint CTryDoc:ComputerThink1()CPoint point;/用于存儲所計算出的最佳點int i,j,m,n,ccount,max1=

55、0,max1_x,max1_y;/max1存儲所計算出的最大數(shù),max1_x,max1_y存儲最佳點的坐標for(i=0;i15;i+) for(j=0;j=0&n=0&ccount0;m-,n-,ccount-) /nw 對此方向上的分數(shù)統(tǒng)計 switch(conditionmn) case EMPTY: break; case PEOPLE: sco_nwij+=ccount; break; case COMPUTER: sco_nwij-=ccount; break; default: break; /*省略其他七個方向上的得分算法*/int temp= maxx(abs(sco_nij

56、),abs(sco_sij),abs(sco_wij),abs(sco_eij),abs(sco_nwij),abs(sco_seij),abs(sco_neij),abs(sco_swij),abs(sco_nwij+sco_seij),abs(sco_neij+sco_swij),abs(sco_wij+sco_eij),abs(sco_nij+sco_sij);if(tempmax1) max1=temp; max1_x=i; max1_y=j; /*省略初始化數(shù)組的代碼*/point.x=max1_x;point.y=max1_y;number+; /記錄電腦走的步數(shù)return po

57、int;/返回所計算出來的點程序說明:遍歷棋盤上所有的空子,分別對他們進行分數(shù)統(tǒng)計。以左方向為例,從空子左數(shù)五個點,第一個點如果為空子,跳過;若為玩家所下的子,則sco_eij+=ccount;(此時ccount為5);若為,電腦所下的子,則sco_eij-=ccount;(此時ccount為5);然后在計算其他四子,但是所加減的數(shù)字則依次遞減。最終把結(jié)果存入sco_eij中,然后依次在計算其他七個方向的分數(shù),對于左右,上下,左上至右下,左下至右上這四個方向的分數(shù)用已算出的八個方向相加即可。然后對這12個數(shù)取絕對值最后在取出最大數(shù)存到scoij中,即為這點的得分。遍歷所有的空點后所得到的分數(shù)在

58、去最大值,此點的坐標就是電腦所要下子的坐標。解釋:此段代碼簡單的實現(xiàn)了人機對戰(zhàn)的功能。以a為例,子a要是對其他的子造成影響,則其他子必須在a的周圍,以a為中心,八個方向上的四個子都受其影響。但是,越是離a越近,其影響就越大,反之,則受其影響越小。若是受影響的子是和a是相同顏色的,則受影響的子和a會相互促進,從而得分要減ccount(抑制時,得分為正)。若是受影響的子是和a是不相同顏色的,則受影響的子和a會相互抑制,從而得分要加ccount。由于只是計算出以a為中心的八個方向上的得分情況,但是沒有算出穿過a的四個方向的得分,只需要把兩個分方向上的分數(shù)相加即可。然后取絕對值,比較這十二個數(shù)的最大值

59、,得到的結(jié)果就是這點對周圍影響的最大值。然后最大的那個數(shù)的位置,就是電腦所落子的位置。4.2難度為中級的實現(xiàn)雖然初級的代碼能夠?qū)崿F(xiàn)基本的人機對戰(zhàn),但是在計算得分情況時,往往會遇到不止一個最大值。如圖4-2,當該輪到電腦下子時,電腦會計算出兩個最佳位置。但是由于遍歷的順序,也許會選擇C5的位置下子。一般的玩家會一眼看出F5的位置才是最佳的位置。為了能夠選出最佳位置,從而開發(fā)出難度為中級的功能。4.2.1.基本思路玩家在每次下子時都會選擇是進攻還是防守。對于電腦是不是也可以實現(xiàn)進攻和防守的功能呢?本人就試圖讓電腦實現(xiàn)這樣的功能。要使電腦有防守和進攻功能,就必須對棋盤上的棋子分別用防守和進攻來進行掃

60、描。算出其最后得分,得分最高的就為此點的最終得分。然后在算出所有的點的得分,得到其中最高分即是電腦下的位置。要想進攻,就必須知道自己的子是否有連在一起的,有多少個連在一起的。同理,防守也必須知道對方的子有多少是連在一起的。首先我們以進攻為例。要想進攻就必須了解自己的子的連續(xù)情況,首先知道自己的子在哪個地方連續(xù)的最多,然后查看連續(xù)的兩頭是否有空子可落子,如果兩端都是空子,判斷自己的子落在哪一端比較合適。然后根據(jù)相關(guān)的算法,算出這空子的進攻分數(shù)。同理,根據(jù)檢測對方子的情況,也可以算出這空子防御得分。然后其中的最大分就是這點的總的得分。遍歷棋盤上所有空子,計算出他們的得分情況,其中的最大值,也就是我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論