基于OpenGL小游戲開發(fā)及實踐.docx_第1頁
基于OpenGL小游戲開發(fā)及實踐.docx_第2頁
基于OpenGL小游戲開發(fā)及實踐.docx_第3頁
基于OpenGL小游戲開發(fā)及實踐.docx_第4頁
基于OpenGL小游戲開發(fā)及實踐.docx_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

精品文檔 2015 屆畢業(yè)設(shè)計論文 基于OpenGL的小型游戲開發(fā)及實踐 院 、 部: 計算機與信息科學(xué)學(xué)院 學(xué)生姓名: 杜磊 指導(dǎo)教師: 方小勇 職稱 副教授 專 業(yè): 計算機科學(xué)與技術(shù) 班 級: 1103 完成時間: 2015-6 摘 要信息時代的到來使得電腦越來越普及,人們對電腦游戲的需求也越來越高。游戲的界面美觀性,可操作性無疑是人們考慮的關(guān)鍵因素。OpenGL是一種主流的圖形處理工具,基于OpenGL開發(fā)的小游戲有更好的觀賞性,本次論文論述的是基于OpenGL開發(fā)的五子棋小游戲。五子棋,起源于中國古代傳統(tǒng)的黑白棋游戲,簡單易懂又不缺乏趣味性。其中的對弈較量,不僅增強人的思維能力,開發(fā)人的智力,而且簡單的游戲規(guī)則中蘊含著深奧的棋技,是修身養(yǎng)性,陶冶情操的一款經(jīng)典游戲。本次論文是基于OpenGL和C+語言在Visual Studio 2008環(huán)境下編程,設(shè)計了一款人機對戰(zhàn)、人人對戰(zhàn)功能的五子棋游戲。采用極大極小搜索算法及alpha-beta剪枝算法,采取優(yōu)先級策略來判別棋局,實現(xiàn)了單機游戲的人工智能。運用了OpenGL的alpha混合及深度測試等一系列的特性,將計算機圖形學(xué)與算法相結(jié)合,旨在設(shè)計出一款界面客觀性強,游戲可操作性強的一款小游戲軟件。通過學(xué)習(xí),基本掌握OpenGL函數(shù)庫的使用,能夠制作簡單的平臺界面,實現(xiàn)人機交互功能,探討和研究了博弈論的相關(guān)知識,學(xué)會將算法與日常事務(wù)的結(jié)合,運用算法去解決問題。由于時間原因,界面的美觀性有待改進,游戲的多樣性以及難易程度的合理性并不是做的很好,希望在今后的學(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國內(nèi)外研究現(xiàn)狀21.4 本章總結(jié)32 基于OpenGL五子棋開發(fā)使用工具42.1 C+42.2 OpenGL42.2.1 什么是OpenGL42.2.2 OpenGL的特點52.3 Visual Studio 200852.4 本章總結(jié)63 基于OpenGL五子棋算法的實現(xiàn)73.1 極大極小搜索中的評價函數(shù)73.2 極大極小搜索及alpha-beta剪枝123.3 本章總結(jié)134 基于OpenGL五子棋系統(tǒng)設(shè)計144.1 操作設(shè)計144.1.1 人機對戰(zhàn)144.1.2 人人對戰(zhàn)154.1.3 鼠標(biāo)與鍵盤的操作164.3 界面設(shè)計184.3.1 OpenGL的圖形生成184.3.2 基本圖形的繪制方法194.3.3 主界面窗口設(shè)計204.3.4 棋盤界面設(shè)計224.1 本章總結(jié)235 系統(tǒng)實現(xiàn)246 總結(jié)29參考文獻30致 謝32附 錄331 緒論本章節(jié)研究課題的背景及意義,明確做次課題的目的,通過查閱資料更好地熟悉課題。1.1 課題研究的背景及意義人類之所以不斷在進步,是因為我們?nèi)祟愐恢辈粩嗟脑谒伎?,在學(xué)習(xí)完計算機圖形學(xué)這門課程之后,我對圖形學(xué)的研究很感興趣,我在思考能不能用所學(xué)的知識來做一些實踐,恰巧我平時喜歡棋類游戲,我就想基于OpenGL來開發(fā)一款游戲,而五子棋游戲程序的開發(fā)符合人類進步也是促進人類進步的一大動力之一。五子棋游戲程序讓人們方便快捷的可以下五子棋,讓人們在何時都能通過下棋來提高邏輯思維能力,同時也培養(yǎng)兒童的興趣以及愛好,讓孩子更加聰明。同時,五子棋游戲程序的開發(fā)也使得五子棋這個游戲得到了廣泛的推廣,讓世界各地的人們知道五子棋,玩上五子棋,這已經(jīng)不是局限。五子棋游戲程序使得越來越多的人喜歡上了五子棋,熱愛下五子棋,它是具有很好的帶動性的。于是我收集了國內(nèi)外有關(guān)計算機圖形學(xué)的資料,我發(fā)現(xiàn)國內(nèi)外最近幾年計算機圖形學(xué)發(fā)展迅速,使得三維表現(xiàn)技術(shù)得以形成,這些三維表現(xiàn)技術(shù)使單調(diào)的二維界面逐步轉(zhuǎn)變?yōu)樨S富立體的三圍界面,我們能夠再現(xiàn)三維世界中的物體,能夠用三維形體來表示復(fù)雜的信息,這種技術(shù)就是可視化(Visualization)技術(shù)??梢暬夹g(shù)把數(shù)據(jù)轉(zhuǎn)化為圖形,使人能夠在三維圖形世界中直接對具有形體的信息進行操作,和計算機直接交流。這都歸功于計算機圖形學(xué)、計算機可視化技術(shù)的發(fā)展。人們對計算機可視化技術(shù)的研究已經(jīng)歷了一個很長的歷程,而且形成了許多可視化工具,其中SGI公司推出的GL三維圖形庫表現(xiàn)突出,易于使用而且功能強大。進而發(fā)展為OpenGL。OpenGL作為一個圖形硬件接口,很好地為程序員提供一個功能強大,低層次的渲染庫,能夠運用于任何軟件平臺,也得到了廣泛的硬件支持。OpenGL也為游戲開發(fā)提供強大的圖形界面平臺,使得游戲畫面感豐富,提高可觀賞性。可見基于OpenGL的游戲開發(fā)將會成為主流市場,會給游戲行業(yè)帶來新一番的收獲和體驗。所以我想基于OpenGL來制作一款五子棋小游戲,對此課題的研究也將讓我更近一步熟悉OpenGL,通過動手實踐更好地學(xué)習(xí)新知識,鞏固舊知識2歡迎下載。1.2 五子棋的發(fā)展與現(xiàn)狀充分的準(zhǔn)備是成功的第一步,在確定了這一論文課題后,我收集了大量的有關(guān)于五子棋的資料,五子棋這一棋類運動已迅速在國際上發(fā)展起來。外國人都十分看好這一不起眼的智力游戲,并認為五子棋不僅能提高思維、開發(fā)智力、手腦并用、修身養(yǎng)性而且富含哲理,具有東方的神秘和西方的直觀,是中西文化的交匯點。許多國家的人對五子棋都有不同的愛稱,例如韓國人把五子棋稱之為“情侶棋”,因為五子棋可以兩個人下,別有一番趣味,所以此次設(shè)計中,我將設(shè)計人人對戰(zhàn)功能,供雙人玩這個游戲,言下之意,我希望設(shè)計一款情人之間可以下的五子棋,這樣有利于增加情感的交流;歐洲人稱之為“中老年棋”,表示五子棋適合中老年人的生理特點和思維方式,所以我這一次設(shè)計中希望設(shè)計人機對戰(zhàn)的功能,這樣老年人就可以跟電腦下棋,為老年人提供一個休閑娛樂的工具,由此可見,盡管國度不同,語言各異,但人們都可以借助五子棋這一簡單而又深奧的棋藝進行交流、比賽,增進友誼,這也是我從五子棋的現(xiàn)狀中得到啟發(fā)想要設(shè)計的一款軟件。五子棋的流行令人瞠目結(jié)舌,目前有幾十個國家都在下五子棋,也引申出各種級別和規(guī)模的比賽。自1989年起,每兩年都有五子棋世界錦標(biāo)賽舉行,從第一屆在日本東京都到俄羅斯聯(lián)邦的莫斯科、瑞典以及愛沙尼亞的塔林,一屆比賽比一屆精彩,日本人在這個比賽中一直都占據(jù)了領(lǐng)先的位置,除第三屆的冠軍是愛沙尼亞人之外,其余三屆的冠軍都是日本人。日本目前對連珠(五子棋)技術(shù)的研究也相當(dāng)普遍和全面,并且日本五子棋職業(yè)棋手是令人敬畏的,他們的水平是世界級的,并且在日益增長。同時五子棋的理論研究與探索也呈現(xiàn)蓬勃發(fā)展的勢頭,從1858年第一部五子棋專著問世以來,目前,全世界有2000多種五子棋的書籍及期刊,且用各種語言發(fā)行。五子棋在我國的各省市地區(qū)都有很大的發(fā)展,收到人們的喜愛。最具有代表性的就屬北京,舉辦了各種規(guī)模的賽事,其他省市也舉辦了大大小小的賽事。所以我覺得做一個五子棋系統(tǒng)肯定有很多人喜愛。1.3 OpenGL國內(nèi)外研究現(xiàn)狀OpenGL作為一個性能優(yōu)越的圖形應(yīng)用程序設(shè)計界面(API)適合于廣泛的計算機環(huán)境,從個人計算機、工作站到超級計算機,OpenGL都能實現(xiàn)高性能的圖形功能。由于許多在計算機界具有領(lǐng)導(dǎo)地位的計算機公司紛紛采用OpenGL作為圖形應(yīng)用程序設(shè)計界面,OpenGL應(yīng)用程序具有廣泛的移植性。OpenGL已成為目前的圖形開發(fā)標(biāo)準(zhǔn)。OpenGL(OpenGL Graphics Library,開發(fā)性圖形庫)是目前用于開發(fā)2D圖形應(yīng)用程序的首選環(huán)境,具有可移植性、可交換性等優(yōu)點,是行業(yè)領(lǐng)域中最為廣泛接納的2D圖形API,也是目前應(yīng)用最為廣泛的計算機圖形標(biāo)準(zhǔn),其自誕生至今已催生了各種計算機平臺及設(shè)備上的數(shù)千優(yōu)秀應(yīng)用程序。通過對OpenGL的特點、功能、工作流程和繪圖流程的學(xué)習(xí),我們將會對OpenGL有一個初步的了解,建立起基本的概念。在國外OpenGL是具有一定的生命力的,唯一能夠取代微軟對圖形技術(shù)的完全控制的API。但是由于Silicon Graphics公司已經(jīng)不再以任何讓微軟不悅的方式推廣OpenGL,所以采用OpenGL開發(fā)游戲還是具有一定風(fēng)險。鑒于OpenGL的特點,還是有許多非常重要的開發(fā)人員仍然在使用OpenGL進行游戲的開發(fā)與創(chuàng)作。因此,硬件開發(fā)商目前正在想法設(shè)法地加強硬件對OpenGL的技術(shù)支持。1.4 本章總結(jié)通過查閱資料和閱讀文獻,我了解到OpenGL小游戲制作的研究現(xiàn)狀,了解一些商業(yè)上對OpenGL的運用,通過對五子棋的調(diào)研發(fā)現(xiàn),喜歡這一游戲的人居多,所以我明確了本次課題的對象:基于OpenGL設(shè)計出一款五子棋游戲。2 基于OpenGL五子棋開發(fā)使用工具2.1 C+C+是在C語言的基礎(chǔ)上開發(fā)的一種通用編程語言,應(yīng)用廣泛。C+支持多種編程范式 面向?qū)ο缶幊?、泛型編程和過程化編程。C+語言靈活,運算符的數(shù)據(jù)結(jié)構(gòu)豐富、具有結(jié)構(gòu)化控制語句、程序執(zhí)行效率高,而且同時具有高級語言與匯編語言的優(yōu)點,與其它語言相比 ,可以直接訪問物理地址,與匯編語言相比又具有良好的可讀性和可移植性。C+引入了面向?qū)ο蟮母拍?,使得開發(fā)人機交互類型的應(yīng)用程序更為簡單、快捷。2.2 OpenGL2.2.1 什么是OpenGLOpenGL是一種圖形與硬件的接口。它包括了上百個圖形函數(shù),開發(fā)者可以用這些函數(shù)來建立三維模型和進行三維實時交互。與其他圖形程序設(shè)計接口不同,OpenGL提供了十分清晰明了的圖形函數(shù),因此初學(xué)的程序設(shè)計員也能利用OpenGL的圖形處理能力和1670萬種色彩的調(diào)色板很快地設(shè)計出三維圖形以及三維交互軟件。OpenGL強有力的圖形函數(shù)不要求開發(fā)者把三維物體模型的數(shù)據(jù)寫成固定的數(shù)據(jù)格式,這樣開發(fā)者不但可以直接使用自己的數(shù)據(jù),而且可以利用其他不同格式的數(shù)據(jù)源。這種靈活性極大地節(jié)省了開發(fā)者的時間,提高了軟件開發(fā)效益。長期以來,從事三維圖形開發(fā)的技術(shù)人員都不得不在自己的程序中編寫矩陣變換、外部設(shè)備訪問等函數(shù),這樣為調(diào)制這些與自己的軟件開發(fā)目標(biāo)關(guān)系并不十分密切的函數(shù)費腦筋,而OpenGL正是提供一種直觀的編程環(huán)境,它提供的一系列函數(shù)大大地簡化了三維圖形程序。(1)OpenGL提供一系列的三維圖形單元供開發(fā)者調(diào)用。(2)OpenGL提供一系列的圖形變換函數(shù)。 (3)OpenGL提供一系列的外部設(shè)備訪問函數(shù),使開發(fā)者可以方便地訪問鼠標(biāo)、鍵盤、空間球、數(shù)據(jù)手套等這種直觀的三維圖形開發(fā)環(huán)境體現(xiàn)了OpenGL的技術(shù)優(yōu)勢,這也是許多三維圖形開發(fā)者熱衷于OpenGL的緣由所在。2.2.2 OpenGL的特點OpenGL具有標(biāo)準(zhǔn)化:它是唯一真正開放的,獨立于供應(yīng)商的、跨平臺的圖形標(biāo)準(zhǔn)。穩(wěn)定性:OpenGL用時間證明它在各個平臺上運用良好,它具有明確而控制良好的規(guī)范,并具有向后兼容性,使現(xiàn)有的應(yīng)用程序不會失效。擴展性:許多開發(fā)商利用這一特性通過對API進行擴展來對OpenGL的功能進行升級??煽s放性:基于OpenGL的應(yīng)用程序可以在各種系統(tǒng)上運行,其范圍從家用電腦到PC機,從工作站到超級計算機,可以說,OpenGL應(yīng)用程序可以適應(yīng)開發(fā)人員選擇的各種目標(biāo)平臺。易用性:OpenGL具有良好的結(jié)構(gòu),直觀的設(shè)計和邏輯命令。與其他的圖形程序包相比,OpenGL應(yīng)用程序的代碼行數(shù)少。此外,OpenGL封裝了有關(guān)基本硬件信息,使開發(fā)人員無須針對具體的硬件進行專門的設(shè)計??煽啃院涂梢浦残?在OpenGL兼容的任何硬件上,不管使用什么操作系統(tǒng),同一個應(yīng)用程序的顯示結(jié)果均相同。與其它圖形程序包相比,OpenGL應(yīng)用程序的代碼行數(shù)少。此外,OpenGL封裝了有關(guān)基本硬件的信息,使開發(fā)人員無需針對具體的硬件進行專門的設(shè)計。在CAD/CAM/CAE、醫(yī)學(xué)圖像處理、虛擬現(xiàn)實、娛樂、廣告等不同領(lǐng)域中,開發(fā)人員可以利用OpenGL的這些能力自由發(fā)揮自己的創(chuàng)造性。2.3 Visual Studio 2008Visual studio 2008是微軟自行研發(fā)的一款開發(fā)系統(tǒng),支持Windows平臺下各類應(yīng)用軟件和應(yīng)用服務(wù)的開發(fā)。作為C+與OpenGL的開發(fā)平臺,能很好地進行代碼編寫和調(diào)試。具有良好的運用性和友好性。Visual studio 2008為程序員提供了一個面向?qū)ο蟮腤indows編程接口MFC(Microsoft Foundation Class),它大大地簡化了Windows編程工作。此次小游戲開發(fā)中我也使用了編程接口MFC。MFC提供了一個標(biāo)準(zhǔn)化的結(jié)構(gòu),這樣開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是“站在巨人肩膀上”,從一個比較高的起點編程,故節(jié)省了大量的時間;其次,它提供了大量的代碼,指導(dǎo)用戶編程時實現(xiàn)某些技術(shù)和功能。對用戶來說,用MFC開發(fā)的最終應(yīng)用程序具有標(biāo)準(zhǔn)的、熟悉的Windows界面,這樣的應(yīng)用程序易學(xué)易用。2.4 本章總結(jié)作為一名計算機專業(yè)的學(xué)生,利用網(wǎng)絡(luò)資源學(xué)習(xí)是一項基本的技能,我通過網(wǎng)絡(luò)進一步學(xué)習(xí)了本次設(shè)計所用到的開發(fā)工具,很大的提高了我編程水平。3 基于OpenGL五子棋算法的實現(xiàn)此章節(jié)中將介紹基于OpenGL五子棋所涉及到的一些算法,采用解析代碼的方法,闡述博弈論中的深度搜索策略。3.1 極大極小搜索中的評價函數(shù)極大極小搜索策略一般都是使用在一些博弈類的游戲之中,例如本次課題的五子棋游戲。要討論極大極小搜索算法,首先要明白什么是搜索。最基本的搜索方法是暴力搜索:所謂暴力搜索就是采用循環(huán)語句將所有可能的情況搜索一遍,這個搜索方法在本例中不適用,因為如果采用暴力搜索,把最終的結(jié)果得到的話,搜索樹的深度太大了,機器不能滿足。所以我們考慮另一個搜索策略,即深度搜索。規(guī)定一個搜索的深度,在這個深度范圍內(nèi)進行深度優(yōu)先搜索。極大極小搜索算法的本質(zhì)就是深度搜索,在搜索過程中,對本方有利的搜索點上應(yīng)該取極大值,而對本方不利的搜索點上應(yīng)該取極小值。這里的極大極小值是相對而言的。在設(shè)計人與機器對弈的情況下,我應(yīng)該站在機器的角度考慮,為機器設(shè)計出最佳的走棋策略。機器和人對弈,輪到機器走棋了,那么我們會遍歷機器的每一個可能走棋方法,然后對于前面機器的每一個走棋方法,遍歷人的每一個走棋方法,然后接著遍歷機器的每一個走棋方法,如此下去,直到得到確定的結(jié)果或者達到了搜索深度的限制。當(dāng)達到了搜索深度限制,此時無法判斷結(jié)局如何,一般都是根據(jù)當(dāng)前局面的形式,給出一個得分,計算得分的方法被稱為評價函數(shù),不同游戲的評價函數(shù)差別很大,需要很好的設(shè)計。本課題中,我設(shè)計的評價函數(shù)如下(函數(shù)名為:EvaluateSituation(char* situation)):在這個五子棋游戲中,定義棋盤的大小為15*15的方格舉矩陣,也就是225小格的正方形棋盤。用數(shù)組char situ1515來表示。五子棋的規(guī)則是,有五個同顏色的子相連成一條直線,在橫向,縱向,左斜路,右斜路上,即為獲勝。我們用“0”來表示我方的棋子,用“+”來表示敵方的棋子。則我們用兩種情況來分析得分,用一個Int型變量score來記錄分?jǐn)?shù)。首先我們來尋找,的情況,以下用主要的代碼以及我對代碼的解釋:在橫路上搜索,核心的代碼如下:For(i=0;i10;i+)/橫向只需搜索十個格子,有五個格子是被棋子占用,因為我們搜索的是連續(xù)5個棋子的情況,搜索十個格子就會達到目的;For(j=0;j15;j+)if(situij=-1)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)/連續(xù)的五個格子都占有棋子;score+=500000;/對黑子進行匹配的情況(500000分)else if(situij=-1)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)score+=720; /對黑子進行匹配的情況(720分) else if(situij=0)/對黑子進行匹配的情況(720分)) score+=720; else if(situi+4j=0)/對黑子進行匹配的情況(720分)) score+=720;else if(situi+2j=0)/對黑子進行匹配的情況(720分)) score+=720;else if(situi+3j=0)/對黑子進行匹配的情況(720分)) score+=720;/同樣的道理,對白子進行匹配:else if(situij=1)&(situi+1j=1)&(situi+2j=1)&(situi+3j=1)&(situi+4j=1)score-=500000;/對白子進行匹配的情況else if(situij=1)&(situi+1j=1)&(situi+2j=0)&(situi+3j=1)&(situi+4j=1)score+=720; /對白子進行匹配的情況(720分) else if(situij=0)/對白子進行匹配的情況(720分)) score+=720; else if(situi+4j=0)/對白子進行匹配的情況(720分)) score+=720;else if(situi+2j=0)/對白子進行匹配的情況(720分)) score+=720;else if(situi+3j=0)/對白子進行匹配的情況(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ù)為負分。在左斜路上搜索,主要的代碼及解釋如下: 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) /對黑子進行匹配的情況(500000分) score+=500000;同理對黑子的其他情況進行匹配,對白子也進行同樣匹配得分為負數(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)/對黑子進行匹配的情況(500000分) score+=500000;同理對黑子的其他情況進行匹配,對白子也進行同樣匹配得分為負數(shù)。尋找完以上情況之后,我們還要對一些得分較少的情況進行搜索,我們對,等幾種情況進行搜索。在橫路上搜索,主要的代碼及解釋如下: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) /對黑子進行匹配的情況(4320分) score+=4320;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 對黑子進行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 對黑子進行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /對黑子進行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 對黑子進行匹配的情況(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 對黑子進行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /對黑子進行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /對黑子進行匹配的情況(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /對黑子進行匹配的情況(20分) score+=4320;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=0)&(situi+5j=0) /對黑子進行匹配的情況(20分) score+=20;同理白棋也用這樣的方式搜索,分?jǐn)?shù)為負數(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) /對黑子進行匹配的情況(4320分) score+=4320; 同樣的道理對其他的黑子進行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負分。在左斜路上搜索,主要的代碼及解釋如下: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) / 對黑子進行匹配的情況4320分 同樣的道理對其他的黑子進行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負分。在右斜路上搜索,主要的代碼及解釋如下: 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) /對黑子進行匹配的情況4320分 同樣的道理對其他的黑子進行匹配,匹配的得分與橫路上的得分相同,不同的是橫坐標(biāo)不變,縱坐標(biāo)改變情況下的結(jié)果,白子類似分?jǐn)?shù)為黑子的負分。評價函數(shù)就是對每一種可能出現(xiàn)的棋局給出不同等級的得分,最后我要根據(jù)對棋盤的全面搜索得出來的這個得分,選出得分最高的下棋位置,所以我們要返回這個重要的值Score,也是這個函數(shù)最重要的一行代碼:Renturn score;/返回得分;至此評價函數(shù)就設(shè)計完了。3.2 極大極小搜索及alpha-beta剪枝我們用MixMaxSearchCut()函數(shù)來進行極大極小搜索和alpha-beta剪枝,程序的主要代碼及解釋如下:Int score=0;設(shè)score初始值為0; If(depth=0)已經(jīng)到達底層 直接返回靜態(tài)估值結(jié)果 生成下一階段可能的棋局: For(0=i15;i+) For(0=jtype)*-1; root-type用來記錄當(dāng)前位置是極大點還是極小點char searchAreaFlag1515;定義數(shù)組記錄某點是否在搜索范圍內(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); 進行遞歸及alpha-beta剪枝:If( 當(dāng)前為極大點) for(list:iteratorit1=root-nextSituationList.begin();it1!=root-nextSituationList.end();+it1) /進行遞歸,深度每次減一; score=MixMaxSearchCut(*it1,depth-1,alpha,beta);為了在搜索過程中進行剪枝,優(yōu)化搜索效率,在遞歸過程中要向下傳遞兩個參數(shù)。第1個參數(shù)是alpha,它表示當(dāng)前搜索節(jié)點走棋的一方搜索到的最好值,任何比它小的值都沒有意義。第2個值是beta,表示對手目前的劣勢,這是對手所能承受的最壞的結(jié)果,比它大的值都會被舍棄。剪枝的主要代碼如下:If(scorealpha)/搜索比alpha大的值,比它小的值都沒有意義 If(scorebeta)/搜索比beta大的值,比它大的值做舍棄處理 Root-score=score; Return score; Else Alpha=score; Root-score=alpha;/返回alpha的值;考慮完極大點的情況要考慮極小點的情況,做法與極大點的情況相反。3.3 本章總結(jié)人們都說算法是程序的靈魂,通過對五子棋算法的研究,能更好地掌握博弈論知識,理解深度搜索中的極大極小搜索的方法,剪枝方面比較有難度,不過用心研究發(fā)現(xiàn)算法還是很有趣。4 基于OpenGL五子棋系統(tǒng)設(shè)計基于OpenGL五子棋的系統(tǒng)設(shè)計暴扣操作設(shè)計和界面設(shè)計,這一章將詳細地描述游戲的設(shè)計過程。4.1 操作設(shè)計通過資料查詢以及前三章的分析,可以清晰地搭建出我們此次設(shè)計的結(jié)構(gòu)框架來。這是一個基于OpenGL的五子棋游戲,采用Visual studio 2008提供的面向?qū)ο蟮腤indows編程接口MFC來制作一個主界面,主界面分別可連接到人機對戰(zhàn)和人人對戰(zhàn)的窗口。如圖1描述的是系統(tǒng)框架;圖1 系統(tǒng)結(jié)構(gòu)框架圖4.1.1 人機對戰(zhàn)所謂的人機對戰(zhàn)顧名思義,就是我們和電腦系統(tǒng)下棋。這里就涉及到了五子棋的人工智能算法。在此系統(tǒng)中我們采用的是最大最小搜索與alpha-beta剪枝的算法來實現(xiàn),前面我們已經(jīng)將算法介紹了。我們采用一個15*15的棋盤下棋;在棋盤上面對應(yīng)位置通過點擊鼠標(biāo)下子,棋盤上將在相應(yīng)的位置上顯示棋子,棋子顯示在棋盤的格子中。由電腦掌握的黑子先下棋,在棋盤的正中央格子中下黑子;由玩家控制鼠標(biāo)下白子,白子每下一步,電腦都會計算出黑子的最佳走棋位置并下黑子,這個計算采用的就是第三章所介紹的算法,會下五子棋的人都知道,當(dāng)你走一步棋的時候未必是最佳的走法,因為棋局的每一步都要為下一步考慮,這樣才能獲得最后的勝利,極大極小搜索算法就是搜索出一條深度為depth(搜索接下來幾步)的最佳路徑,當(dāng)然這個路徑會有很多情況,因為我們不知道對手會走什么樣的位置,所以假設(shè)對手每一步都走最好的路徑,搜索出最利于我方的一條路徑,此系統(tǒng)設(shè)置depth的值為2,通過改變depth的值可以改變?nèi)藱C對戰(zhàn)單機版的游戲難易程度。如上所述游戲,直到一方先達到5子相連(在橫路,縱路,左斜路,右斜路上)的情況結(jié)束游戲,判斷相連的五個棋子的顏色,如果為黑色則為電腦獲勝,為白色則為玩家獲勝,系統(tǒng)會給出提示信息提示哪方獲勝并提示重新開始游戲方法,棋盤中會有直線標(biāo)出五子連珠的五個棋子,此時無法再在棋盤上下子;如果棋盤下滿還未分出勝負即為平局,游戲結(jié)束和平局都會有消息對話框彈出提示;點擊r鍵重新開始游戲,點擊q鍵退出游戲。4.1.2 人人對戰(zhàn)雙人對戰(zhàn)的實現(xiàn)比人機對戰(zhàn)實現(xiàn)得容易得多,兩人交替操作鼠標(biāo)來執(zhí)黑白兩子進行游戲,直到一方獲勝游戲結(jié)束,或者棋盤下滿還未分出勝負則為平局。雙人對戰(zhàn)的核心代碼是判斷哪一方獲勝,要分別對黑白兩方進行判定,以下是我的判斷方法,與人機對戰(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;另外,我在人人對戰(zhàn)中設(shè)計了悔棋的功能,點擊鼠標(biāo)右鍵,選擇“go back”可以實現(xiàn)悔棋功能,返回下棋的上一步。4.1.3 鼠標(biāo)與鍵盤的操作一個好的游戲要有一個很好地交互性,而交互性的體現(xiàn)就在游戲的可操作性上面,本次系統(tǒng)的操作性體現(xiàn)在:鼠標(biāo)操作,鍵盤操作,實現(xiàn)重新開始游戲,退出游戲,悔棋等功能的實現(xiàn)。我們用myGlutMouseFunc()函數(shù)來處理用戶從鼠標(biāo)輸入的一些信號;首先我們要判斷鼠標(biāo)點擊的方法:鼠標(biāo)左鍵點擊且放開;If(button=GLUT_LEFT_BUTTON)&(state=GLUT_UP)判斷當(dāng)前棋盤是否顯示正確;if (WindowWidthWindowHeight)顯示不正確直接返回;判斷落子的位置,根據(jù)橫縱坐標(biāo)來判斷,如果點擊的是橫縱棋盤線的交界點,我們判斷交界點右上角為落子的位置;Int xPos=(int)(x-(WindowWidth-WindowHeight)/2.0f)/(WindowHeight/15.0f);Int yPos=(int)(y/(WindowHeight/15.0f);判斷落子的位置是否有效,如果超出棋盤或者落子的位置已經(jīng)有棋子都為無效位置;if(xPos0)|(yPos14)|(yPos14)|(curSituationxPosyPos

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論