




已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Linux 平臺下基于 C 的貪食蛇游戲設(shè)計與實現(xiàn) 姓 名 系 別、 專 業(yè) 導(dǎo) 師 姓 名、職 稱 完 成 時 間 目 錄 摘 要 . I ABSTRACT . II 緒 論 . 1 1.1 論文選題依據(jù) . 1 1.2 貪食蛇游戲選題背景 . 1 1.3 貪食蛇設(shè)計概述 . 1 平臺簡介 . 2 2.1 系統(tǒng)介紹 . 2 2.1.2 Linux 系統(tǒng)的主要特點 . 2 2.1.3 LINUX 的組成 . 2 2.2 開發(fā)工具 . 3 2.2.1 C語言簡介 . 3 2.2.2 GTK簡介 . 3 2.2.3 Linux 編譯工具 GCC簡介 . 4 2.3 GTK環(huán)境的搭建 . 4 3 系統(tǒng)分析 . 5 3.1 可行性分析 . 5 3.1.1 技術(shù)可行性 . 5 3.1.2 經(jīng)濟可行性 . 5 3.1.3 操作可行性 . 5 3.2 需求分析 . 5 3.2.1 功能要求 . 5 3.2.2 性能要求 . 6 3.2.3 運行要求 . 6 4 系統(tǒng)概要設(shè)計 . 6 4.1 程序初始化 . 6 4.2 程序流程 . 6 4.2.1 系統(tǒng)模塊 . 6 4.2.2 系統(tǒng)流程 . 6 5 系統(tǒng)詳細(xì)設(shè)計 . 8 5.1 系統(tǒng)界面 . 8 5.2 對象模型設(shè)計 . 11 5.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn) . 12 5.4 游戲運行中的設(shè)計思路 . 12 5.5 游戲規(guī)則 . 13 5.6 游戲?qū)崿F(xiàn)以及其代碼 . 13 5.6.1 蛇移動的實現(xiàn) . 13 5.6.2 蛇死亡的判斷 . 14 5.6.3 蛇到達(dá)邊框時從另一端出現(xiàn)和傳送的實現(xiàn) . 14 6 貪食蛇 AI 的算法設(shè)計 . 15 6.1 蛇自己尋找食物的算法設(shè)計 . 15 6.1.1 貪心算法 . 15 6.1.2 利用貪心算法實現(xiàn)最短路徑的選擇 . 16 6.2 蛇避開吃到自己身體的算法設(shè)計 . 17 6.3 地圖 2 需要新增的一些判斷 . 18 7 調(diào)試以及測試結(jié)果分析 . 19 7.1 系統(tǒng)測試 . 20 7.2 在軟件的測試過程中發(fā)現(xiàn)的幾個小問題 . 20 7.3 系統(tǒng)需要的改進(jìn)與提高 . 21 結(jié)束語 . 22 參考文獻(xiàn) . 23 致 謝 . 錯誤 !未定義書簽。 附 錄 . 24 I 摘 要 貪食蛇游戲操作簡單方便,老少皆宜,是一款不錯的小游戲。而 Linux挾其價格低廉、品質(zhì)良好與穩(wěn)定的優(yōu)勢,正吸引著眾多以 PC為主工作、學(xué)習(xí)和娛樂的人們。 基于 Linux平臺下的貪食蛇游戲采用的 Linux底下 C語言和 GTK圖形化編程工具編寫,操作簡單。玩家首先進(jìn)入游戲,在游戲中可以對游戲進(jìn)行暫停、退出等操作,還加入了雙人對戰(zhàn)模式,豐富了 游戲,增大游戲的娛樂性。 本文分幾部分闡述了基于 Linux下的貪食蛇游戲的開發(fā)過程,分章節(jié)較詳細(xì)的介紹了游戲的結(jié)構(gòu)和設(shè)計實現(xiàn)過程,并詳細(xì)畫出了系統(tǒng)流程圖,還詳細(xì)介紹了各個功能完成相關(guān)技術(shù),寫出了調(diào)試以及測試結(jié)果分析。 關(guān)鍵詞 : GTK; Linux操作系統(tǒng);貪食蛇游戲 II ABSTRACT Snake game is easy and convenient to operate.It is a good game for all ages. Relying on its low price, good quality and stable competitive advantage,the Linux is invisibly attracting large numbers of people who base PC as main work、 Learning and entertainment platform. The Linux platform-based Snake game is easy to operate by adopting the C language and GTK graphical programming tools.After entering the game, the players can do some operations,like “pause”, “exit” ect.The added two-war mode enriches the game, and makes the game more entertaining. This paper describes the development process of the Linux-based Snake game in several parts. A comparatively detailed introduction is given to the structure of the game and the process of the designs implementation in sub-sections. A system flow chart is drawn in details.The technology related to the completion of various functions is also given in details. Debugging and an analysis of the test results is written out. Key words: GTK; Linux operating system; Snake Game 1 緒 論 1.1 論文選題依據(jù) Linux 挾其價格低廉、品質(zhì)良好與穩(wěn)定的競爭優(yōu)勢,正無形無影地吸引眾多以 PC為 主工作平臺上的人們。隨著科學(xué)技術(shù)日新月異的發(fā)展, Linux 提供了更多圖形接口的桌面操作環(huán)境和應(yīng)用軟件,操作更加簡單方便。 Linux 是源代碼開放的操作系統(tǒng),是當(dāng)今優(yōu)秀的操作系統(tǒng)之一。標(biāo)準(zhǔn) Linux經(jīng)過小型化裁剪之后的專用 Linux操作系統(tǒng)即嵌入式 Linux,已成為當(dāng)今的一大熱點,它能夠固化于容量只有幾 KB或者幾 MB的存儲器芯片或者單片機中,適合于特定嵌入式場合,目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約一半的系統(tǒng)使用嵌入式 Linux。嵌入式 Linux得到眾廠商的青睞,在工程實踐中應(yīng)用也十分廣泛,我校的嵌入式系統(tǒng)課程 同樣也采用嵌入式 Linux進(jìn)行教學(xué)工作,因此,此次游戲設(shè)計環(huán)境也采用 Linux系統(tǒng)。 Linux內(nèi)核的大部分代碼是由 C語言編寫的, Linux應(yīng)用程序也多由 C語言編寫 【 1】 。C 語言是結(jié)構(gòu)化、模式化的語言,程序可移植性好,運算符豐富、代碼效率高,它兼有匯編語言和高級語言的優(yōu)點,既適合于開發(fā)系統(tǒng)軟件,也適合于編寫應(yīng)用程序,被廣泛應(yīng)用于事務(wù)處理、科學(xué)計算、工業(yè)控制、數(shù)據(jù)庫技術(shù)等領(lǐng)域。此次設(shè)計語言環(huán)境也選用 C語言。 GTK 是 Linux 平臺下比較好的一個 C 語言圖形開發(fā)工具,所以本次也選擇了 GTK圖形開發(fā)工具。 1.2 貪食蛇游戲選題背景 隨著經(jīng)濟的快速發(fā)展,人們生活的步調(diào)日益加快,計算機的地位在人們的生活中已日益突出,基于各種操作系統(tǒng)的娛樂游戲也越來越多、越來越大眾化,成為人們生活中必不可少的一部分。而隨著人們生活品質(zhì)的提高,電腦游戲也越來越多元化,貪食蛇就是其中一種。貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強,吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻起樂無窮,貪食蛇游戲操作簡單方便,老少皆宜,是一款不錯的小游戲 ,而實現(xiàn)二人對戰(zhàn)使游戲更具新意也更有趣。 該游戲給人們帶來了追逐的快感,以及成 功后的滿足感,對于一直處于高壓下的現(xiàn)代人是很好的放松工具。 1.3 貪食蛇設(shè)計概述 該游戲主要功能包括:選擇玩家人數(shù)與游戲模式、選擇游戲地圖、開始游戲、暫 2 停游戲、退出游戲等。 選擇玩家人數(shù):玩家可以選擇單人模式、雙人對戰(zhàn)模式和人機對戰(zhàn)模式進(jìn)入游戲。 選擇游戲地圖:玩家可以選擇玩哪個地圖,暫時有 2個地圖供選擇,每一個地圖將會有不同的墻壁和不同的傳送點。 開始游戲:玩家 1通過方向鍵,玩家 2 通過 W S D A鍵,使蛇改變向去吃食,每吃一個食物蛇身加長,分?jǐn)?shù)加 1。每局 300 秒。 暫停游戲:點擊暫停按鈕暫停游戲,點擊繼續(xù)按鈕繼續(xù)游戲。 退出游戲:點擊退出按鈕退出游戲。 平臺簡介 2.1 系統(tǒng)介紹 2.1.1 Linux 簡介 Linux是一套免費使用和自由傳播的類 Unix操作系統(tǒng),它主要用于基于 x86系列CPU 的計算機上。這個系統(tǒng)是由世界各地的成千上萬的程序員設(shè)計和實現(xiàn)的。其目的是建立不受任何商品化軟件的版權(quán)制約的、全世界都能自由使用的 Unix兼容產(chǎn)品 【 2】 。 2.1.2 Linux 系統(tǒng)的主要特點 Linux操作系統(tǒng)作為當(dāng)今主要的操作系統(tǒng)之一具有以下這些特點: (1)開放性 (2)多用戶 (3)多任務(wù) (4)良好的用戶界面 (5)設(shè)備獨立性 (6)提供了豐富的網(wǎng)絡(luò)功能 (7)可靠的安全系統(tǒng) (8)良好的可移植性 2.1.3 LINUX 的組成 LINUX的內(nèi)核:內(nèi)核是系統(tǒng)的核心,是運行程序和管理 像磁盤和打印機等硬件設(shè)備的核心程序。 LINUX SHELL: Shell 是系統(tǒng)的用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種接口。 LINUX 文件系統(tǒng) : Linux 文件系統(tǒng)是文件存放在磁盤等存儲設(shè)備上的組織方法。Linux能支持多種目前主流的文 件系統(tǒng),如 EXT2、 EXT3、 FAT、 VFAT、 ISO9660、 NFS、 3 SMB等。 LINUX應(yīng)用系統(tǒng):標(biāo)準(zhǔn)的 Linux系統(tǒng)都有一整套稱為應(yīng)用程序的程序集,包括文本編輯器、編程語言、 X Window、辦公套件、 Internet工具、數(shù)據(jù)庫等 【 3】 。 2.2 開發(fā)工具 在確定了操作系統(tǒng)后,就該選擇開發(fā)工具了??紤]到是在 Linux 平臺下開發(fā)而Linux的內(nèi)核主要是由 C語言編寫的,所以 C 語言在 Linux下的軟件開發(fā)具有獨到的優(yōu)勢 【 4】 。由于考慮到游戲開發(fā)需要一個良好的界面,終端程序顯然無法達(dá)到 要求。于是 GTK圖形化編程工具就成了必然的選擇。下面將簡要介紹本次貪食蛇游戲開發(fā)所要用到的主要工具。 2.2.1 C 語言簡介 C 語言是目前世界上流行、使用最廣泛的高級程序設(shè)計語言。 C 語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進(jìn)行操作的場合,用 C語言明顯優(yōu)于其它高級語言,許多大型應(yīng)用軟件都是用 C語言編寫的。 C 語言具有繪圖能力強,可移植性,并具備很強的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動畫它是數(shù)值計算的高級語言 【 4】 。 C語言的特點有: (1)簡潔緊湊、靈活方便。 (2) 運算符豐 富。 (3) 數(shù)據(jù)結(jié)構(gòu)豐富。 (4) C是結(jié)構(gòu)式語言。 (5) C語法限制不太嚴(yán)格、程序設(shè)計自由度大。 (6) C語言允許直接訪問物理地址,可以直接對硬件進(jìn)行操作。 (7) C語言程序生成代碼質(zhì)量高,程序執(zhí)行效率高。 (8) C語言適用范圍大,可移植性好 【 5】 。 2.2.2 GTK 簡介 GTK(GIMP Toolkit)是一套跨多種平臺的圖形工具包 ,按 LGPL 許可協(xié)議發(fā)布的。雖然最初是為 GIMP 寫的,但目前已發(fā)展為一個功能強大、設(shè)計靈活的一個通用圖形庫。特別是被 GNOME 選中使得 GTK+廣為流傳,成為 Linux下開發(fā)圖形界面的應(yīng)用程序的主流開發(fā)工具之一,當(dāng)然 GTK+并不要求必須在 Linux 上,事實上,目前 GTK+已經(jīng)有了成功的 windows 版本。 GTK雖然是用 C語言寫的,但是您可以使用你熟悉的語言來使用 GTK,因為 GTK+已經(jīng)被綁定到幾乎所有流行的語言上,如: C+,PHP, Guile, Perl, Python, TOM, Ada95, 4 Objective C, Free Pascal, and Eiffel【 6】 。 GTK的一個簡單例子如下: 該例子產(chǎn)生一個窗口。它不能 自己退出,只能通過 shell來殺死進(jìn)程(調(diào)用 kill命令)。 /*例子 base.c */ #include int main( int argc,char *argv ) GtkWidget *window;gtk_init (&argc, &argv); /* 初始化顯示環(huán)境 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 創(chuàng)建一個新的窗口 */ gtk_widget_show (window); /*顯示窗口 */ gtk_main (); /*進(jìn)入睡眠狀態(tài),等待事件激活 */ return(0); 從上面的程序可以看出, GTK是一個事件驅(qū)動工具包,當(dāng)它運行到 gtk_main()函數(shù)時會自動睡眠,直到有事件發(fā)生,控制權(quán)轉(zhuǎn)讓給相應(yīng)的函數(shù)調(diào)用,在該函數(shù)中可以用標(biāo)準(zhǔn) C寫出相應(yīng)的事物邏輯。這與 windows 上的程序處理是一樣的。 2.2.3 Linux 編譯工具 GCC 簡介 GCC是一個用于 linux系統(tǒng)下編程的編譯器。 GCC=GNU Compiler Collection,是由 Stallman所開發(fā)的 linux下的編譯器,可以編譯的語言包括: C, C+, Objective-C, Fortran, Java,Ada 等。不過,現(xiàn)在 GCC也有了許多 Win32下的移植版本。如今的 GCC借助于他的特性,具有了交叉編譯器的功能,即在一個平臺下編譯另一個平臺的代碼。 2.3 GTK 環(huán)境的搭建 我們以 Linux 系統(tǒng) Ubuntu 為例簡要介紹 GTK 環(huán)境的搭建, Ubuntu 桌面環(huán)境是gnome。 gnome 就是使用 GTK+編寫,所以運行環(huán)境不需要另外配置了,要做的是安裝開發(fā) 所需要的環(huán)境。 剛安裝好的 Ubuntu 已經(jīng)默認(rèn)安裝了 gcc,但是并沒有安裝所需要的頭文件,我們需要手動添加,使用命令: sudo apt-get install build-essential 然后再安裝 gnome 開發(fā)包,使用命令: sudo apt-get install gnome-core-devel 系統(tǒng)會自動找到所依賴的庫,并一起下載下來。 5 這樣安裝過后使用下面的命令編譯上面的代碼: gcc main.c -o main pkg-config -cflags -libs gtk+-2.0 注意,這里的 是鍵盤上 1左面的反引號,不是單引號。 KDE桌面配置 GTK,步驟也類似,但是需要先安裝 GTK的運行環(huán)境。 本次開發(fā)所使用 的 操作系統(tǒng)平臺是 Fedora 12 完整版 安裝時選擇安裝 GTK 開發(fā)工具與 gnome桌面,因此當(dāng)系統(tǒng)完成安裝所有 GTK的運行和開發(fā)環(huán)境就已搭建好。 3 系統(tǒng)分析 3.1 可行性分析 3.1.1 技術(shù)可行性 本系統(tǒng)的設(shè)計要求是一個能在 Linux操作系統(tǒng)下運行且界面美觀運行穩(wěn)定且將來可能用于嵌入式移植的系統(tǒng)。綜合考慮選擇 C 語言與 GTK技 術(shù)來實現(xiàn)本系統(tǒng)。 C語言是一門成熟的高級語言,可用于開發(fā)各種系統(tǒng),也可用于開發(fā)游戲系統(tǒng) 【 7】 。同時 C 語言也擁有相當(dāng)多的技術(shù)人員。 GTK是 Linux 下的一個圖形化編程工具,其開發(fā)出來的程序能在裝有 GTK 環(huán)境的 Linux系統(tǒng)下順利運行??梢哉f在技術(shù)方面開發(fā)此系統(tǒng)不會有什么問題。 3.1.2 經(jīng)濟可行性 隨著手機和電腦的普及 ,這樣的小游戲也將隨著普及因此其需求也將不斷上升 ,而由于技術(shù)的成熟與為數(shù)眾多的開發(fā)人員使得此系統(tǒng)的開發(fā)并不困難,再者此系統(tǒng)運行的平臺 Linux操作系統(tǒng)是開源和免費的,所以開發(fā)此系統(tǒng)的成 本并不會很高。因此此系統(tǒng)具有相當(dāng)?shù)慕?jīng)濟利益,到時候我們也可以靜觀其成 . 3.1.3 操作可行性 本系統(tǒng)是一個簡單的單機游戲系統(tǒng),對于這樣一個系統(tǒng) ,其操作只需要使用簡單的幾個按鍵和鼠標(biāo)點擊按鈕就可以實現(xiàn),因此本系統(tǒng)的操作簡單易記,可以說一看就會的,系統(tǒng)在操作上是不會存在問題的 ,本系統(tǒng)需要在 Linux 操作系統(tǒng)下運行,而用戶也可以在其受益不淺 . 3.2 需求分析 3.2.1 功能要求 本系統(tǒng)是一個簡單的單機游戲,其功能要求實現(xiàn)單人游戲模式、雙人對戰(zhàn)模式和人機對戰(zhàn)模式以提高游戲的可玩性,系統(tǒng)默認(rèn)模式為單人模式 ,通過點擊按鈕選擇不同游戲模式進(jìn)行游戲。系統(tǒng)還要求實現(xiàn)至少 2個不同地圖的選擇,以提高游戲的趣味 6 與豐富性。單人模式時只有玩家 1通過上下左右鍵來控制蛇的方向,在規(guī)定時間內(nèi)盡量多吃食物,雙人模式時增加的玩家 2可以通過 W,S,A,D來控制蛇的移動方向,通過雙人競技比較誰吃的食物最多,人機對戰(zhàn)是在只有一個人的情況下可以與電腦進(jìn)行對戰(zhàn)。游戲中要實現(xiàn)暫停與退出和關(guān)于幫助文檔。 3.2.2 性能要求 游戲操作要求簡單易行,游戲過程中畫面移動要流暢,通過鍵盤對蛇移動方向控制時無明顯延遲,由于本系統(tǒng)將來有可能在嵌入式 Linux上移植,而嵌入式系統(tǒng)一般存儲較小,處理器的處理速度也不是很快,因此本系統(tǒng)對內(nèi)存和處理器的使用的要求都要盡可能的小。 3.2.3 運行要求 本系統(tǒng)由于要使用到 GTK圖形化編程工具,而圖形化編程工具 GTK開發(fā)出來的程序需要有 GTK環(huán)境才能運行,由于是用 C語言實現(xiàn),因此系統(tǒng)對硬件的要求并不是很高。所以本系統(tǒng)的運行要求是搭建有 GTK環(huán)境或是安裝 gnome桌面環(huán)境的 Linux操作系統(tǒng)。 4 系統(tǒng)概要設(shè)計 4.1 程序初始化 程序初始化主要由初始化函數(shù) init_game()在游戲開始時對各變量進(jìn) 行初始化賦值。每次重新游戲時,得分將清零,游戲時間重設(shè)為 300 秒,蛇的長度與位置恢復(fù)為初始狀態(tài),但游戲模式與游戲的地圖將不變,需要玩家自己選擇才會發(fā)生改變 游戲的初始化流程如圖 4.1 所示。 4.2 程序流程 4.2.1 系統(tǒng)模塊 本系統(tǒng)分為:圖形初始化 gtk_init()與游戲初始化 game_init()模塊、圖形界面設(shè)計 create_window()與地圖設(shè)計 draw_map()模塊、模式選擇 cb_choose()模塊、游戲 play_game()模塊、成績輸出模塊、電腦 AI模塊、游戲退出模塊、游戲中蛇通過判 斷是否撞墻或吃到自己來判斷蛇的死亡。 程序模塊如圖 4.2所示。 4.2.2 系統(tǒng)流程 本系統(tǒng)流程:當(dāng)用戶打開系統(tǒng),系統(tǒng)首先對各參數(shù)進(jìn)行初始化設(shè)定,當(dāng)玩家點擊“開始”時開始游戲,用戶通過方向鍵進(jìn)行游戲,游戲過程中 如果蛇死亡或游戲 7 時間完則停止游戲并顯示分?jǐn)?shù)與結(jié)束信息,當(dāng)玩家選擇從新開始時游戲進(jìn)行初始化設(shè)定,當(dāng)玩家選擇退出時退出游戲。 游戲流程如圖 4.3所示。 圖 4.1 程序初始化流程圖 圖 4.2 游戲模塊圖 8 圖 4.3 游戲流程圖 5 系統(tǒng)詳細(xì)設(shè)計 5.1 系統(tǒng)界面 用戶界面是現(xiàn)代軟件重要的組成部分,界面的好壞對于游戲軟件來說也相當(dāng)?shù)闹匾?,因為一個用戶友好的界面能讓玩家在游戲過程中感覺更舒心,而一個不友好的界面將使游戲的品質(zhì)大打折扣。 本系統(tǒng)界面的設(shè)計遵循如下的指導(dǎo)規(guī)則: 1 讓用戶駕馭軟件,而不是軟件駕馭用戶。 2 盡可能減少用戶的記性。 3 保持界面的一致性 【 8】 。 本游戲的界面設(shè)計如圖 5.1所示。 9 圖 5.1 游戲界面的設(shè)計 此系統(tǒng)界面設(shè)計簡約而不簡單,用戶使用此系統(tǒng)時能夠很容易記住方便玩家使用,因此不會讓人感覺復(fù)雜而乏味。 界面主要分為以下幾大部分。 (1)主界面:所有信息都顯示在主窗口上,其中主要有游戲顯示區(qū)、游戲信息顯示區(qū)和游戲按鈕區(qū)。 主窗口創(chuàng)建代碼如下: /創(chuàng)建窗口 window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /設(shè)置主窗口標(biāo)題 gtk_window_set_title(GTK_WINDOW(window),貪食蛇 ); /主窗口顯示位置 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); /接受關(guān)閉事件并且關(guān)閉窗 口 g_signal_connect(G_OBJECT(window),destroy,G_CALLBACK(gtk_main_quit),NULL); /設(shè)置主窗口大小 gtk_widget_set_size_request(window,800,500); /邊框大小 10 gtk_container_set_border_width(GTK_CONTAINER(window),10); (2)游戲顯示區(qū):此區(qū)域是游戲過程的顯示區(qū)域,也是界面的主要設(shè)計部分。 通過 draw=gtk_drawing_area_new();創(chuàng)建游戲區(qū)域窗口。 (3)游戲開始界面如圖 5.2 所示。 在打開系統(tǒng)時,游戲區(qū)顯示一張歡迎界面的圖片。 用 pixbuf = gdk_pixbuf_new_from_file (./test.jpg,NULL);將文件名為 test.jpg的圖片添加進(jìn)游戲區(qū)并設(shè)為背景 。 (4)信息顯示區(qū):主要顯示游戲過程中的各種信息,如時間和得分等。 gtk_label_new()函數(shù)用于顯示游戲分?jǐn)?shù)等信息。 信息顯示區(qū)如圖 5.3所示。 (5)按鈕區(qū):主要顯示游戲中需要點擊選擇的按鈕。 通過 gtk_button_new_with_label() 函數(shù)創(chuàng)建按鈕。 按鈕布局如圖 5.4所示。 (6)通過 gtk_fixed_new()創(chuàng)建一個名叫 fixed 的固定容器,然后將游戲顯示區(qū) draw、信息顯示和按鈕添加進(jìn) fixed,最后把 fixed 容器添加進(jìn) window 主窗口,最后通過gtk_widget_show_all(window)函數(shù)將其顯示出來。 圖 5.2 游戲開始界面設(shè)計 11 圖 5.3 游戲信息顯示區(qū) 圖 5.4 系統(tǒng)按鈕布局 5.2 對象模型設(shè)計 在本系統(tǒng)中對象模型的設(shè)計主要是蛇的設(shè)計,食物的設(shè)計,和地圖的設(shè)計。 蛇的設(shè)計主要是通過 2 個畫圓函數(shù) gdk_draw_arc()畫出蛇的每一個結(jié)點同時設(shè)定顏色。而食物也是通過畫圓函數(shù)畫出。地圖中的傳送點和墻體是通過畫方格函數(shù)gdk_draw_rectangle()畫出。 圖 5.5中 就是蛇, 即是食物,褐色長方形即使墻的設(shè)計, 是傳送點。 圖 5.5 地圖二的設(shè)計 12 圖 5.6 地圖一的設(shè)計 5.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn) 蛇狀態(tài)的初始化是由定義蛇結(jié)構(gòu)體時初始化決定的,每一次開始蛇的長度,出現(xiàn)位置和移動方向都是一樣的,它們長度都為 6 個結(jié)點,方向都向右,蛇 1 初始位置是( 3, 3),蛇 2 初始位置是( 3, 30)。 無論是在游戲的開始還是進(jìn)行中,食物都是隨機出現(xiàn)的,通過 rand()隨機數(shù)產(chǎn)生函數(shù)隨機產(chǎn)生食物出現(xiàn)的坐標(biāo),在產(chǎn)生的隨機坐標(biāo)上畫出食物。 5.4 游戲運行中的設(shè)計思路 游戲中蛇的運動是靠通過對畫面的不斷清除與重畫而實現(xiàn)的,每一次運動時先用背景色擦除掉原有蛇的圖像,再將蛇畫在其新出現(xiàn)的位置,由于每一次擦除與重畫間隔的時間 非常短,利用人的視覺暫留性,讓蛇看上去就像在連續(xù)不斷的運動。而食物未被吃前,傳送點和墻體被擦除后重畫的位置與原來一樣,所以讓人感覺其并沒有變化。 蛇身的移動與運動方向主要是受頭結(jié)點控制,因為蛇每一次運動就是靠后一結(jié)點畫在前一結(jié)點的位置上來實現(xiàn)的,所以對蛇的控制主要是對頭結(jié)點的控制。 蛇 1 通過上下左右鍵,蛇 2 通過 W、 S、 A、 D 鍵來控制蛇的移動方向 游戲中蛇運動速度的快慢主要是通過設(shè)置畫面重畫頻率來實現(xiàn)的,而具體實現(xiàn)是通過對函數(shù)的調(diào)用頻率, GTK 中用函數(shù) g_timeout_add ()來實現(xiàn)對函數(shù)的定時調(diào) 13 用。 游戲暫停則是通過 g_source_remove()函數(shù)中止對蛇運行函數(shù)的定時調(diào)用。通過g_timeout_add()來實現(xiàn)游戲的繼續(xù)。 設(shè)計了傳送點和墻體來增加游戲的復(fù)雜性與可玩性 5.5 游戲規(guī)則 1 單人模式 單人模式的規(guī)則比較簡單,只要在規(guī)定的時間內(nèi)不死亡和盡量得分最多即可。蛇撞墻或自己身體時即死亡,當(dāng)蛇進(jìn)入傳送點時將從另一特定位置出來。 2 雙人競技模式 蛇進(jìn)入傳送點時將從另一特定位置出來,規(guī)定時間內(nèi)蛇沒死亡得分最多者贏,得分相等為平局,游戲中撞墻或自己身體死亡者輸。兩條蛇可以互相穿透。 3人機對戰(zhàn) 模式 當(dāng)用戶選擇此模式時將于電腦控制的蛇進(jìn)行競技,此模式規(guī)則與雙人對戰(zhàn)模式一樣。 5.6 游戲?qū)崿F(xiàn)以及其代碼 5.6.1 蛇移動的實現(xiàn) 蛇的移動方向主要受頭結(jié)點控制,所以每次畫蛇時只要把前一結(jié)點的值賦給后一節(jié)點即可。 當(dāng)蛇頭的移動方向向右時, y 值不變 x 的值不斷增加。 當(dāng)蛇頭的移動方向向左時, y 值不變 x 的值不斷減少。 當(dāng)蛇頭的移動方向向下時, y 值增加 x 的值不變。 當(dāng)蛇頭的移動方向向上時, y 值減小 x 的值不變。 畫蛇和蛇移動代碼如下: /蛇身體節(jié)點位置的賦值 gint i; for (i=snake.node;i0;i-) snake.xi= snake.xi-1; snake.yi= snake.yi-1; /蛇移動的實現(xiàn) 14 switch( snake.dir) case 1: snake.x0+=1;break; case 2: snake.x0-=1;break; case 3: snake.y0-=1;break; case 4: snake.y0+=1;break; /*1向右, 2向左, 3向上, 4向下 */ 5.6.2 蛇死亡的判斷 當(dāng)蛇頭的值與蛇身或與墻的值相等時,蛇即算死亡,代碼如下: void judge_die(struct Snake *psnake) gint j; for(j=3;jnode;j+) if( psnake-xj= psnake-x0& psnake-yj= psnake-y0) psnake-life=1; 5.6.3 蛇到達(dá)邊框時從另一端出現(xiàn)和傳送的實現(xiàn) 當(dāng)蛇頭的 x或 y值達(dá)到邊框的最大或最小位置時相應(yīng)的給 x或 y賦以邊框的最小或最大值以實現(xiàn)當(dāng)蛇到達(dá)邊框時能從另一端出來,同理當(dāng)蛇頭的 x, y 值等于傳送點位置的值時將蛇頭 x, y 的值賦以被傳送到位置的值,這樣將實現(xiàn)蛇的傳送功能。 部分代碼實現(xiàn)如下: if(snake2.x0=0|snake2.x0=59|snake2.x0=30) snake2.life=1; else if(snake2.dir=3&snake2.y0=47) snake2.y0=-1; /到達(dá)傳送點的處理 if(snake2.x0=1&snake2.y0=3) 15 snake2.x0=58; snake2.y0=43; if(snake2.x0=58&snake2.y0=3) snake2.x0=1; snake2.y0=43; 6 貪食蛇 AI 的算法設(shè)計 本游戲設(shè)計了人機對戰(zhàn)模式,因此電腦貪食蛇的實現(xiàn)就必須用到人工智能也就是AI,下面將詳細(xì)介紹實現(xiàn) AI的算法設(shè)計。 6.1 蛇自己尋找食物的算法設(shè)計 此部分的算法設(shè)計是蛇 AI 設(shè)計的最主要也是最基本的部分。在系統(tǒng)中電腦蛇主要通過搜尋最短路徑來尋找食物,而最短路徑的搜索可以通過很多算法來實現(xiàn),本系統(tǒng)主要是通過尋找局部最優(yōu)解的方法來搜索蛇到食物的最短路徑,而其中有一個貪心算法符合此部分的設(shè)計。 6.1.1 貪心算法 所謂貪心算法是 指,在對問題求解時,總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解。 貪心算法不是對所有問題都能得到整體最優(yōu)解,但對范圍相當(dāng)廣泛的許多問題他能產(chǎn)生整體最優(yōu)解或者是整體最優(yōu)解的近似解。 貪心算法的基本思路如下: (1)建立數(shù)學(xué)模型來描述問題。 (2)把求解的問題分成若干個子問題。 (3)對每一子問題求解,得到子問題的局部最優(yōu)解。 (4)把子問題的解局部最優(yōu)解合成原來解問題的一個解。 實現(xiàn)該算法的過程: 從問題的某一初始解 出發(fā); while 能朝給定總目標(biāo)前進(jìn)一步 do 16 求出可行解的一個解元素; 由所有解元素組合成問題的一個可行解。 6.1.2 利用貪心算法實現(xiàn)最短路徑的選擇 本系統(tǒng)中蛇主要是通過頭結(jié)點的移動來控制蛇的移動,因此電腦蛇的移動也主要是通過頭結(jié)點的的方向的選擇來控制蛇的移動。 根據(jù)貪心算法得出最短路徑的步驟: (1)選擇一組解即在蛇頭結(jié)點有可能移動的四個方向,每個方向選出一個點用于挑選最優(yōu)解。 (2)挑選出來的四個點依次計算出其與食物的距離,然后進(jìn)行比較。 (3)選出離食物最近的一個點。 (4)把蛇 頭結(jié)點移動的方向設(shè)為移動到挑選出來離食物距離最近點的方向。 (5)移動到下一點后又從第 1步執(zhí)行,直到最后得到最優(yōu)解為止。 求可行解(第 2步)示意圖如下: 圖 6.1 求可行解示意圖 計算距離通過比較選出最短距離然后選擇蛇移動方向的實現(xiàn)代碼如下,其中要考慮到選出來的四個點中有一個是被蛇身體所占據(jù),蛇是不能往哪個方向移動的,因此要把這一情況排除。 算法實現(xiàn)代碼如下: Void get_dir() gint a,b,a1,a2,b3,b4; gint d1,d2,d3,d4; a=snake2.x0-food.x; b=snake2.y0-food.y; 17 a1=(snake2.x0+1)-food.x; a2=(snake2.x0-1)-food.x; b3=(snake2.y0-1)-food.y; b4=(snake2.y0+1)-food.y; /計算與食物的距離 d1=a1*a1+b*b; d2=a2*a2+b*b; d3=b3*b3+a*a; d4=b4*b4+a*a; /選擇最短距離的點后得到方向 if(d130&snake2.x030&snake2.dir!=4) snake2.dir=3; if(snake2.y0=3&snake2.dir!=2) snake2.dir=1; 此地圖還需要考慮墻的存在,當(dāng)蛇頭到達(dá)墻時必須改變方向避開它,否則將撞墻死亡。 實現(xiàn)代碼如下: 19 if(snake2.x030&(snake2.x0=58|snake2.x0=31)&snake2.dir!=4) snake2.dir=3; if(food.x30&snake2.y0=3) snake2.dir=1; 當(dāng)蛇從一個區(qū)域到達(dá)另一區(qū)域的時候,有兩個出口可供選擇,這個時候蛇將選擇離食物最近的那個出口出現(xiàn)。兩個出口是上下分布的,因此只用判斷食物所在坐標(biāo)的y 值即可。 因為游戲區(qū)域 y 的大小是從 0 到 50,所以當(dāng) y 值小于等于 25 時從上面出口出現(xiàn),當(dāng) y值大于 25時從下面出口出現(xiàn)。 部分實現(xiàn)代碼如下: if(snake2.x0=1&snake2.y0=3) if(food.y25) snake2.x0=58; snake2.y0=43; if(food.y #define GTK_Up 65362 #define GTK_Down 65364 #define GTK_Left 65361 #define GTK_Right 65363 #define n 200 static GtkWidget *window = NULL; static GtkWidget *draw= NULL,*draw2=NULL; static GdkPixmap *pixmap = NULL,*pixbuf=NULL; GtkWidget *label; GtkWidget *score_label; 25 GtkWidget *score_label2; GtkWidget *inf_label; GtkWidget *win_label; GtkWidget *ti_label; GdkColor color; GdkGC *gc_blue; GdkGC *gc_red; GdkGC *gc_br; GdkGC *gc_tt; GdkGC *gc_a; GdkGC *gc_b; gboolean playing = FALSE; gboolean pauseing = FALSE; gboolean ai=FALSE; gint score=0,score2=0;/*得分 */ gint speed=130; guint timer=0; guint timer1=0; gint times=300; gint play_n=1; gint t=0; gint mp=1; struct Food int x; int y; int yes; /*判斷是否出現(xiàn)食物的變量 */ food=6,16,0; struct Snake int xn; int yn; int node; 26 int dir;/*蛇移動方向 :1 右, 2 左, 3 上, 4 下 */ int life/*蛇的生命: 0 活著, 1 死亡 */ snake=4,4,7,1,0,snake2=4,30,7,1,0; /系統(tǒng)主程序 gint main(int argc, char *argv) gtk_init(&argc,&argv); create_window(); gtk_main(); return 0; /窗口的設(shè)計 void create_window() GtkWidget *exit,*start,*choose,*choose1,*choose2,*pause,*about; GtkWidget *fixed; GtkWidget *g_map1,*g_map2; window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),貪食蛇 ); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(window),destroy,G_CALLBACK(gtk_main_quit),NULL); gtk_widget_set_size_request(window,800,500); gtk_container_set_border_width(GTK_CONTAINER(window),10); g_signal_connect (GTK_OBJECT(window),key_press_event,G_CALLBACK (key_press),NULL); draw=gtk_drawing_area_new(); gtk_widget_set_size_request(draw, 600, 480); g_signal_connect (draw, expose_event,G_CALLBACK (expose_event), NULL); g_signal_connect (draw,configure_event,G_CALLBACK (configure_event), NULL); /按鈕 start = gtk_button_new_with_label ( 開 始 ); g_signal_connect (start,clicked,G_CALLBACK(game_start),NULL); gtk_widget_set_size_request(start,70, 30); exit=gtk_button_new_with_label(退出游戲 ); 27 g_signal_connect(G_OBJECT(exit),clicked,G_CALLBACK(cb_exit),NULL); gtk_widget_set_size_request(exit, 70, 30); pause = gtk_button_new_with_label ( 暫 停 ); g_signal_connect (pause,clicked,G_CALLBACK(game_pause),NULL); gtk_widget_set_size_request(pause,70, 30); about= gtk_button_new_with_label ( 關(guān)于 ); g_signal_connect (about,clicked,G_CALLBACK(cb_about),(gpointer)歡迎使用此游戲! n 游戲規(guī)則: n1)玩家 1 通過方向鍵控制游戲 n2)玩家 2 通過 W, S, A, D 字母鍵控制游戲 n3)游戲時間完得分多者贏 n4)游戲過程中死亡者輸 nn 說明:此游戲可以選擇單人模式和雙人模式還有 2地圖供選擇 nn 希望你能喜歡本游戲! ); gtk_widget_set_size_request(about,70, 30); choose=gtk_button_new_with_label(雙人 ); g_signal_connec
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理質(zhì)量控制員(差錯防范)崗位面試問題及答案
- 化工檢驗工(原料檢驗)崗位面試問題及答案
- 二手房交易預(yù)付款項及交易風(fēng)險防范合同
- 車輛購置稅代繳與保險代理合同
- 跨國公司雇員勞動合同書
- 文化創(chuàng)意產(chǎn)業(yè)股權(quán)轉(zhuǎn)讓中介服務(wù)協(xié)議范本
- 股東聯(lián)合創(chuàng)辦電商平臺的合作協(xié)議
- 人工智能研發(fā)股東入股投資協(xié)議
- 養(yǎng)殖設(shè)備配齊方案
- 住宅街區(qū)改造方案
- 第九講 全面依法治國PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 川16Z117-TY 彩色透水混凝土整體路面構(gòu)造圖集
- 地鐵工程機電安裝施工組織設(shè)計
- 《重慶市建設(shè)工程費用定額》電子版
- GB/T 42361-2023海域使用論證技術(shù)導(dǎo)則
- 04SG518-2 門式剛架輕型房屋鋼結(jié)構(gòu)(有懸掛吊車)
- 大學(xué)生創(chuàng)業(yè)計劃書word文檔(三篇)
- 2022年湖南省事業(yè)編制招聘考試《計算機專業(yè)基礎(chǔ)知識》真題試卷【1000題】
- 幼兒園教育科研:園本生活經(jīng)驗課之“食”主題課程開發(fā)與實施案例
- 全自動量熱儀說明書
- MT 194-1989煤礦用巷道支架試驗方法與型式檢驗規(guī)范
評論
0/150
提交評論