




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 PAGE 1河北農(nóng)業(yè)大學(xué) 本科畢業(yè)論文(設(shè)計(jì))題 目: 五子棋游戲系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 學(xué) 院: 信息科學(xué)與技術(shù)學(xué)院 專(zhuān)業(yè)班級(jí): 軟件工程0902班 學(xué) 號(hào): 學(xué)生姓名: 指導(dǎo)教師姓名: 指導(dǎo)教師職稱(chēng): 講師 2013 年 5 摘 要人工智能是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門(mén)新的技術(shù)科學(xué)。從人工智能開(kāi)始發(fā)展到現(xiàn)在,已經(jīng)延伸深并深入到各個(gè)領(lǐng)域,各個(gè)行業(yè)。其中,計(jì)算機(jī)人機(jī)對(duì)弈就是人工智能的主要成果之一。五子棋游戲是一種兩人對(duì)弈的純策略型棋類(lèi)游戲,由于規(guī)則簡(jiǎn)單,容易上手,老少皆宜,而且趣味橫生,引人入勝,深受人民的喜愛(ài)。自從計(jì)算機(jī)實(shí)現(xiàn)以來(lái),五子棋就一直受到廣大電腦
2、玩家的青睞。而五子棋人機(jī)對(duì)弈,是計(jì)算機(jī)人機(jī)對(duì)弈中比較重要的一種。本文主要介紹基于MFC的五子棋人機(jī)對(duì)弈系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程。首先介紹了此系統(tǒng)的背景分析,國(guó)內(nèi)外現(xiàn)狀。接著對(duì)系統(tǒng)進(jìn)行需求分析,確定系統(tǒng)的業(yè)務(wù)需求,性能功能。對(duì)C+和VC+6.0開(kāi)發(fā)環(huán)境進(jìn)行了簡(jiǎn)單的介紹。然后對(duì)系統(tǒng)總的設(shè)計(jì)進(jìn)行了詳細(xì)的描述。最后,對(duì)各個(gè)功能模塊進(jìn)行了詳細(xì)的論述,在系統(tǒng)的設(shè)計(jì)中著重對(duì)人機(jī)對(duì)戰(zhàn)的設(shè)計(jì),滿足了系統(tǒng)運(yùn)行。本系統(tǒng)意在于研究人工智能的算法。通過(guò)對(duì)算法的分析和研究,讓我們對(duì)于人工智能有一定的了解。同時(shí)對(duì)于本身,也有助于增強(qiáng)思維能力,提高智力。關(guān)鍵詞:人工智能,計(jì)算機(jī)人博弈,五子棋,算法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)平臺(tái)需求 PAGEREF _Toc358386017 h 32.2.1 系統(tǒng)開(kāi)發(fā)平臺(tái) PAGEREF _Toc358386018 h 32.2.2 語(yǔ)言和開(kāi)發(fā)環(huán)境的介紹 PAGEREF _Toc358386019 h 33 系統(tǒng)的基本設(shè)計(jì)
10、 PAGEREF _Toc358386020 h 53.1系統(tǒng)流程圖 PAGEREF _Toc358386021 h 53.2系統(tǒng)類(lèi)圖 PAGEREF _Toc358386022 h 73.3主界面的實(shí)現(xiàn) PAGEREF _Toc358386023 h 83.4人人對(duì)戰(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重新開(kāi)局的代碼 PAGEREF _Toc
11、358386028 h 164 人工智能的設(shè)計(jì)與實(shí)現(xiàn) PAGEREF _Toc358386029 h 184.1難度為初級(jí)的現(xiàn)實(shí) PAGEREF _Toc358386030 h 184.1.1.基本思路 PAGEREF _Toc358386031 h 184.1.2.代碼實(shí)現(xiàn) PAGEREF _Toc358386032 h 194.2難度為中級(jí)的實(shí)現(xiàn) PAGEREF _Toc358386033 h 214.2.1.基本思路 PAGEREF _Toc358386034 h 214.2.2.代碼實(shí)現(xiàn) PAGEREF _Toc358386035 h 22總結(jié) PAGEREF _Toc35838603
12、6 h 27致 謝 PAGEREF _Toc358386037 h 28參考文獻(xiàn) PAGEREF _Toc358386038 h 29 PAGE26 1 研究五子棋游戲系統(tǒng)的背景和意義娛樂(lè)是人類(lèi)不可或缺的生活內(nèi)容。現(xiàn)在,在網(wǎng)絡(luò)上各種游戲鋪天蓋地,本人將學(xué)以致用,用所學(xué)的C+編程,開(kāi)發(fā)一款簡(jiǎn)單又使用的單擊游戲,五子棋。1.1背景分析五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱(chēng)之為“連珠”,英譯為“Ren-ju”,英文稱(chēng)之為“Gobang”或“FIR”(Five in a Row的縮寫(xiě)),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱(chēng)謂。五子棋不僅能增強(qiáng)
13、思維能力,提高智力,而且變化多端,非常富有趣味性,因此為人民群眾所喜聞樂(lè)見(jiàn)。人工智能是利用機(jī)器來(lái)模擬或者實(shí)現(xiàn)人類(lèi)的智能。主要研究如何用人工的方法和技術(shù),使用各種自動(dòng)化機(jī)器或智能機(jī)器(主要指計(jì)算機(jī))模仿、延伸和擴(kuò)展人的智能,實(shí)現(xiàn)某些機(jī)器思維或腦力勞動(dòng)自動(dòng)化。人工智能在最近幾年發(fā)展十分迅速。人們不斷的研究出機(jī)器,使它能勝任人們能做的一些復(fù)雜的事,或是一些人們不適宜做的事,如水下探測(cè)等。人工智能始終處于計(jì)算機(jī)發(fā)展的最前沿。高級(jí)計(jì)算機(jī)語(yǔ)言、計(jì)算機(jī)界面及文字處理器的存在或多或少都得歸功于人工智能的研究。人工智能研究帶來(lái)的理論和洞察力指引了計(jì)算技術(shù)發(fā)展的未來(lái)方向?,F(xiàn)有的人工智能產(chǎn)品相對(duì)于即將到來(lái)的人工智能
14、應(yīng)用可以說(shuō)微不足道,但是它們預(yù)示著人工智能的未來(lái)。而隨著人們工作的加大,運(yùn)動(dòng)的時(shí)間也越來(lái)越少,大部分呆在家里或是工作的地方。這樣人們就通過(guò)上網(wǎng)、購(gòu)物等之類(lèi)的事來(lái)取代生活中的不足。當(dāng)然也有一部分群體在玩游戲之類(lèi)的了。而五子棋由于其經(jīng)典、易學(xué)等。深受人們的喜愛(ài)。五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理
15、的結(jié)晶。1.2目的和意義五子棋是從剛開(kāi)始的民間的競(jìng)技小游戲,到現(xiàn)在的國(guó)際大型比賽,一直深受人們的喜愛(ài)。同時(shí)通過(guò)對(duì)人機(jī)對(duì)戰(zhàn)五子棋的研究和開(kāi)發(fā),可以更好對(duì)人工智能的了解,這種將包含感知、思維等各種智能集于一身的技術(shù),將為并正在為人類(lèi)做著巨大貢獻(xiàn),人類(lèi)對(duì)它的研究更加透徹也將更加全面,各種還未涉及或研究并不成熟的人工智能將被開(kāi)發(fā),使人工智能技術(shù)更趨于成熟,使被賦予人工智能的機(jī)器們更趨于生命化,對(duì)以后人工智能的提高和發(fā)展有著深遠(yuǎn)的影響。同時(shí)由于自己開(kāi)發(fā)系統(tǒng),對(duì)于自身的編碼能力也會(huì)有很大的提高。而五子棋是一種雙人博弈的游戲,能夠更加的了解五子棋,增強(qiáng)自身思維能力,提高智能,修身養(yǎng)性,一舉多得。2 系統(tǒng)需求
16、分析為了開(kāi)發(fā)出真正滿足用戶(hù)需求量的軟件產(chǎn)品,首先必須知道用戶(hù)的需求。軟件需求中包括了多個(gè)方面來(lái)說(shuō)明用戶(hù)需求。在這一章中,主要從以下幾方面來(lái)說(shuō)明系統(tǒng)的需求。2.1業(yè)務(wù)需求此游戲系統(tǒng)為智力游戲,適合于各類(lèi)游戲愛(ài)好者。由于其經(jīng)典性,各類(lèi)人士都愛(ài)玩。人們?cè)谂c電腦對(duì)戰(zhàn)時(shí),也會(huì)體會(huì)到自己的智力也會(huì)有所提升。也可以人人對(duì)戰(zhàn),既能夠提升樂(lè)趣,增加智力,也是綠色環(huán)保的體現(xiàn)。2.1.1 功能要求圖 2-圖 2-1 五子棋功能模塊圖初級(jí)中級(jí)五子棋游戲人人對(duì)戰(zhàn)人機(jī)對(duì)戰(zhàn)(1)人機(jī)對(duì)戰(zhàn)下子初級(jí):在此功能模塊中,電腦智能下子。在玩家下子之后,電腦要分析當(dāng)前的情況,根據(jù)自定義的規(guī)則去判斷,尋找最佳位置,之后把電腦的子放在最佳
17、位置。只不過(guò)這個(gè)最佳位置是由比較簡(jiǎn)單的算法算出來(lái)的。(2)人機(jī)對(duì)戰(zhàn)下子中級(jí):在玩家下完子后,電腦要分析當(dāng)前的情況,根據(jù)自定義的規(guī)則去判斷,進(jìn)攻和防守對(duì)手,通過(guò)權(quán)衡利弊,尋找最佳位置,之后把電腦的子放在最佳位置。這個(gè)最佳位置是電腦通過(guò)一些較復(fù)雜的算法而算出,較有一定的難度。(3)人人對(duì)戰(zhàn)下子:當(dāng)然如果感覺(jué)電腦的智商很低,可以和自己的棋友來(lái)娛樂(lè)一下,系統(tǒng)會(huì)自動(dòng)檢測(cè)輸贏。2.1.2性能需求雖然系統(tǒng)不大,但是能夠滿足玩家的基本需求,電腦有一定的智能,能給新手一定的幫助。也可以和棋友一起相互切磋,有助于提高智商。2.2系統(tǒng)平臺(tái)需求任何一個(gè)系統(tǒng)本質(zhì)上都是信息處理系統(tǒng),系統(tǒng)必須處理信息和系統(tǒng)應(yīng)該產(chǎn)生的信息很
18、大程度上決定了系統(tǒng)的面貌。因此,系統(tǒng)的開(kāi)發(fā)語(yǔ)言和開(kāi)發(fā)平臺(tái)在系統(tǒng)的需求中占著重要的作用。2.2.1 系統(tǒng)開(kāi)發(fā)平臺(tái)操作系統(tǒng):Windows XP開(kāi)發(fā)工具:Visual C+ 6.02.2.2 語(yǔ)言和開(kāi)發(fā)環(huán)境的介紹1對(duì)c+語(yǔ)言的簡(jiǎn)介C+語(yǔ)言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它在C語(yǔ)言的基礎(chǔ)上發(fā)展而來(lái),但它比C語(yǔ)言更容易為人們學(xué)習(xí)和掌握。C+以其獨(dú)特的語(yǔ)言機(jī)制在計(jì)算機(jī)科學(xué)的各個(gè)領(lǐng)域中得到了廣泛的應(yīng)用。面向?qū)ο蟮脑O(shè)計(jì)思想是在原來(lái)結(jié)構(gòu)化程序設(shè)計(jì)方法基礎(chǔ)上的一個(gè)質(zhì)的飛躍,C+完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性。C+這個(gè)詞在中國(guó)大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus
19、”,“CPP”。 它是一種使用非常廣泛的計(jì)算機(jī)編程語(yǔ)言。C+是一種靜態(tài)數(shù)據(jù)類(lèi)型檢查的,支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言。它支持過(guò)程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、制作圖標(biāo)等等泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。 總的來(lái)說(shuō),C+是一門(mén)通用目的的程序設(shè)計(jì)語(yǔ),它是一個(gè)更好的C,支持?jǐn)?shù)據(jù)抽象,支持面對(duì)象程序設(shè)計(jì),支持范型程序設(shè)計(jì)。C+的設(shè)計(jì)目標(biāo),就是要讓C+既具有適合于系統(tǒng)程序設(shè)計(jì)的C語(yǔ)言所具有的可適應(yīng)性和高效性,又能在其程序組織結(jié)構(gòu)方面具有像Simula那樣的語(yǔ)言設(shè)施(Simula所支持的這種程序組織結(jié)構(gòu)通常被稱(chēng)為面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格)。在設(shè)計(jì)的時(shí)候,還做了很大的努力,使得引借自Simula的
20、高層次的程序設(shè)計(jì)技術(shù)能夠應(yīng)用于系統(tǒng)程序設(shè)計(jì)之中。這即是說(shuō),C+所提供的抽象機(jī)制能夠被應(yīng)用于那些對(duì)效率和可適應(yīng)性具有極高要求的程序設(shè)計(jì)任務(wù)之中。2 .對(duì)開(kāi)發(fā)環(huán)境VC+6.0的簡(jiǎn)介Visual C+是一個(gè)功能強(qiáng)大的可視化軟件開(kāi)發(fā)工具。自1993年 Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問(wèn)世,Visual C+已成為專(zhuān)業(yè)程序員進(jìn)行軟件開(kāi)發(fā)的首選工具雖然微軟公司推出了Visual C+.NET(Visual C+7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C
21、+6.0為平臺(tái)。Visual C+6.0不僅是一個(gè)C+編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開(kāi)發(fā)環(huán)境(integrated development environment,IDE)。Visual C+6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類(lèi)向?qū)lass Wizard等開(kāi)發(fā)工具。 這些組件通過(guò)一個(gè)名為Developer Studio的組件集成為和諧的開(kāi)發(fā)環(huán)境。 Visual C+它大概可以分成三個(gè)主要的部分: 1Developer Studio。這是一個(gè)集成開(kāi)發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫(xiě)著“Micros
22、oft Visual C+”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C+了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但實(shí)際上它沒(méi)有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會(huì)介紹。我們也知道,Developer Studio并不是專(zhuān)門(mén)用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當(dāng)成Visual C+, 它充其量只是Visual C+的一個(gè)殼子而已。這一點(diǎn)請(qǐng)切記! 2MFC。從理論上來(lái)講,MFC也不是專(zhuān)用于Visual C+,Borland
23、 C+,C+Builder和Symantec C+同樣可以處理MFC。同時(shí),用Visual C+編寫(xiě)代碼也并不意味著一定要用MFC,只要愿意,用Visual C+來(lái)編寫(xiě)SDK程序,或者使用STL,ATL,一樣沒(méi)有限制。不過(guò),Visual C+本來(lái)就是為MFC打造的,Visual C+中的許多特征和語(yǔ)言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C+而不用MFC就等于拋棄了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3Platform SDK。這才是Visual C+和整個(gè)Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說(shuō)來(lái),Platf
24、orm SDK是以Microsoft C/C+編譯器為核心,配合MASM,輔以其他一些工具和文檔資料。上面說(shuō)到Developer Studio沒(méi)有編譯程序的功能,那么這項(xiàng)工作是由誰(shuí)來(lái)完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。3 系統(tǒng)的基本設(shè)計(jì)經(jīng)過(guò)分析,對(duì)五子棋流程進(jìn)行整理,得出其執(zhí)行過(guò)程如下:進(jìn)入系統(tǒng)之后。玩家根據(jù)提示可以選擇雙人對(duì)戰(zhàn)還是人機(jī)對(duì)戰(zhàn)。當(dāng)選擇人機(jī)對(duì)戰(zhàn)后,系統(tǒng)會(huì)默認(rèn)難度為中級(jí)水平,首先是玩家下子(左擊單擊,玩家為白子),然后電腦下子。在電腦或是玩家下了子后,電腦立即計(jì)算,是否獲勝、和棋。若有一種情況出現(xiàn),則
25、暫停游戲顯示出相應(yīng)的結(jié)果。然后可以根據(jù)提示重新開(kāi)始或者從菜單中重新開(kāi)始游戲。當(dāng)選擇人人對(duì)戰(zhàn)后,白子先下(左擊單擊),然后是黑子(右擊單擊),電腦會(huì)在每次落子后判斷是否獲勝、和棋。若有一種情況出現(xiàn),則暫停游戲顯示出相應(yīng)的結(jié)果。3.1系統(tǒng)流程圖流程圖是流經(jīng)一個(gè)系統(tǒng)的信息流、觀點(diǎn)流或部件流的圖形代表。在企業(yè)中,流程圖主要用來(lái)說(shuō)明某一過(guò)程。這種過(guò)程既可以是生產(chǎn)線上的工藝流程,也可以是完成一項(xiàng)任務(wù)必需的管理過(guò)程。流程圖是揭示和掌握封閉系統(tǒng)運(yùn)動(dòng)狀況的有效方式。作為診斷工具,它能夠輔助決策制定,讓管理者清楚地知道,問(wèn)題可能出在什么地方,從而確定出可供選擇的行動(dòng)方案。流程圖有時(shí)也稱(chēng)作輸入-輸出圖。該圖直觀地描
26、述一個(gè)工作過(guò)程的具體步驟。流程圖對(duì)準(zhǔn)確了解事情是如何進(jìn)行的,以及決定應(yīng)如何改進(jìn)過(guò)程極有幫助。這一方法可以用于整個(gè)企業(yè),以便直觀地跟蹤和圖解企業(yè)的運(yùn)作方式。系統(tǒng)流程圖如圖3-1所示。首先進(jìn)入主界面前選擇是人機(jī)對(duì)戰(zhàn)還是人人對(duì)戰(zhàn)。系統(tǒng)默認(rèn)為人機(jī)對(duì)戰(zhàn)。當(dāng)選擇人機(jī)對(duì)戰(zhàn)后,會(huì)提示用戶(hù):?jiǎn)螕糇髶舴虐鬃?,電腦自動(dòng)放黑子。接著看到的界面是我們熟悉的棋盤(pán)。系統(tǒng)默認(rèn)難度為中級(jí),如果需要修改難度,可點(diǎn)擊菜單欄游戲-難度,選擇相應(yīng)的難度。用戶(hù)(白字)先下子,之后電腦根據(jù)算法計(jì)算,是否和棋,是否玩家獲勝,若有一種情況發(fā)生,則進(jìn)入暫停階段,此時(shí)下子則無(wú)效,電腦顯示相應(yīng)的結(jié)果,否則電腦就根據(jù)自己的得分算法,計(jì)算出最佳位置,電
27、腦把子落到最佳位置上。電腦下子了后,則電腦繼續(xù)判斷是否和棋,是否電腦獲勝,若有一種情況發(fā)生,同樣進(jìn)入到暫停階段,顯示相應(yīng)的結(jié)果。當(dāng)選擇人人對(duì)戰(zhàn)后,會(huì)提示用戶(hù):白方單擊鼠標(biāo)左鍵下子,黑方單擊鼠標(biāo)右鍵下子。白方先下。接著顯示人人對(duì)戰(zhàn)的棋盤(pán)。 白方左擊單擊先下子,之后電腦根據(jù)算法計(jì)算,是否雙方和棋,是否獲勝,若有一種情況發(fā)生,則進(jìn)入暫停階段,此時(shí)下子則無(wú)效,電腦顯示相應(yīng)的結(jié)果,否則輪到黑方下子。黑方下子后,電腦判斷,是否雙方和棋,是否玩家獲勝,若有一種情況發(fā)生,則進(jìn)入暫停階段,顯示相應(yīng)的結(jié)果。用戶(hù)可以在菜單欄中游戲-重新開(kāi)局,直接中斷游戲,重新開(kāi)始新的游戲。退出則直接點(diǎn)關(guān)閉按鈕就行。雙人對(duì)戰(zhàn)雙人對(duì)戰(zhàn)
28、NNNN單機(jī)對(duì)戰(zhàn)NNYYY進(jìn)入雙人界面和棋獲勝獲勝白子下子(左擊)黑子下子(右擊)停止并顯示結(jié)果開(kāi)始游戲選擇模式進(jìn)入單機(jī)界面玩家下子和棋電腦下子獲勝獲勝停止并顯示結(jié)果重新開(kāi)始當(dāng)前頁(yè)面NY圖3-1 五子棋系統(tǒng)流程圖3.2系統(tǒng)類(lèi)圖類(lèi)圖是顯示了模型的靜態(tài)結(jié)構(gòu),特別是模型中存在的類(lèi)、類(lèi)的內(nèi)部結(jié)構(gòu)以及它們與其他類(lèi)的關(guān)系等。類(lèi)圖一般在詳細(xì)設(shè)計(jì)過(guò)程中出現(xiàn),主要用來(lái)描述系統(tǒng)中各個(gè)模塊中類(lèi)之間的關(guān)系,包括類(lèi)或者類(lèi)與接口的繼承關(guān)系,類(lèi)之間的依賴(lài)、聚合等關(guān)系。通過(guò)類(lèi)圖,就能實(shí)際的把系統(tǒng)中的各個(gè)類(lèi),即對(duì)象描述清清楚楚。類(lèi)圖就像建造房屋使用的藍(lán)圖,決定著系統(tǒng)的優(yōu)劣。圖3-2就是五子棋的系統(tǒng)類(lèi)圖。圖3-2 五子棋系統(tǒng)類(lèi)圖
29、本系統(tǒng)是基于MFC開(kāi)發(fā)的,從類(lèi)圖中可以明顯的看出MFC的框架結(jié)構(gòu),了解MFC程序的整個(gè)運(yùn)行機(jī)制。 利用全局變量theAPP啟動(dòng)應(yīng)用程序,調(diào)用CTryApp的構(gòu)造函數(shù)來(lái)初始化一些工作,然后,進(jìn)入WinMain函數(shù),調(diào)用CTryApp的InitInstance函數(shù),初始化窗口,包括窗口類(lèi)的注冊(cè)、創(chuàng)建,窗口的顯示和更新。接著,進(jìn)入消息循環(huán)。由CTryView類(lèi)調(diào)用CTryDoc類(lèi)和三個(gè)對(duì)話框類(lèi)來(lái)接受消息,處理消息。以上剛剛實(shí)現(xiàn)了MFC的基本框架結(jié)構(gòu),使得系統(tǒng)能夠正常運(yùn)行。在CTryView中實(shí)現(xiàn)了系統(tǒng)主界面的設(shè)計(jì)和實(shí)現(xiàn),并且系統(tǒng)的基本操作捕捉和相應(yīng)都在此類(lèi)中實(shí)現(xiàn)。CTryDoc被CTryView調(diào)用
30、,實(shí)現(xiàn)系統(tǒng)的核心功能,人工智能。在CTryDoc中的ComputerThink1()和ComputerThink2(),實(shí)現(xiàn)了人機(jī)對(duì)戰(zhàn)中,電腦通過(guò)對(duì)棋盤(pán)上棋子的掃面,計(jì)算出最佳落子位置。除此之外,系統(tǒng)的和棋判斷,輸贏判斷都在此類(lèi)中。還有四個(gè)對(duì)話框類(lèi),實(shí)現(xiàn)了基本的人機(jī)交互,玩家對(duì)戰(zhàn)電腦的設(shè)計(jì)。3.3主界面的實(shí)現(xiàn)由于系統(tǒng)的核心是人工智能的設(shè)計(jì)和實(shí)現(xiàn),則對(duì)于其他的一些功能,由于本人的技術(shù)和精力有限,目前只是實(shí)現(xiàn)了一些基本的功能。主窗口是基于MFC而建立起來(lái)的,包括主界面和菜單欄。主界面實(shí)現(xiàn)只要固定主窗口的大小,然后填充主窗口的背景顏色,接著在窗口中央繪畫(huà)棋盤(pán)即可。關(guān)于菜單欄,由于其他的功能沒(méi)有實(shí)現(xiàn),
31、只是實(shí)現(xiàn)了重新開(kāi)局和難度的選擇這兩個(gè)基本的功能,所以只需要一個(gè)菜單就可以了。其他的選擇都是簡(jiǎn)單的基于對(duì)話框而實(shí)現(xiàn)的。本系統(tǒng)首先印入眼簾的是選擇模式對(duì)話框,選擇是雙人對(duì)戰(zhàn)還是人機(jī)對(duì)戰(zhàn)如圖3-3; 當(dāng)選擇人機(jī)對(duì)戰(zhàn)時(shí)進(jìn)入的,系統(tǒng)會(huì)提醒玩家,如圖3-4;單擊確定就進(jìn)入熟悉的五子棋界面。如圖3-5所示。圖3-3 模式選擇 圖3-4 提示圖3-5 人機(jī)對(duì)戰(zhàn)的主界面利用MFC建立一個(gè)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)/如果選擇人機(jī)對(duì)戰(zhàn),則繪畫(huà)DrawBoard()DrawBoard(pDC);else/否則繪畫(huà)DrawBoard1();DrawBoard1(pDC); /人機(jī)對(duì)戰(zhàn)主界面void CTryView:DrawBoard(CDC *pDC) CTryDoc* pDoc = GetDocument(); /畫(huà)背景色/CBrush brush2(RGB(0,120,0);pDC-Selec
33、tObject(&brush2);pDC-Rectangle(0,0,1024,768);/寫(xiě)文字/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,機(jī));pDC-TextOut(50,210,對(duì));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,(初級(jí));elsepDC-TextOut(60
36、,580,(中級(jí));pDC-SelectObject(oldfont);cf.DeleteObject();/畫(huà)棋盤(pán)/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();/畫(huà)黑白子/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);人人對(duì)戰(zhàn)的界面和人機(jī)對(duì)戰(zhàn)的界面很相似,只是左側(cè)的文字不一樣罷了,在這就不進(jìn)行分析了。圖3-6為人人對(duì)戰(zhàn)的界面圖:圖3-6 人人對(duì)戰(zhàn)的主
39、界面圖3.4人人對(duì)戰(zhàn)為了能夠更好的滿足玩家,開(kāi)發(fā)了人人對(duì)戰(zhàn)模式。在此模式下,玩家可以相互切磋,共同提升!為了避免下錯(cuò),設(shè)置白子單擊鼠標(biāo)左擊下子,黑子單擊鼠標(biāo)右擊下子。白子先行。其主界面如圖3-4。當(dāng)白子單擊下子后,計(jì)算機(jī)會(huì)根據(jù)所點(diǎn)的位置而下白子,其代碼如下:void CTryView:OnLButtonDown(UINT nFlags, CPoint point)/左擊單擊所下的子/*部分無(wú)關(guān)的代碼省略*/if(pDoc-ISHeQi()/判斷是否和棋AfxMessageBox(好厲害,竟然能和棋,真是旗鼓相當(dāng)??!);OnRestart();/*部分無(wú)關(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);說(shuō)明:首先判斷是否分出勝負(fù),如果分出則,返回。沒(méi)有分出則檢測(cè)是否和棋,若和棋則返回,沒(méi)有再檢測(cè)所點(diǎn)擊的位置是否在棋盤(pán)上,是否在所點(diǎn)位置為空子,如果是,則下子,畫(huà)子,并且置下一個(gè)下子為黑子,然后判斷是否分出勝負(fù)。當(dāng)白子下之后輪到黑子下子則,右擊單擊下黑子,計(jì)算機(jī)會(huì)根據(jù)所點(diǎn)位置下黑子,其代碼如下:void CTryView:OnRButtonDown(UINT nFlags, CPoint point) /*部分無(wú)關(guān)的代碼省略*/if(pDoc-
42、decided=TRUE)/判斷是否分出勝負(fù) return;if(pDoc-ISHeQi()/判斷是否和棋AfxMessageBox(好厲害,竟然能和棋,真是旗鼓相當(dāng)??!);OnRestart();if(mode=WITH_COMPUTER)/判斷是否為雙人對(duì)戰(zhàn)return;if(next=WHITE)return; if(point.x800|point.y630)/判斷子是否落在棋盤(pán)上 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);/存儲(chǔ)落子位置 DrawBlack(&dc,pos.x,pos.y);next=WHITE;if(pDoc-IsGameOver()/判斷是否分出勝負(fù) pDoc-decided=TRUE; AfxMessageBox(黑方獲勝!);OnRestart(); CView:OnRButtonDown(nFlags, point);說(shuō)明:首先判斷是否分出勝負(fù),如果分出則,返回。沒(méi)有分出則檢測(cè)是否和棋,若和棋則返回,沒(méi)有再檢測(cè)所點(diǎn)擊的位置是否在棋盤(pán)上,是否在所點(diǎn)位置為空子,如果
44、是,則下子,畫(huà)子,并且置下一個(gè)下子為白子,然后判斷是否分出勝負(fù)。就這樣,一直落子,直到有結(jié)果為止。3.5其他一些小功能對(duì)于棋類(lèi)博弈游戲,最重要的當(dāng)然是結(jié)果了,下面就是系統(tǒng)的和棋判斷和勝負(fù)判斷的代碼。3.5.1和棋的代碼和棋代碼位于CTryDoc類(lèi)中,在每次下子之前都會(huì)判斷。BOOL CTryDoc:ISHeQi()if(number=180)/number存儲(chǔ)所下黑子的個(gè)數(shù)return TRUE;elsereturn FALSE;說(shuō)明:和棋的判斷是根據(jù)棋盤(pán)中是否還有空子可下。棋盤(pán)上共有361個(gè)格可下子,由于白子和黑子是交替的下,只要黑子的個(gè)數(shù)乘以2則是棋盤(pán)上目前棋子的個(gè)數(shù)(如果是白子下后,黑子
45、沒(méi)有下,則棋子個(gè)數(shù)為黑子的個(gè)數(shù)*2+1)。棋盤(pán)上由于number存儲(chǔ)的是所下黑子的個(gè)數(shù),總共有361個(gè)格,最終落子的肯定是白字,所以只需要在落白子之前判斷黑子的個(gè)數(shù)就可以知道是否和棋。3.5.2輸贏判斷的代碼判斷輸贏的代碼也位于CTryDoc類(lèi)中是在每次下子之后才會(huì)判斷:BOOL CTryDoc:IsGameOver() int i,j,countw=0,countb=0,ccount,m,n;/countw用于計(jì)算people的子的連續(xù)數(shù),countb為存儲(chǔ)電腦子的連續(xù)個(gè)數(shù), for(i=0;i15;i+)/ccount用于記數(shù)(5),m,n用于存儲(chǔ)要檢測(cè)的子的坐標(biāo) 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;/對(duì)于這個(gè)方向的檢測(cè),如果從現(xiàn)在這個(gè)子開(kāi)始,往方向數(shù)五個(gè)子都是相同顏色的子則獲勝。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;/對(duì)于這個(gè)方向的檢測(cè),如果從現(xiàn)在這個(gè)子開(kāi)始,往方向數(shù)四個(gè)子都是相同顏色的子則獲勝。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;/對(duì)于這個(gè)方向的檢測(cè),如果從現(xiàn)在這個(gè)子開(kāi)始,往方向數(shù)四個(gè)子都是相同顏色的子則獲勝。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;程序說(shuō)明:對(duì)于輸贏的判斷,要對(duì)棋盤(pán)上的所有子進(jìn)行遍歷,當(dāng)檢測(cè)某個(gè)子時(shí),只需要對(duì)其上,左上,左,左下,四個(gè)方向上進(jìn)行判斷,查看是否有五個(gè)連續(xù)相同顏色的子。如果在某個(gè)方向上有五個(gè)連續(xù)的相同顏色的子,則此顏色子獲勝。注意,此獲勝函數(shù)對(duì)黑白子都可適用。只要落子就會(huì)檢測(cè)是否獲勝,所以在獲勝前的最后落的子的玩家,就是獲勝者。3.5.3重新開(kāi)局的代碼當(dāng)然系統(tǒng)還會(huì)有其他的小功能,由于時(shí)間原因,只實(shí)現(xiàn)了
49、重新開(kāi)局這一小功能。無(wú)論玩什么模式,用戶(hù)都可以隨時(shí)重新開(kāi)始一局新的游戲。其實(shí)現(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(操作提示:?jiǎn)螕糇箧I放白子,電腦自動(dòng)下黑子。);else DrawBoard1(&dc); AfxMessageBox(操作提示:白方單擊鼠標(biāo)左鍵放子,黑方單擊鼠標(biāo)右鍵放子。白方先下!);程序說(shuō)明:分別調(diào)用CDlg和CDlg2這兩個(gè)對(duì)話框類(lèi),在系統(tǒng)的提示下初始化棋盤(pán),重新開(kāi)局。4 人工智能的設(shè)計(jì)與實(shí)現(xiàn)本章節(jié)將要探討系統(tǒng)的核心內(nèi)容人工智能的設(shè)計(jì)思路和代碼實(shí)現(xiàn)。其具體的實(shí)現(xiàn)包括以下幾點(diǎn):1難度為初級(jí)的現(xiàn)實(shí)2難度為中級(jí)的實(shí)現(xiàn)。4.1難度為初級(jí)的現(xiàn)實(shí)4.1.1.基本思路一個(gè)子對(duì)要是對(duì)其他子造成影響,則這些受影響的子必定在這個(gè)子的周?chē)R詧D3-1中的A點(diǎn)為例,受A影響的所有的子都
51、在以A為中心,八個(gè)方向上的四個(gè)子。如3-1圖中的A子周?chē)淖?。但是由于?guī)則,五個(gè)的相同顏色的子能夠連在成一條線,就可以獲勝。所以,A子對(duì)其周?chē)淖拥挠绊懸膊皇且粯拥摹T绞请xA越近,則受到A的影響就越大,反之,受A的影響就越小。如圖4-1中的B點(diǎn)和C點(diǎn)就不受A點(diǎn)的影響!那么怎么判斷是否應(yīng)該在A點(diǎn)下子,要是下子,是黑子還是白子呢。1 2 3 4 5 15 16 17 18 192211111112221212A121121112222221311452345P54325 43圖41五子棋棋盤(pán)我用的是記分規(guī)則。在游戲中,為了讓電腦找到最佳的走法,必須計(jì)算出電腦下到棋盤(pán)中任一格的分?jǐn)?shù),得到其中最高分即
52、是電腦下的位置。由于一個(gè)子對(duì)其他子的影響與距離相關(guān),我們這樣規(guī)定,以圖4-1中的P點(diǎn)為例,離點(diǎn)P越近,它對(duì)P點(diǎn)的影響就越大,對(duì)于點(diǎn)P在此點(diǎn)所要加(減)的分?jǐn)?shù)就越大,反之,越遠(yuǎn)則所要加(減)的分就越小,我們以1為單位來(lái)計(jì)算。如圖3-1下部分點(diǎn)P周?chē)臄?shù)字就是這些點(diǎn)對(duì)點(diǎn)P所要加(減)的分?jǐn)?shù)。這樣,在玩家下子后,對(duì)棋盤(pán)中的所有的空子進(jìn)行遍歷計(jì)算其得分情況。為了討論方便,我只畫(huà)了一個(gè)10X10的表格(其中C表示電腦的子,P表示玩家的子,以下統(tǒng)計(jì)的是電腦的得分情況),途中的數(shù)字就是每個(gè)格所得的分?jǐn)?shù)。ABABCDEFGHIJ2002500120330370130004449140002355P543211
53、11CP5111100159540000144744300130350332020023002210001100011圖4-2 難度為初級(jí)的電腦的得分情況以圖4-2中格F5為例,首先計(jì)算F5上方方向的得分。由于D5和E5都是玩家子,則F5在上方的得分是sco_n=5+4(我們先以玩家對(duì)其的影響為正);其中5分是E5的玩家子對(duì)F5的影響,4分是D5的玩家子對(duì)F5的影響。這樣就算出F5在上方的得分為9。同理,F(xiàn)5在左上方的得分請(qǐng)情況是sco_wn-=5;其中減5是因?yàn)?,其左上方的子為電腦子。這樣F5在左上方的得分為-5。按照上面所說(shuō)的記分規(guī)則計(jì)算出一個(gè)空子周?chē)淖訉?duì)其影響而得的分。這樣我們就會(huì)得到
54、八個(gè)分?jǐn)?shù)。由于左右方向,上下方向,左上至右下方向,左下至右上的方向,這四個(gè)大的方向沒(méi)有計(jì)算其分?jǐn)?shù),只要把八個(gè)方向的值相對(duì)應(yīng)的兩兩相加(注意此時(shí)還區(qū)分正負(fù)),就得到這四個(gè)方向上的得分情況了。然后所得到的12個(gè)數(shù)取絕對(duì)值,其中最大的那個(gè)數(shù),也就是周?chē)c(diǎn)對(duì)其影響的最大程度,就是此點(diǎn)的得分情況了。遍歷棋盤(pán)上所有空子,計(jì)算其所得的分?jǐn)?shù),得到其中最高分就是電腦下的位置。這就難度為初級(jí)的基本思路和得分計(jì)算規(guī)則。4.1.2.代碼實(shí)現(xiàn)難度為初級(jí)的代碼:CPoint CTryDoc:ComputerThink1()CPoint point;/用于存儲(chǔ)所計(jì)算出的最佳點(diǎn)int i,j,m,n,ccount,max1=
55、0,max1_x,max1_y;/max1存儲(chǔ)所計(jì)算出的最大數(shù),max1_x,max1_y存儲(chǔ)最佳點(diǎn)的坐標(biāo)for(i=0;i15;i+) for(j=0;j=0&n=0&ccount0;m-,n-,ccount-) /nw 對(duì)此方向上的分?jǐn)?shù)統(tǒng)計(jì) switch(conditionmn) case EMPTY: break; case PEOPLE: sco_nwij+=ccount; break; case COMPUTER: sco_nwij-=ccount; break; default: break; /*省略其他七個(gè)方向上的得分算法*/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;/返回所計(jì)算出來(lái)的點(diǎn)程序說(shuō)明:遍歷棋盤(pán)上所有的空子,分別對(duì)他們進(jìn)行分?jǐn)?shù)統(tǒng)計(jì)。以左方向?yàn)槔瑥目兆幼髷?shù)五個(gè)點(diǎn),第一個(gè)點(diǎn)如果為空子,跳過(guò);若為玩家所下的子,則sco_eij+=ccount;(此時(shí)ccount為5);若為,電腦所下的子,則sco_eij-=ccount;(此時(shí)ccount為5);然后在計(jì)算其他四子,但是所加減的數(shù)字則依次遞減。最終把結(jié)果存入sco_eij中,然后依次在計(jì)算其他七個(gè)方向的分?jǐn)?shù),對(duì)于左右,上下,左上至右下,左下至右上這四個(gè)方向的分?jǐn)?shù)用已算出的八個(gè)方向相加即可。然后對(duì)這12個(gè)數(shù)取絕對(duì)值最后在取出最大數(shù)存到scoij中,即為這點(diǎn)的得分。遍歷所有的空點(diǎn)后所得到的分?jǐn)?shù)在
58、去最大值,此點(diǎn)的坐標(biāo)就是電腦所要下子的坐標(biāo)。解釋?zhuān)捍硕未a簡(jiǎn)單的實(shí)現(xiàn)了人機(jī)對(duì)戰(zhàn)的功能。以a為例,子a要是對(duì)其他的子造成影響,則其他子必須在a的周?chē)?,以a為中心,八個(gè)方向上的四個(gè)子都受其影響。但是,越是離a越近,其影響就越大,反之,則受其影響越小。若是受影響的子是和a是相同顏色的,則受影響的子和a會(huì)相互促進(jìn),從而得分要減ccount(抑制時(shí),得分為正)。若是受影響的子是和a是不相同顏色的,則受影響的子和a會(huì)相互抑制,從而得分要加ccount。由于只是計(jì)算出以a為中心的八個(gè)方向上的得分情況,但是沒(méi)有算出穿過(guò)a的四個(gè)方向的得分,只需要把兩個(gè)分方向上的分?jǐn)?shù)相加即可。然后取絕對(duì)值,比較這十二個(gè)數(shù)的最大值
59、,得到的結(jié)果就是這點(diǎn)對(duì)周?chē)绊懙淖畲笾怠H缓笞畲蟮哪莻€(gè)數(shù)的位置,就是電腦所落子的位置。4.2難度為中級(jí)的實(shí)現(xiàn)雖然初級(jí)的代碼能夠?qū)崿F(xiàn)基本的人機(jī)對(duì)戰(zhàn),但是在計(jì)算得分情況時(shí),往往會(huì)遇到不止一個(gè)最大值。如圖4-2,當(dāng)該輪到電腦下子時(shí),電腦會(huì)計(jì)算出兩個(gè)最佳位置。但是由于遍歷的順序,也許會(huì)選擇C5的位置下子。一般的玩家會(huì)一眼看出F5的位置才是最佳的位置。為了能夠選出最佳位置,從而開(kāi)發(fā)出難度為中級(jí)的功能。4.2.1.基本思路玩家在每次下子時(shí)都會(huì)選擇是進(jìn)攻還是防守。對(duì)于電腦是不是也可以實(shí)現(xiàn)進(jìn)攻和防守的功能呢?本人就試圖讓電腦實(shí)現(xiàn)這樣的功能。要使電腦有防守和進(jìn)攻功能,就必須對(duì)棋盤(pán)上的棋子分別用防守和進(jìn)攻來(lái)進(jìn)行掃
60、描。算出其最后得分,得分最高的就為此點(diǎn)的最終得分。然后在算出所有的點(diǎn)的得分,得到其中最高分即是電腦下的位置。要想進(jìn)攻,就必須知道自己的子是否有連在一起的,有多少個(gè)連在一起的。同理,防守也必須知道對(duì)方的子有多少是連在一起的。首先我們以進(jìn)攻為例。要想進(jìn)攻就必須了解自己的子的連續(xù)情況,首先知道自己的子在哪個(gè)地方連續(xù)的最多,然后查看連續(xù)的兩頭是否有空子可落子,如果兩端都是空子,判斷自己的子落在哪一端比較合適。然后根據(jù)相關(guān)的算法,算出這空子的進(jìn)攻分?jǐn)?shù)。同理,根據(jù)檢測(cè)對(duì)方子的情況,也可以算出這空子防御得分。然后其中的最大分就是這點(diǎn)的總的得分。遍歷棋盤(pán)上所有空子,計(jì)算出他們的得分情況,其中的最大值,也就是我
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 眾籌購(gòu)買(mǎi)合同范本
- 免招標(biāo)合同范本
- 買(mǎi)房贈(zèng)與車(chē)庫(kù)合同范本
- 冷凍物品購(gòu)銷(xiāo)合同范本
- 2025屆中國(guó)電建集團(tuán)重慶工程有限公司秋季招聘筆試參考題庫(kù)附帶答案詳解
- 交流合同范本
- 義診合作合同范本
- 獸醫(yī)雇傭合同范本
- 創(chuàng)建服務(wù)合同范本
- 三方企業(yè)合資經(jīng)營(yíng)合同范本
- 自動(dòng)化電氣控制方案
- 臍疝護(hù)理查房課件
- XX學(xué)校學(xué)校集體備課實(shí)施方案細(xì)則、方案、計(jì)劃、制度、總結(jié)(全套資料)
- 開(kāi)展去向不明人員專(zhuān)項(xiàng)工作方案
- 無(wú)人機(jī)項(xiàng)目商業(yè)計(jì)劃書(shū)
- 南方談話學(xué)習(xí)匯報(bào)
- 高處作業(yè)吊籃施工安全監(jiān)理實(shí)施細(xì)則
- 中國(guó)結(jié)核病預(yù)防性治療指南
- 大班科學(xué)《燈的故事》PPT優(yōu)質(zhì)課件
- 危重癥呼吸支持治療
- 雅馬哈電子琴KB290說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論