已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔 2015 屆畢業(yè)設(shè)計(jì)論文 基于OpenGL的小型游戲開(kāi)發(fā)及實(shí)踐 院 、 部: 計(jì)算機(jī)與信息科學(xué)學(xué)院 學(xué)生姓名: 杜磊 指導(dǎo)教師: 方小勇 職稱 副教授 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí): 1103 完成時(shí)間: 2015-6 摘 要信息時(shí)代的到來(lái)使得電腦越來(lái)越普及,人們對(duì)電腦游戲的需求也越來(lái)越高。游戲的界面美觀性,可操作性無(wú)疑是人們考慮的關(guān)鍵因素。OpenGL是一種主流的圖形處理工具,基于OpenGL開(kāi)發(fā)的小游戲有更好的觀賞性,本次論文論述的是基于OpenGL開(kāi)發(fā)的五子棋小游戲。五子棋,起源于中國(guó)古代傳統(tǒng)的黑白棋游戲,簡(jiǎn)單易懂又不缺乏趣味性。其中的對(duì)弈較量,不僅增強(qiáng)人的思維能力,開(kāi)發(fā)人的智力,而且簡(jiǎn)單的游戲規(guī)則中蘊(yùn)含著深?yuàn)W的棋技,是修身養(yǎng)性,陶冶情操的一款經(jīng)典游戲。本次論文是基于OpenGL和C+語(yǔ)言在Visual Studio 2008環(huán)境下編程,設(shè)計(jì)了一款人機(jī)對(duì)戰(zhàn)、人人對(duì)戰(zhàn)功能的五子棋游戲。采用極大極小搜索算法及alpha-beta剪枝算法,采取優(yōu)先級(jí)策略來(lái)判別棋局,實(shí)現(xiàn)了單機(jī)游戲的人工智能。運(yùn)用了OpenGL的alpha混合及深度測(cè)試等一系列的特性,將計(jì)算機(jī)圖形學(xué)與算法相結(jié)合,旨在設(shè)計(jì)出一款界面客觀性強(qiáng),游戲可操作性強(qiáng)的一款小游戲軟件。通過(guò)學(xué)習(xí),基本掌握OpenGL函數(shù)庫(kù)的使用,能夠制作簡(jiǎn)單的平臺(tái)界面,實(shí)現(xiàn)人機(jī)交互功能,探討和研究了博弈論的相關(guān)知識(shí),學(xué)會(huì)將算法與日常事務(wù)的結(jié)合,運(yùn)用算法去解決問(wèn)題。由于時(shí)間原因,界面的美觀性有待改進(jìn),游戲的多樣性以及難易程度的合理性并不是做的很好,希望在今后的學(xué)習(xí)中更加完善不足的功能。關(guān)鍵詞 : OpenGL;五子棋;小游戲;博弈論7歡迎下載7歡迎下載7歡迎下載。ABSTRACTThe arrival of information age makes computers more and more widespread, people are also more and more high demand for computer games. The game interface aesthetics, operability is undoubtedly the key factors what people consider. OpenGL is a mainstream of graphics processing tools, based on OpenGL, little game have a better view and admire a gender, this thesis is based on OpenGL developed gobang game.Gobang, originated in the ancient Chinese traditional black white game, easy to understand and not a lack of interest. The game, not only enhance the persons thinking ability, developers of intelligence, and the simple rules of the game contains profound Chess skills, cultivate ones morality raises a gender, edify sentiment of a classic game.This paper is based on OpenGL and C+ language programming in Visual Studio 2008 environment, designed a function of the man-machine against and everyone against gobang game. The minimax search algorithm and alpha - beta pruning algorithm, discriminant chess, take priority strategy to realize the single-player game AI. Using a series of features about the alpha blend of OpenGL and depth test and so on, combining computer graphics and algorithm, aims to design an interface strong objectivity, games strong operability of a small game software.Through learning that the basic to master the use of OpenGL library function, I can make a simple platform interface, realize the human-computer interaction function, discusses and studies the related theory knowledge, learn to algorithm combined with the daily affairs, using the algorithm to solve the problems. Due to time reasons, interface aesthetics needs to be improved, the diversity of the game, and the rationality of ease is not doing very well, the lack of hope in the future to learn to be more perfect function.Key words : OpenGL; Gobang; game; game theory目 錄1 緒論11.1 課題研究的背景及意義11.2 五子棋的發(fā)展與現(xiàn)狀21.3 OpenGL國(guó)內(nèi)外研究現(xiàn)狀21.4 本章總結(jié)32 基于OpenGL五子棋開(kāi)發(fā)使用工具42.1 C+42.2 OpenGL42.2.1 什么是OpenGL42.2.2 OpenGL的特點(diǎn)52.3 Visual Studio 200852.4 本章總結(jié)63 基于OpenGL五子棋算法的實(shí)現(xiàn)73.1 極大極小搜索中的評(píng)價(jià)函數(shù)73.2 極大極小搜索及alpha-beta剪枝123.3 本章總結(jié)134 基于OpenGL五子棋系統(tǒng)設(shè)計(jì)144.1 操作設(shè)計(jì)144.1.1 人機(jī)對(duì)戰(zhàn)144.1.2 人人對(duì)戰(zhàn)154.1.3 鼠標(biāo)與鍵盤(pán)的操作164.3 界面設(shè)計(jì)184.3.1 OpenGL的圖形生成184.3.2 基本圖形的繪制方法194.3.3 主界面窗口設(shè)計(jì)204.3.4 棋盤(pán)界面設(shè)計(jì)224.1 本章總結(jié)235 系統(tǒng)實(shí)現(xiàn)246 總結(jié)29參考文獻(xiàn)30致 謝32附 錄331 緒論本章節(jié)研究課題的背景及意義,明確做次課題的目的,通過(guò)查閱資料更好地熟悉課題。1.1 課題研究的背景及意義人類之所以不斷在進(jìn)步,是因?yàn)槲覀內(nèi)祟愐恢辈粩嗟脑谒伎迹趯W(xué)習(xí)完計(jì)算機(jī)圖形學(xué)這門(mén)課程之后,我對(duì)圖形學(xué)的研究很感興趣,我在思考能不能用所學(xué)的知識(shí)來(lái)做一些實(shí)踐,恰巧我平時(shí)喜歡棋類游戲,我就想基于OpenGL來(lái)開(kāi)發(fā)一款游戲,而五子棋游戲程序的開(kāi)發(fā)符合人類進(jìn)步也是促進(jìn)人類進(jìn)步的一大動(dòng)力之一。五子棋游戲程序讓人們方便快捷的可以下五子棋,讓人們?cè)诤螘r(shí)都能通過(guò)下棋來(lái)提高邏輯思維能力,同時(shí)也培養(yǎng)兒童的興趣以及愛(ài)好,讓孩子更加聰明。同時(shí),五子棋游戲程序的開(kāi)發(fā)也使得五子棋這個(gè)游戲得到了廣泛的推廣,讓世界各地的人們知道五子棋,玩上五子棋,這已經(jīng)不是局限。五子棋游戲程序使得越來(lái)越多的人喜歡上了五子棋,熱愛(ài)下五子棋,它是具有很好的帶動(dòng)性的。于是我收集了國(guó)內(nèi)外有關(guān)計(jì)算機(jī)圖形學(xué)的資料,我發(fā)現(xiàn)國(guó)內(nèi)外最近幾年計(jì)算機(jī)圖形學(xué)發(fā)展迅速,使得三維表現(xiàn)技術(shù)得以形成,這些三維表現(xiàn)技術(shù)使單調(diào)的二維界面逐步轉(zhuǎn)變?yōu)樨S富立體的三圍界面,我們能夠再現(xiàn)三維世界中的物體,能夠用三維形體來(lái)表示復(fù)雜的信息,這種技術(shù)就是可視化(Visualization)技術(shù)。可視化技術(shù)把數(shù)據(jù)轉(zhuǎn)化為圖形,使人能夠在三維圖形世界中直接對(duì)具有形體的信息進(jìn)行操作,和計(jì)算機(jī)直接交流。這都?xì)w功于計(jì)算機(jī)圖形學(xué)、計(jì)算機(jī)可視化技術(shù)的發(fā)展。人們對(duì)計(jì)算機(jī)可視化技術(shù)的研究已經(jīng)歷了一個(gè)很長(zhǎng)的歷程,而且形成了許多可視化工具,其中SGI公司推出的GL三維圖形庫(kù)表現(xiàn)突出,易于使用而且功能強(qiáng)大。進(jìn)而發(fā)展為OpenGL。OpenGL作為一個(gè)圖形硬件接口,很好地為程序員提供一個(gè)功能強(qiáng)大,低層次的渲染庫(kù),能夠運(yùn)用于任何軟件平臺(tái),也得到了廣泛的硬件支持。OpenGL也為游戲開(kāi)發(fā)提供強(qiáng)大的圖形界面平臺(tái),使得游戲畫(huà)面感豐富,提高可觀賞性。可見(jiàn)基于OpenGL的游戲開(kāi)發(fā)將會(huì)成為主流市場(chǎng),會(huì)給游戲行業(yè)帶來(lái)新一番的收獲和體驗(yàn)。所以我想基于OpenGL來(lái)制作一款五子棋小游戲,對(duì)此課題的研究也將讓我更近一步熟悉OpenGL,通過(guò)動(dòng)手實(shí)踐更好地學(xué)習(xí)新知識(shí),鞏固舊知識(shí)2歡迎下載。1.2 五子棋的發(fā)展與現(xiàn)狀充分的準(zhǔn)備是成功的第一步,在確定了這一論文課題后,我收集了大量的有關(guān)于五子棋的資料,五子棋這一棋類運(yùn)動(dòng)已迅速在國(guó)際上發(fā)展起來(lái)。外國(guó)人都十分看好這一不起眼的智力游戲,并認(rèn)為五子棋不僅能提高思維、開(kāi)發(fā)智力、手腦并用、修身養(yǎng)性而且富含哲理,具有東方的神秘和西方的直觀,是中西文化的交匯點(diǎn)。許多國(guó)家的人對(duì)五子棋都有不同的愛(ài)稱,例如韓國(guó)人把五子棋稱之為“情侶棋”,因?yàn)槲遄悠蹇梢詢蓚€(gè)人下,別有一番趣味,所以此次設(shè)計(jì)中,我將設(shè)計(jì)人人對(duì)戰(zhàn)功能,供雙人玩這個(gè)游戲,言下之意,我希望設(shè)計(jì)一款情人之間可以下的五子棋,這樣有利于增加情感的交流;歐洲人稱之為“中老年棋”,表示五子棋適合中老年人的生理特點(diǎn)和思維方式,所以我這一次設(shè)計(jì)中希望設(shè)計(jì)人機(jī)對(duì)戰(zhàn)的功能,這樣老年人就可以跟電腦下棋,為老年人提供一個(gè)休閑娛樂(lè)的工具,由此可見(jiàn),盡管國(guó)度不同,語(yǔ)言各異,但人們都可以借助五子棋這一簡(jiǎn)單而又深?yuàn)W的棋藝進(jìn)行交流、比賽,增進(jìn)友誼,這也是我從五子棋的現(xiàn)狀中得到啟發(fā)想要設(shè)計(jì)的一款軟件。五子棋的流行令人瞠目結(jié)舌,目前有幾十個(gè)國(guó)家都在下五子棋,也引申出各種級(jí)別和規(guī)模的比賽。自1989年起,每?jī)赡甓加形遄悠迨澜珏\標(biāo)賽舉行,從第一屆在日本東京都到俄羅斯聯(lián)邦的莫斯科、瑞典以及愛(ài)沙尼亞的塔林,一屆比賽比一屆精彩,日本人在這個(gè)比賽中一直都占據(jù)了領(lǐng)先的位置,除第三屆的冠軍是愛(ài)沙尼亞人之外,其余三屆的冠軍都是日本人。日本目前對(duì)連珠(五子棋)技術(shù)的研究也相當(dāng)普遍和全面,并且日本五子棋職業(yè)棋手是令人敬畏的,他們的水平是世界級(jí)的,并且在日益增長(zhǎng)。同時(shí)五子棋的理論研究與探索也呈現(xiàn)蓬勃發(fā)展的勢(shì)頭,從1858年第一部五子棋專著問(wèn)世以來(lái),目前,全世界有2000多種五子棋的書(shū)籍及期刊,且用各種語(yǔ)言發(fā)行。五子棋在我國(guó)的各省市地區(qū)都有很大的發(fā)展,收到人們的喜愛(ài)。最具有代表性的就屬北京,舉辦了各種規(guī)模的賽事,其他省市也舉辦了大大小小的賽事。所以我覺(jué)得做一個(gè)五子棋系統(tǒng)肯定有很多人喜愛(ài)。1.3 OpenGL國(guó)內(nèi)外研究現(xiàn)狀OpenGL作為一個(gè)性能優(yōu)越的圖形應(yīng)用程序設(shè)計(jì)界面(API)適合于廣泛的計(jì)算機(jī)環(huán)境,從個(gè)人計(jì)算機(jī)、工作站到超級(jí)計(jì)算機(jī),OpenGL都能實(shí)現(xiàn)高性能的圖形功能。由于許多在計(jì)算機(jī)界具有領(lǐng)導(dǎo)地位的計(jì)算機(jī)公司紛紛采用OpenGL作為圖形應(yīng)用程序設(shè)計(jì)界面,OpenGL應(yīng)用程序具有廣泛的移植性。OpenGL已成為目前的圖形開(kāi)發(fā)標(biāo)準(zhǔn)。OpenGL(OpenGL Graphics Library,開(kāi)發(fā)性圖形庫(kù))是目前用于開(kāi)發(fā)2D圖形應(yīng)用程序的首選環(huán)境,具有可移植性、可交換性等優(yōu)點(diǎn),是行業(yè)領(lǐng)域中最為廣泛接納的2D圖形API,也是目前應(yīng)用最為廣泛的計(jì)算機(jī)圖形標(biāo)準(zhǔn),其自誕生至今已催生了各種計(jì)算機(jī)平臺(tái)及設(shè)備上的數(shù)千優(yōu)秀應(yīng)用程序。通過(guò)對(duì)OpenGL的特點(diǎn)、功能、工作流程和繪圖流程的學(xué)習(xí),我們將會(huì)對(duì)OpenGL有一個(gè)初步的了解,建立起基本的概念。在國(guó)外OpenGL是具有一定的生命力的,唯一能夠取代微軟對(duì)圖形技術(shù)的完全控制的API。但是由于Silicon Graphics公司已經(jīng)不再以任何讓微軟不悅的方式推廣OpenGL,所以采用OpenGL開(kāi)發(fā)游戲還是具有一定風(fēng)險(xiǎn)。鑒于OpenGL的特點(diǎn),還是有許多非常重要的開(kāi)發(fā)人員仍然在使用OpenGL進(jìn)行游戲的開(kāi)發(fā)與創(chuàng)作。因此,硬件開(kāi)發(fā)商目前正在想法設(shè)法地加強(qiáng)硬件對(duì)OpenGL的技術(shù)支持。1.4 本章總結(jié)通過(guò)查閱資料和閱讀文獻(xiàn),我了解到OpenGL小游戲制作的研究現(xiàn)狀,了解一些商業(yè)上對(duì)OpenGL的運(yùn)用,通過(guò)對(duì)五子棋的調(diào)研發(fā)現(xiàn),喜歡這一游戲的人居多,所以我明確了本次課題的對(duì)象:基于OpenGL設(shè)計(jì)出一款五子棋游戲。2 基于OpenGL五子棋開(kāi)發(fā)使用工具2.1 C+C+是在C語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)的一種通用編程語(yǔ)言,應(yīng)用廣泛。C+支持多種編程范式 面向?qū)ο缶幊獭⒎盒途幊毯瓦^(guò)程化編程。C+語(yǔ)言靈活,運(yùn)算符的數(shù)據(jù)結(jié)構(gòu)豐富、具有結(jié)構(gòu)化控制語(yǔ)句、程序執(zhí)行效率高,而且同時(shí)具有高級(jí)語(yǔ)言與匯編語(yǔ)言的優(yōu)點(diǎn),與其它語(yǔ)言相比 ,可以直接訪問(wèn)物理地址,與匯編語(yǔ)言相比又具有良好的可讀性和可移植性。C+引入了面向?qū)ο蟮母拍睿沟瞄_(kāi)發(fā)人機(jī)交互類型的應(yīng)用程序更為簡(jiǎn)單、快捷。2.2 OpenGL2.2.1 什么是OpenGLOpenGL是一種圖形與硬件的接口。它包括了上百個(gè)圖形函數(shù),開(kāi)發(fā)者可以用這些函數(shù)來(lái)建立三維模型和進(jìn)行三維實(shí)時(shí)交互。與其他圖形程序設(shè)計(jì)接口不同,OpenGL提供了十分清晰明了的圖形函數(shù),因此初學(xué)的程序設(shè)計(jì)員也能利用OpenGL的圖形處理能力和1670萬(wàn)種色彩的調(diào)色板很快地設(shè)計(jì)出三維圖形以及三維交互軟件。OpenGL強(qiáng)有力的圖形函數(shù)不要求開(kāi)發(fā)者把三維物體模型的數(shù)據(jù)寫(xiě)成固定的數(shù)據(jù)格式,這樣開(kāi)發(fā)者不但可以直接使用自己的數(shù)據(jù),而且可以利用其他不同格式的數(shù)據(jù)源。這種靈活性極大地節(jié)省了開(kāi)發(fā)者的時(shí)間,提高了軟件開(kāi)發(fā)效益。長(zhǎng)期以來(lái),從事三維圖形開(kāi)發(fā)的技術(shù)人員都不得不在自己的程序中編寫(xiě)矩陣變換、外部設(shè)備訪問(wèn)等函數(shù),這樣為調(diào)制這些與自己的軟件開(kāi)發(fā)目標(biāo)關(guān)系并不十分密切的函數(shù)費(fèi)腦筋,而OpenGL正是提供一種直觀的編程環(huán)境,它提供的一系列函數(shù)大大地簡(jiǎn)化了三維圖形程序。(1)OpenGL提供一系列的三維圖形單元供開(kāi)發(fā)者調(diào)用。(2)OpenGL提供一系列的圖形變換函數(shù)。 (3)OpenGL提供一系列的外部設(shè)備訪問(wèn)函數(shù),使開(kāi)發(fā)者可以方便地訪問(wèn)鼠標(biāo)、鍵盤(pán)、空間球、數(shù)據(jù)手套等這種直觀的三維圖形開(kāi)發(fā)環(huán)境體現(xiàn)了OpenGL的技術(shù)優(yōu)勢(shì),這也是許多三維圖形開(kāi)發(fā)者熱衷于OpenGL的緣由所在。2.2.2 OpenGL的特點(diǎn)OpenGL具有標(biāo)準(zhǔn)化:它是唯一真正開(kāi)放的,獨(dú)立于供應(yīng)商的、跨平臺(tái)的圖形標(biāo)準(zhǔn)。穩(wěn)定性:OpenGL用時(shí)間證明它在各個(gè)平臺(tái)上運(yùn)用良好,它具有明確而控制良好的規(guī)范,并具有向后兼容性,使現(xiàn)有的應(yīng)用程序不會(huì)失效。擴(kuò)展性:許多開(kāi)發(fā)商利用這一特性通過(guò)對(duì)API進(jìn)行擴(kuò)展來(lái)對(duì)OpenGL的功能進(jìn)行升級(jí)。可縮放性:基于OpenGL的應(yīng)用程序可以在各種系統(tǒng)上運(yùn)行,其范圍從家用電腦到PC機(jī),從工作站到超級(jí)計(jì)算機(jī),可以說(shuō),OpenGL應(yīng)用程序可以適應(yīng)開(kāi)發(fā)人員選擇的各種目標(biāo)平臺(tái)。易用性:OpenGL具有良好的結(jié)構(gòu),直觀的設(shè)計(jì)和邏輯命令。與其他的圖形程序包相比,OpenGL應(yīng)用程序的代碼行數(shù)少。此外,OpenGL封裝了有關(guān)基本硬件信息,使開(kāi)發(fā)人員無(wú)須針對(duì)具體的硬件進(jìn)行專門(mén)的設(shè)計(jì)。可靠性和可移植性:在OpenGL兼容的任何硬件上,不管使用什么操作系統(tǒng),同一個(gè)應(yīng)用程序的顯示結(jié)果均相同。與其它圖形程序包相比,OpenGL應(yīng)用程序的代碼行數(shù)少。此外,OpenGL封裝了有關(guān)基本硬件的信息,使開(kāi)發(fā)人員無(wú)需針對(duì)具體的硬件進(jìn)行專門(mén)的設(shè)計(jì)。在CAD/CAM/CAE、醫(yī)學(xué)圖像處理、虛擬現(xiàn)實(shí)、娛樂(lè)、廣告等不同領(lǐng)域中,開(kāi)發(fā)人員可以利用OpenGL的這些能力自由發(fā)揮自己的創(chuàng)造性。2.3 Visual Studio 2008Visual studio 2008是微軟自行研發(fā)的一款開(kāi)發(fā)系統(tǒng),支持Windows平臺(tái)下各類應(yīng)用軟件和應(yīng)用服務(wù)的開(kāi)發(fā)。作為C+與OpenGL的開(kāi)發(fā)平臺(tái),能很好地進(jìn)行代碼編寫(xiě)和調(diào)試。具有良好的運(yùn)用性和友好性。Visual studio 2008為程序員提供了一個(gè)面向?qū)ο蟮腤indows編程接口MFC(Microsoft Foundation Class),它大大地簡(jiǎn)化了Windows編程工作。此次小游戲開(kāi)發(fā)中我也使用了編程接口MFC。MFC提供了一個(gè)標(biāo)準(zhǔn)化的結(jié)構(gòu),這樣開(kāi)發(fā)人員不必從頭設(shè)計(jì)創(chuàng)建和管理一個(gè)標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是“站在巨人肩膀上”,從一個(gè)比較高的起點(diǎn)編程,故節(jié)省了大量的時(shí)間;其次,它提供了大量的代碼,指導(dǎo)用戶編程時(shí)實(shí)現(xiàn)某些技術(shù)和功能。對(duì)用戶來(lái)說(shuō),用MFC開(kāi)發(fā)的最終應(yīng)用程序具有標(biāo)準(zhǔn)的、熟悉的Windows界面,這樣的應(yīng)用程序易學(xué)易用。2.4 本章總結(jié)作為一名計(jì)算機(jī)專業(yè)的學(xué)生,利用網(wǎng)絡(luò)資源學(xué)習(xí)是一項(xiàng)基本的技能,我通過(guò)網(wǎng)絡(luò)進(jìn)一步學(xué)習(xí)了本次設(shè)計(jì)所用到的開(kāi)發(fā)工具,很大的提高了我編程水平。3 基于OpenGL五子棋算法的實(shí)現(xiàn)此章節(jié)中將介紹基于OpenGL五子棋所涉及到的一些算法,采用解析代碼的方法,闡述博弈論中的深度搜索策略。3.1 極大極小搜索中的評(píng)價(jià)函數(shù)極大極小搜索策略一般都是使用在一些博弈類的游戲之中,例如本次課題的五子棋游戲。要討論極大極小搜索算法,首先要明白什么是搜索。最基本的搜索方法是暴力搜索:所謂暴力搜索就是采用循環(huán)語(yǔ)句將所有可能的情況搜索一遍,這個(gè)搜索方法在本例中不適用,因?yàn)槿绻捎帽┝λ阉?,把最終的結(jié)果得到的話,搜索樹(shù)的深度太大了,機(jī)器不能滿足。所以我們考慮另一個(gè)搜索策略,即深度搜索。規(guī)定一個(gè)搜索的深度,在這個(gè)深度范圍內(nèi)進(jìn)行深度優(yōu)先搜索。極大極小搜索算法的本質(zhì)就是深度搜索,在搜索過(guò)程中,對(duì)本方有利的搜索點(diǎn)上應(yīng)該取極大值,而對(duì)本方不利的搜索點(diǎn)上應(yīng)該取極小值。這里的極大極小值是相對(duì)而言的。在設(shè)計(jì)人與機(jī)器對(duì)弈的情況下,我應(yīng)該站在機(jī)器的角度考慮,為機(jī)器設(shè)計(jì)出最佳的走棋策略。機(jī)器和人對(duì)弈,輪到機(jī)器走棋了,那么我們會(huì)遍歷機(jī)器的每一個(gè)可能走棋方法,然后對(duì)于前面機(jī)器的每一個(gè)走棋方法,遍歷人的每一個(gè)走棋方法,然后接著遍歷機(jī)器的每一個(gè)走棋方法,如此下去,直到得到確定的結(jié)果或者達(dá)到了搜索深度的限制。當(dāng)達(dá)到了搜索深度限制,此時(shí)無(wú)法判斷結(jié)局如何,一般都是根據(jù)當(dāng)前局面的形式,給出一個(gè)得分,計(jì)算得分的方法被稱為評(píng)價(jià)函數(shù),不同游戲的評(píng)價(jià)函數(shù)差別很大,需要很好的設(shè)計(jì)。本課題中,我設(shè)計(jì)的評(píng)價(jià)函數(shù)如下(函數(shù)名為:EvaluateSituation(char* situation)):在這個(gè)五子棋游戲中,定義棋盤(pán)的大小為15*15的方格舉矩陣,也就是225小格的正方形棋盤(pán)。用數(shù)組char situ1515來(lái)表示。五子棋的規(guī)則是,有五個(gè)同顏色的子相連成一條直線,在橫向,縱向,左斜路,右斜路上,即為獲勝。我們用“0”來(lái)表示我方的棋子,用“+”來(lái)表示敵方的棋子。則我們用兩種情況來(lái)分析得分,用一個(gè)Int型變量score來(lái)記錄分?jǐn)?shù)。首先我們來(lái)尋找,的情況,以下用主要的代碼以及我對(duì)代碼的解釋:在橫路上搜索,核心的代碼如下:For(i=0;i10;i+)/橫向只需搜索十個(gè)格子,有五個(gè)格子是被棋子占用,因?yàn)槲覀兯阉鞯氖沁B續(xù)5個(gè)棋子的情況,搜索十個(gè)格子就會(huì)達(dá)到目的;For(j=0;j15;j+)if(situij=-1)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)/連續(xù)的五個(gè)格子都占有棋子;score+=500000;/對(duì)黑子進(jìn)行匹配的情況(500000分)else if(situij=-1)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)score+=720; /對(duì)黑子進(jìn)行匹配的情況(720分) else if(situij=0)/對(duì)黑子進(jìn)行匹配的情況(720分)) score+=720; else if(situi+4j=0)/對(duì)黑子進(jìn)行匹配的情況(720分)) score+=720;else if(situi+2j=0)/對(duì)黑子進(jìn)行匹配的情況(720分)) score+=720;else if(situi+3j=0)/對(duì)黑子進(jìn)行匹配的情況(720分)) score+=720;/同樣的道理,對(duì)白子進(jìn)行匹配:else if(situij=1)&(situi+1j=1)&(situi+2j=1)&(situi+3j=1)&(situi+4j=1)score-=500000;/對(duì)白子進(jìn)行匹配的情況else if(situij=1)&(situi+1j=1)&(situi+2j=0)&(situi+3j=1)&(situi+4j=1)score+=720; /對(duì)白子進(jìn)行匹配的情況(720分) else if(situij=0)/對(duì)白子進(jìn)行匹配的情況(720分)) score+=720; else if(situi+4j=0)/對(duì)白子進(jìn)行匹配的情況(720分)) score+=720;else if(situi+2j=0)/對(duì)白子進(jìn)行匹配的情況(720分)) score+=720;else if(situi+3j=0)/對(duì)白子進(jìn)行匹配的情況(720分)) score+=720; 在縱路上搜索,核心的代碼及解釋如下: For(0=i15)For(0=j11) /與橫路上同理,i的值不變j的值依次+1尋找符合標(biāo)準(zhǔn)的情況 例如匹配黑子 的情況:If(situij=-1)&(situij+1=-1)&(situij+2=-1)&(situij+3=-1)&(situij+4=-1)同樣地可以匹配白子情況分?jǐn)?shù)為負(fù)分。在左斜路上搜索,主要的代碼及解釋如下: For(4=j15;j+) For(0=ij-3;i+)if(situij-i=-1)&(situi+1j-i-1=-1)&(situi+2j-i-2=-1)&(situi+3j-i-3=-1)&(situi+4j-i-4=-1) /對(duì)黑子進(jìn)行匹配的情況(500000分) score+=500000;同理對(duì)黑子的其他情況進(jìn)行匹配,對(duì)白子也進(jìn)行同樣匹配得分為負(fù)數(shù)。在右斜路上搜索,主要的代碼及解釋如下:For(1=i=ji+3;j-)If(situi+14-jj=-1)&(situi+14-j+1j-1=-1)&(situi+14-j+2j-2=-1)&(situi+14-j+3j-3=-1)&(situi+14-j+4j-4=-1)/對(duì)黑子進(jìn)行匹配的情況(500000分) score+=500000;同理對(duì)黑子的其他情況進(jìn)行匹配,對(duì)白子也進(jìn)行同樣匹配得分為負(fù)數(shù)。尋找完以上情況之后,我們還要對(duì)一些得分較少的情況進(jìn)行搜索,我們對(duì),等幾種情況進(jìn)行搜索。在橫路上搜索,主要的代碼及解釋如下:For(0=i10;i+) For(0=j15;j+)If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(4320分) score+=4320;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 對(duì)黑子進(jìn)行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 對(duì)黑子進(jìn)行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 對(duì)黑子進(jìn)行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 對(duì)黑子進(jìn)行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(20分) score+=4320;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=0)&(situi+5j=0) /對(duì)黑子進(jìn)行匹配的情況(20分) score+=20;同理白棋也用這樣的方式搜索,分?jǐn)?shù)為負(fù)數(shù)。在縱路上搜索,主要的代碼及解釋:For(0=i15;i+) For(0=j10;j+) if(situij=0)&(situij+1=-1)&(situij+2=-1)&(situij+3=-1)&(situij+4=-1)&(situij+5=0) /對(duì)黑子進(jìn)行匹配的情況(4320分) score+=4320; 同樣的道理對(duì)其他的黑子進(jìn)行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負(fù)分。在左斜路上搜索,主要的代碼及解釋如下:For(5=j15;j+) For(0=ij-4;i+)if(situij-i=0)&(situi+1j-i-1=-1)&(situi+2j-i-2=-1)&(situi+3j-i-3=-1)&(situi+4j-i-4=-1)&(situi+5j-i-5=0) / 對(duì)黑子進(jìn)行匹配的情況4320分 同樣的道理對(duì)其他的黑子進(jìn)行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負(fù)分。在右斜路上搜索,主要的代碼及解釋如下: for(5=j15;j+) for(0=ij-4;i+)if(situ14-ij-i=0)&(situ14-i-1j-i-1=-1)&(situ14-i-2j-i-2=-1)&(situ14-i-3j-i-3=-1)&(situ14-i-4j-i-4=-1)&(situ14-i-5j-i-5=0) /對(duì)黑子進(jìn)行匹配的情況4320分 同樣的道理對(duì)其他的黑子進(jìn)行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負(fù)分。評(píng)價(jià)函數(shù)就是對(duì)每一種可能出現(xiàn)的棋局給出不同等級(jí)的得分,最后我要根據(jù)對(duì)棋盤(pán)的全面搜索得出來(lái)的這個(gè)得分,選出得分最高的下棋位置,所以我們要返回這個(gè)重要的值Score,也是這個(gè)函數(shù)最重要的一行代碼:Renturn score;/返回得分;至此評(píng)價(jià)函數(shù)就設(shè)計(jì)完了。3.2 極大極小搜索及alpha-beta剪枝我們用MixMaxSearchCut()函數(shù)來(lái)進(jìn)行極大極小搜索和alpha-beta剪枝,程序的主要代碼及解釋如下:Int score=0;設(shè)score初始值為0; If(depth=0)已經(jīng)到達(dá)底層 直接返回靜態(tài)估值結(jié)果 生成下一階段可能的棋局: For(0=i15;i+) For(0=jtype)*-1; root-type用來(lái)記錄當(dāng)前位置是極大點(diǎn)還是極小點(diǎn)char searchAreaFlag1515;定義數(shù)組記錄某點(diǎn)是否在搜索范圍內(nèi)(0為不在范圍內(nèi),1為在范圍內(nèi))for (i-SearchArea=m= i+SearchArea;m+)for (j- SearchArea=n=j+ SearchArea;n+) If(0=n=14并且0=mtype)*-1);root-nextSituationList.push_back(tempNode); 進(jìn)行遞歸及alpha-beta剪枝:If( 當(dāng)前為極大點(diǎn)) for(list:iteratorit1=root-nextSituationList.begin();it1!=root-nextSituationList.end();+it1) /進(jìn)行遞歸,深度每次減一; score=MixMaxSearchCut(*it1,depth-1,alpha,beta);為了在搜索過(guò)程中進(jìn)行剪枝,優(yōu)化搜索效率,在遞歸過(guò)程中要向下傳遞兩個(gè)參數(shù)。第1個(gè)參數(shù)是alpha,它表示當(dāng)前搜索節(jié)點(diǎn)走棋的一方搜索到的最好值,任何比它小的值都沒(méi)有意義。第2個(gè)值是beta,表示對(duì)手目前的劣勢(shì),這是對(duì)手所能承受的最壞的結(jié)果,比它大的值都會(huì)被舍棄。剪枝的主要代碼如下:If(scorealpha)/搜索比alpha大的值,比它小的值都沒(méi)有意義 If(scorebeta)/搜索比beta大的值,比它大的值做舍棄處理 Root-score=score; Return score; Else Alpha=score; Root-score=alpha;/返回alpha的值;考慮完極大點(diǎn)的情況要考慮極小點(diǎn)的情況,做法與極大點(diǎn)的情況相反。3.3 本章總結(jié)人們都說(shuō)算法是程序的靈魂,通過(guò)對(duì)五子棋算法的研究,能更好地掌握博弈論知識(shí),理解深度搜索中的極大極小搜索的方法,剪枝方面比較有難度,不過(guò)用心研究發(fā)現(xiàn)算法還是很有趣。4 基于OpenGL五子棋系統(tǒng)設(shè)計(jì)基于OpenGL五子棋的系統(tǒng)設(shè)計(jì)暴扣操作設(shè)計(jì)和界面設(shè)計(jì),這一章將詳細(xì)地描述游戲的設(shè)計(jì)過(guò)程。4.1 操作設(shè)計(jì)通過(guò)資料查詢以及前三章的分析,可以清晰地搭建出我們此次設(shè)計(jì)的結(jié)構(gòu)框架來(lái)。這是一個(gè)基于OpenGL的五子棋游戲,采用Visual studio 2008提供的面向?qū)ο蟮腤indows編程接口MFC來(lái)制作一個(gè)主界面,主界面分別可連接到人機(jī)對(duì)戰(zhàn)和人人對(duì)戰(zhàn)的窗口。如圖1描述的是系統(tǒng)框架;圖1 系統(tǒng)結(jié)構(gòu)框架圖4.1.1 人機(jī)對(duì)戰(zhàn)所謂的人機(jī)對(duì)戰(zhàn)顧名思義,就是我們和電腦系統(tǒng)下棋。這里就涉及到了五子棋的人工智能算法。在此系統(tǒng)中我們采用的是最大最小搜索與alpha-beta剪枝的算法來(lái)實(shí)現(xiàn),前面我們已經(jīng)將算法介紹了。我們采用一個(gè)15*15的棋盤(pán)下棋;在棋盤(pán)上面對(duì)應(yīng)位置通過(guò)點(diǎn)擊鼠標(biāo)下子,棋盤(pán)上將在相應(yīng)的位置上顯示棋子,棋子顯示在棋盤(pán)的格子中。由電腦掌握的黑子先下棋,在棋盤(pán)的正中央格子中下黑子;由玩家控制鼠標(biāo)下白子,白子每下一步,電腦都會(huì)計(jì)算出黑子的最佳走棋位置并下黑子,這個(gè)計(jì)算采用的就是第三章所介紹的算法,會(huì)下五子棋的人都知道,當(dāng)你走一步棋的時(shí)候未必是最佳的走法,因?yàn)槠寰值拿恳徊蕉家獮橄乱徊娇紤],這樣才能獲得最后的勝利,極大極小搜索算法就是搜索出一條深度為depth(搜索接下來(lái)幾步)的最佳路徑,當(dāng)然這個(gè)路徑會(huì)有很多情況,因?yàn)槲覀儾恢缹?duì)手會(huì)走什么樣的位置,所以假設(shè)對(duì)手每一步都走最好的路徑,搜索出最利于我方的一條路徑,此系統(tǒng)設(shè)置depth的值為2,通過(guò)改變depth的值可以改變?nèi)藱C(jī)對(duì)戰(zhàn)單機(jī)版的游戲難易程度。如上所述游戲,直到一方先達(dá)到5子相連(在橫路,縱路,左斜路,右斜路上)的情況結(jié)束游戲,判斷相連的五個(gè)棋子的顏色,如果為黑色則為電腦獲勝,為白色則為玩家獲勝,系統(tǒng)會(huì)給出提示信息提示哪方獲勝并提示重新開(kāi)始游戲方法,棋盤(pán)中會(huì)有直線標(biāo)出五子連珠的五個(gè)棋子,此時(shí)無(wú)法再在棋盤(pán)上下子;如果棋盤(pán)下滿還未分出勝負(fù)即為平局,游戲結(jié)束和平局都會(huì)有消息對(duì)話框彈出提示;點(diǎn)擊r鍵重新開(kāi)始游戲,點(diǎn)擊q鍵退出游戲。4.1.2 人人對(duì)戰(zhàn)雙人對(duì)戰(zhàn)的實(shí)現(xiàn)比人機(jī)對(duì)戰(zhàn)實(shí)現(xiàn)得容易得多,兩人交替操作鼠標(biāo)來(lái)執(zhí)黑白兩子進(jìn)行游戲,直到一方獲勝游戲結(jié)束,或者棋盤(pán)下滿還未分出勝負(fù)則為平局。雙人對(duì)戰(zhàn)的核心代碼是判斷哪一方獲勝,要分別對(duì)黑白兩方進(jìn)行判定,以下是我的判斷方法,與人機(jī)對(duì)戰(zhàn)的判斷方法類似: bool isWin(int x,int y) int dir2=0,1,1,0,1,1,1,-1; for(int i=0;i=5) return 1; return 0;另外,我在人人對(duì)戰(zhàn)中設(shè)計(jì)了悔棋的功能,點(diǎn)擊鼠標(biāo)右鍵,選擇“go back”可以實(shí)現(xiàn)悔棋功能,返回下棋的上一步。4.1.3 鼠標(biāo)與鍵盤(pán)的操作一個(gè)好的游戲要有一個(gè)很好地交互性,而交互性的體現(xiàn)就在游戲的可操作性上面,本次系統(tǒng)的操作性體現(xiàn)在:鼠標(biāo)操作,鍵盤(pán)操作,實(shí)現(xiàn)重新開(kāi)始游戲,退出游戲,悔棋等功能的實(shí)現(xiàn)。我們用myGlutMouseFunc()函數(shù)來(lái)處理用戶從鼠標(biāo)輸入的一些信號(hào);首先我們要判斷鼠標(biāo)點(diǎn)擊的方法:鼠標(biāo)左鍵點(diǎn)擊且放開(kāi);If(button=GLUT_LEFT_BUTTON)&(state=GLUT_UP)判斷當(dāng)前棋盤(pán)是否顯示正確;if (WindowWidthWindowHeight)顯示不正確直接返回;判斷落子的位置,根據(jù)橫縱坐標(biāo)來(lái)判斷,如果點(diǎn)擊的是橫縱棋盤(pán)線的交界點(diǎn),我們判斷交界點(diǎn)右上角為落子的位置;Int xPos=(int)(x-(WindowWidth-WindowHeight)/2.0f)/(WindowHeight/15.0f);Int yPos=(int)(y/(WindowHeight/15.0f);判斷落子的位置是否有效,如果超出棋盤(pán)或者落子的位置已經(jīng)有棋子都為無(wú)效位置;if(xPos0)|(yPos14)|(yPos14)|(curSituationxPosyPos
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防給水工程智能化施工及維護(hù)服務(wù)合同3篇
- 2025變頻器代理商銷售合同:產(chǎn)品價(jià)格調(diào)整與結(jié)算協(xié)議3篇
- 2025年度紡織行業(yè)新材料研發(fā)與應(yīng)用采購(gòu)合同2篇
- 2025年度工業(yè)倉(cāng)儲(chǔ)租賃及倉(cāng)儲(chǔ)設(shè)施維護(hù)保養(yǎng)合同范本3篇
- 二零二五年房地產(chǎn)項(xiàng)目工程造價(jià)咨詢合同模板3篇
- 二零二四年員工自愿放棄社保及轉(zhuǎn)移待遇合同3篇
- 2025年度藝術(shù)展布展藝術(shù)品保護(hù)與搬運(yùn)合同3篇
- 二零二五版二手房交易中介服務(wù)合同模板2篇
- 2024虛擬現(xiàn)實(shí)內(nèi)容開(kāi)發(fā)制作合同
- 2025年消防噴淋系統(tǒng)安裝及消防設(shè)施檢測(cè)與維保服務(wù)合同3篇
- 《FANUC-Oi數(shù)控銑床加工中心編程技巧與實(shí)例》教學(xué)課件(全)
- 微信小程序運(yùn)營(yíng)方案課件
- 抖音品牌視覺(jué)識(shí)別手冊(cè)
- 陳皮水溶性總生物堿的升血壓作用量-效關(guān)系及藥動(dòng)學(xué)研究
- 安全施工專項(xiàng)方案報(bào)審表
- 學(xué)習(xí)解讀2022年新制定的《市場(chǎng)主體登記管理?xiàng)l例實(shí)施細(xì)則》PPT匯報(bào)演示
- 好氧廢水系統(tǒng)調(diào)試、驗(yàn)收、運(yùn)行、維護(hù)手冊(cè)
- 中石化ERP系統(tǒng)操作手冊(cè)
- 五年級(jí)上冊(cè)口算+脫式計(jì)算+豎式計(jì)算+方程
- 氣體管道安全管理規(guī)程
- 《眼科學(xué)》題庫(kù)
評(píng)論
0/150
提交評(píng)論