已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux 平臺(tái)下基于 C 的貪食蛇游戲設(shè)計(jì)與實(shí)現(xiàn) 姓 名 系 別、 專 業(yè) 導(dǎo) 師 姓 名、職 稱 完 成 時(shí) 間 目 錄 摘 要 . I ABSTRACT . II 緒 論 . 1 1.1 論文選題依據(jù) . 1 1.2 貪食蛇游戲選題背景 . 1 1.3 貪食蛇設(shè)計(jì)概述 . 1 平臺(tái)簡(jiǎn)介 . 2 2.1 系統(tǒng)介紹 . 2 2.1.2 Linux 系統(tǒng)的主要特點(diǎn) . 2 2.1.3 LINUX 的組成 . 2 2.2 開發(fā)工具 . 3 2.2.1 C語言簡(jiǎn)介 . 3 2.2.2 GTK簡(jiǎn)介 . 3 2.2.3 Linux 編譯工具 GCC簡(jiǎn)介 . 4 2.3 GTK環(huán)境的搭建 . 4 3 系統(tǒng)分析 . 5 3.1 可行性分析 . 5 3.1.1 技術(shù)可行性 . 5 3.1.2 經(jīng)濟(jì)可行性 . 5 3.1.3 操作可行性 . 5 3.2 需求分析 . 5 3.2.1 功能要求 . 5 3.2.2 性能要求 . 6 3.2.3 運(yùn)行要求 . 6 4 系統(tǒng)概要設(shè)計(jì) . 6 4.1 程序初始化 . 6 4.2 程序流程 . 6 4.2.1 系統(tǒng)模塊 . 6 4.2.2 系統(tǒng)流程 . 6 5 系統(tǒng)詳細(xì)設(shè)計(jì) . 8 5.1 系統(tǒng)界面 . 8 5.2 對(duì)象模型設(shè)計(jì) . 11 5.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn) . 12 5.4 游戲運(yùn)行中的設(shè)計(jì)思路 . 12 5.5 游戲規(guī)則 . 13 5.6 游戲?qū)崿F(xiàn)以及其代碼 . 13 5.6.1 蛇移動(dòng)的實(shí)現(xiàn) . 13 5.6.2 蛇死亡的判斷 . 14 5.6.3 蛇到達(dá)邊框時(shí)從另一端出現(xiàn)和傳送的實(shí)現(xiàn) . 14 6 貪食蛇 AI 的算法設(shè)計(jì) . 15 6.1 蛇自己尋找食物的算法設(shè)計(jì) . 15 6.1.1 貪心算法 . 15 6.1.2 利用貪心算法實(shí)現(xiàn)最短路徑的選擇 . 16 6.2 蛇避開吃到自己身體的算法設(shè)計(jì) . 17 6.3 地圖 2 需要新增的一些判斷 . 18 7 調(diào)試以及測(cè)試結(jié)果分析 . 19 7.1 系統(tǒng)測(cè)試 . 20 7.2 在軟件的測(cè)試過程中發(fā)現(xiàn)的幾個(gè)小問題 . 20 7.3 系統(tǒng)需要的改進(jìn)與提高 . 21 結(jié)束語 . 22 參考文獻(xiàn) . 23 致 謝 . 錯(cuò)誤 !未定義書簽。 附 錄 . 24 I 摘 要 貪食蛇游戲操作簡(jiǎn)單方便,老少皆宜,是一款不錯(cuò)的小游戲。而 Linux挾其價(jià)格低廉、品質(zhì)良好與穩(wěn)定的優(yōu)勢(shì),正吸引著眾多以 PC為主工作、學(xué)習(xí)和娛樂的人們。 基于 Linux平臺(tái)下的貪食蛇游戲采用的 Linux底下 C語言和 GTK圖形化編程工具編寫,操作簡(jiǎn)單。玩家首先進(jìn)入游戲,在游戲中可以對(duì)游戲進(jìn)行暫停、退出等操作,還加入了雙人對(duì)戰(zhàn)模式,豐富了 游戲,增大游戲的娛樂性。 本文分幾部分闡述了基于 Linux下的貪食蛇游戲的開發(fā)過程,分章節(jié)較詳細(xì)的介紹了游戲的結(jié)構(gòu)和設(shè)計(jì)實(shí)現(xiàn)過程,并詳細(xì)畫出了系統(tǒng)流程圖,還詳細(xì)介紹了各個(gè)功能完成相關(guān)技術(shù),寫出了調(diào)試以及測(cè)試結(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 挾其價(jià)格低廉、品質(zhì)良好與穩(wěn)定的競(jìng)爭(zhēng)優(yōu)勢(shì),正無形無影地吸引眾多以 PC為 主工作平臺(tái)上的人們。隨著科學(xué)技術(shù)日新月異的發(fā)展, Linux 提供了更多圖形接口的桌面操作環(huán)境和應(yīng)用軟件,操作更加簡(jiǎn)單方便。 Linux 是源代碼開放的操作系統(tǒng),是當(dāng)今優(yōu)秀的操作系統(tǒng)之一。標(biāo)準(zhǔn) Linux經(jīng)過小型化裁剪之后的專用 Linux操作系統(tǒng)即嵌入式 Linux,已成為當(dāng)今的一大熱點(diǎn),它能夠固化于容量只有幾 KB或者幾 MB的存儲(chǔ)器芯片或者單片機(jī)中,適合于特定嵌入式場(chǎng)合,目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約一半的系統(tǒng)使用嵌入式 Linux。嵌入式 Linux得到眾廠商的青睞,在工程實(shí)踐中應(yīng)用也十分廣泛,我校的嵌入式系統(tǒng)課程 同樣也采用嵌入式 Linux進(jìn)行教學(xué)工作,因此,此次游戲設(shè)計(jì)環(huán)境也采用 Linux系統(tǒng)。 Linux內(nèi)核的大部分代碼是由 C語言編寫的, Linux應(yīng)用程序也多由 C語言編寫 【 1】 。C 語言是結(jié)構(gòu)化、模式化的語言,程序可移植性好,運(yùn)算符豐富、代碼效率高,它兼有匯編語言和高級(jí)語言的優(yōu)點(diǎn),既適合于開發(fā)系統(tǒng)軟件,也適合于編寫應(yīng)用程序,被廣泛應(yīng)用于事務(wù)處理、科學(xué)計(jì)算、工業(yè)控制、數(shù)據(jù)庫技術(shù)等領(lǐng)域。此次設(shè)計(jì)語言環(huán)境也選用 C語言。 GTK 是 Linux 平臺(tái)下比較好的一個(gè) C 語言圖形開發(fā)工具,所以本次也選擇了 GTK圖形開發(fā)工具。 1.2 貪食蛇游戲選題背景 隨著經(jīng)濟(jì)的快速發(fā)展,人們生活的步調(diào)日益加快,計(jì)算機(jī)的地位在人們的生活中已日益突出,基于各種操作系統(tǒng)的娛樂游戲也越來越多、越來越大眾化,成為人們生活中必不可少的一部分。而隨著人們生活品質(zhì)的提高,電腦游戲也越來越多元化,貪食蛇就是其中一種。貪吃蛇這一游戲簡(jiǎn)單易行,操作方便,娛樂性較強(qiáng),吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡(jiǎn)單,卻起樂無窮,貪食蛇游戲操作簡(jiǎn)單方便,老少皆宜,是一款不錯(cuò)的小游戲 ,而實(shí)現(xiàn)二人對(duì)戰(zhàn)使游戲更具新意也更有趣。 該游戲給人們帶來了追逐的快感,以及成 功后的滿足感,對(duì)于一直處于高壓下的現(xiàn)代人是很好的放松工具。 1.3 貪食蛇設(shè)計(jì)概述 該游戲主要功能包括:選擇玩家人數(shù)與游戲模式、選擇游戲地圖、開始游戲、暫 2 停游戲、退出游戲等。 選擇玩家人數(shù):玩家可以選擇單人模式、雙人對(duì)戰(zhàn)模式和人機(jī)對(duì)戰(zhàn)模式進(jìn)入游戲。 選擇游戲地圖:玩家可以選擇玩哪個(gè)地圖,暫時(shí)有 2個(gè)地圖供選擇,每一個(gè)地圖將會(huì)有不同的墻壁和不同的傳送點(diǎn)。 開始游戲:玩家 1通過方向鍵,玩家 2 通過 W S D A鍵,使蛇改變向去吃食,每吃一個(gè)食物蛇身加長,分?jǐn)?shù)加 1。每局 300 秒。 暫停游戲:點(diǎn)擊暫停按鈕暫停游戲,點(diǎn)擊繼續(xù)按鈕繼續(xù)游戲。 退出游戲:點(diǎn)擊退出按鈕退出游戲。 平臺(tái)簡(jiǎn)介 2.1 系統(tǒng)介紹 2.1.1 Linux 簡(jiǎn)介 Linux是一套免費(fèi)使用和自由傳播的類 Unix操作系統(tǒng),它主要用于基于 x86系列CPU 的計(jì)算機(jī)上。這個(gè)系統(tǒng)是由世界各地的成千上萬的程序員設(shè)計(jì)和實(shí)現(xiàn)的。其目的是建立不受任何商品化軟件的版權(quán)制約的、全世界都能自由使用的 Unix兼容產(chǎn)品 【 2】 。 2.1.2 Linux 系統(tǒng)的主要特點(diǎn) Linux操作系統(tǒng)作為當(dāng)今主要的操作系統(tǒng)之一具有以下這些特點(diǎn): (1)開放性 (2)多用戶 (3)多任務(wù) (4)良好的用戶界面 (5)設(shè)備獨(dú)立性 (6)提供了豐富的網(wǎng)絡(luò)功能 (7)可靠的安全系統(tǒng) (8)良好的可移植性 2.1.3 LINUX 的組成 LINUX的內(nèi)核:內(nèi)核是系統(tǒng)的核心,是運(yùn)行程序和管理 像磁盤和打印機(jī)等硬件設(shè)備的核心程序。 LINUX SHELL: Shell 是系統(tǒng)的用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種接口。 LINUX 文件系統(tǒng) : Linux 文件系統(tǒng)是文件存放在磁盤等存儲(chǔ)設(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 平臺(tái)下開發(fā)而Linux的內(nèi)核主要是由 C語言編寫的,所以 C 語言在 Linux下的軟件開發(fā)具有獨(dú)到的優(yōu)勢(shì) 【 4】 。由于考慮到游戲開發(fā)需要一個(gè)良好的界面,終端程序顯然無法達(dá)到 要求。于是 GTK圖形化編程工具就成了必然的選擇。下面將簡(jiǎn)要介紹本次貪食蛇游戲開發(fā)所要用到的主要工具。 2.2.1 C 語言簡(jiǎn)介 C 語言是目前世界上流行、使用最廣泛的高級(jí)程序設(shè)計(jì)語言。 C 語言對(duì)操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用 C語言明顯優(yōu)于其它高級(jí)語言,許多大型應(yīng)用軟件都是用 C語言編寫的。 C 語言具有繪圖能力強(qiáng),可移植性,并具備很強(qiáng)的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動(dòng)畫它是數(shù)值計(jì)算的高級(jí)語言 【 4】 。 C語言的特點(diǎn)有: (1)簡(jiǎn)潔緊湊、靈活方便。 (2) 運(yùn)算符豐 富。 (3) 數(shù)據(jù)結(jié)構(gòu)豐富。 (4) C是結(jié)構(gòu)式語言。 (5) C語法限制不太嚴(yán)格、程序設(shè)計(jì)自由度大。 (6) C語言允許直接訪問物理地址,可以直接對(duì)硬件進(jìn)行操作。 (7) C語言程序生成代碼質(zhì)量高,程序執(zhí)行效率高。 (8) C語言適用范圍大,可移植性好 【 5】 。 2.2.2 GTK 簡(jiǎn)介 GTK(GIMP Toolkit)是一套跨多種平臺(tái)的圖形工具包 ,按 LGPL 許可協(xié)議發(fā)布的。雖然最初是為 GIMP 寫的,但目前已發(fā)展為一個(gè)功能強(qiáng)大、設(shè)計(jì)靈活的一個(gè)通用圖形庫。特別是被 GNOME 選中使得 GTK+廣為流傳,成為 Linux下開發(fā)圖形界面的應(yīng)用程序的主流開發(fā)工具之一,當(dāng)然 GTK+并不要求必須在 Linux 上,事實(shí)上,目前 GTK+已經(jīng)有了成功的 windows 版本。 GTK雖然是用 C語言寫的,但是您可以使用你熟悉的語言來使用 GTK,因?yàn)?GTK+已經(jīng)被綁定到幾乎所有流行的語言上,如: C+,PHP, Guile, Perl, Python, TOM, Ada95, 4 Objective C, Free Pascal, and Eiffel【 6】 。 GTK的一個(gè)簡(jiǎn)單例子如下: 該例子產(chǎn)生一個(gè)窗口。它不能 自己退出,只能通過 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)建一個(gè)新的窗口 */ gtk_widget_show (window); /*顯示窗口 */ gtk_main (); /*進(jìn)入睡眠狀態(tài),等待事件激活 */ return(0); 從上面的程序可以看出, GTK是一個(gè)事件驅(qū)動(dòng)工具包,當(dāng)它運(yùn)行到 gtk_main()函數(shù)時(shí)會(huì)自動(dòng)睡眠,直到有事件發(fā)生,控制權(quán)轉(zhuǎn)讓給相應(yīng)的函數(shù)調(diào)用,在該函數(shù)中可以用標(biāo)準(zhǔn) C寫出相應(yīng)的事物邏輯。這與 windows 上的程序處理是一樣的。 2.2.3 Linux 編譯工具 GCC 簡(jiǎn)介 GCC是一個(gè)用于 linux系統(tǒng)下編程的編譯器。 GCC=GNU Compiler Collection,是由 Stallman所開發(fā)的 linux下的編譯器,可以編譯的語言包括: C, C+, Objective-C, Fortran, Java,Ada 等。不過,現(xiàn)在 GCC也有了許多 Win32下的移植版本。如今的 GCC借助于他的特性,具有了交叉編譯器的功能,即在一個(gè)平臺(tái)下編譯另一個(gè)平臺(tái)的代碼。 2.3 GTK 環(huán)境的搭建 我們以 Linux 系統(tǒng) Ubuntu 為例簡(jiǎn)要介紹 GTK 環(huán)境的搭建, Ubuntu 桌面環(huán)境是gnome。 gnome 就是使用 GTK+編寫,所以運(yùn)行環(huán)境不需要另外配置了,要做的是安裝開發(fā) 所需要的環(huán)境。 剛安裝好的 Ubuntu 已經(jīng)默認(rèn)安裝了 gcc,但是并沒有安裝所需要的頭文件,我們需要手動(dòng)添加,使用命令: sudo apt-get install build-essential 然后再安裝 gnome 開發(fā)包,使用命令: sudo apt-get install gnome-core-devel 系統(tǒng)會(huì)自動(dòng)找到所依賴的庫,并一起下載下來。 5 這樣安裝過后使用下面的命令編譯上面的代碼: gcc main.c -o main pkg-config -cflags -libs gtk+-2.0 注意,這里的 是鍵盤上 1左面的反引號(hào),不是單引號(hào)。 KDE桌面配置 GTK,步驟也類似,但是需要先安裝 GTK的運(yùn)行環(huán)境。 本次開發(fā)所使用 的 操作系統(tǒng)平臺(tái)是 Fedora 12 完整版 安裝時(shí)選擇安裝 GTK 開發(fā)工具與 gnome桌面,因此當(dāng)系統(tǒng)完成安裝所有 GTK的運(yùn)行和開發(fā)環(huán)境就已搭建好。 3 系統(tǒng)分析 3.1 可行性分析 3.1.1 技術(shù)可行性 本系統(tǒng)的設(shè)計(jì)要求是一個(gè)能在 Linux操作系統(tǒng)下運(yùn)行且界面美觀運(yùn)行穩(wěn)定且將來可能用于嵌入式移植的系統(tǒng)。綜合考慮選擇 C 語言與 GTK技 術(shù)來實(shí)現(xiàn)本系統(tǒng)。 C語言是一門成熟的高級(jí)語言,可用于開發(fā)各種系統(tǒng),也可用于開發(fā)游戲系統(tǒng) 【 7】 。同時(shí) C 語言也擁有相當(dāng)多的技術(shù)人員。 GTK是 Linux 下的一個(gè)圖形化編程工具,其開發(fā)出來的程序能在裝有 GTK 環(huán)境的 Linux系統(tǒng)下順利運(yùn)行??梢哉f在技術(shù)方面開發(fā)此系統(tǒng)不會(huì)有什么問題。 3.1.2 經(jīng)濟(jì)可行性 隨著手機(jī)和電腦的普及 ,這樣的小游戲也將隨著普及因此其需求也將不斷上升 ,而由于技術(shù)的成熟與為數(shù)眾多的開發(fā)人員使得此系統(tǒng)的開發(fā)并不困難,再者此系統(tǒng)運(yùn)行的平臺(tái) Linux操作系統(tǒng)是開源和免費(fèi)的,所以開發(fā)此系統(tǒng)的成 本并不會(huì)很高。因此此系統(tǒng)具有相當(dāng)?shù)慕?jīng)濟(jì)利益,到時(shí)候我們也可以靜觀其成 . 3.1.3 操作可行性 本系統(tǒng)是一個(gè)簡(jiǎn)單的單機(jī)游戲系統(tǒng),對(duì)于這樣一個(gè)系統(tǒng) ,其操作只需要使用簡(jiǎn)單的幾個(gè)按鍵和鼠標(biāo)點(diǎn)擊按鈕就可以實(shí)現(xiàn),因此本系統(tǒng)的操作簡(jiǎn)單易記,可以說一看就會(huì)的,系統(tǒng)在操作上是不會(huì)存在問題的 ,本系統(tǒng)需要在 Linux 操作系統(tǒng)下運(yùn)行,而用戶也可以在其受益不淺 . 3.2 需求分析 3.2.1 功能要求 本系統(tǒng)是一個(gè)簡(jiǎn)單的單機(jī)游戲,其功能要求實(shí)現(xiàn)單人游戲模式、雙人對(duì)戰(zhàn)模式和人機(jī)對(duì)戰(zhàn)模式以提高游戲的可玩性,系統(tǒng)默認(rèn)模式為單人模式 ,通過點(diǎn)擊按鈕選擇不同游戲模式進(jìn)行游戲。系統(tǒng)還要求實(shí)現(xiàn)至少 2個(gè)不同地圖的選擇,以提高游戲的趣味 6 與豐富性。單人模式時(shí)只有玩家 1通過上下左右鍵來控制蛇的方向,在規(guī)定時(shí)間內(nèi)盡量多吃食物,雙人模式時(shí)增加的玩家 2可以通過 W,S,A,D來控制蛇的移動(dòng)方向,通過雙人競(jìng)技比較誰吃的食物最多,人機(jī)對(duì)戰(zhàn)是在只有一個(gè)人的情況下可以與電腦進(jìn)行對(duì)戰(zhàn)。游戲中要實(shí)現(xiàn)暫停與退出和關(guān)于幫助文檔。 3.2.2 性能要求 游戲操作要求簡(jiǎn)單易行,游戲過程中畫面移動(dòng)要流暢,通過鍵盤對(duì)蛇移動(dòng)方向控制時(shí)無明顯延遲,由于本系統(tǒng)將來有可能在嵌入式 Linux上移植,而嵌入式系統(tǒng)一般存儲(chǔ)較小,處理器的處理速度也不是很快,因此本系統(tǒng)對(duì)內(nèi)存和處理器的使用的要求都要盡可能的小。 3.2.3 運(yùn)行要求 本系統(tǒng)由于要使用到 GTK圖形化編程工具,而圖形化編程工具 GTK開發(fā)出來的程序需要有 GTK環(huán)境才能運(yùn)行,由于是用 C語言實(shí)現(xiàn),因此系統(tǒng)對(duì)硬件的要求并不是很高。所以本系統(tǒng)的運(yùn)行要求是搭建有 GTK環(huán)境或是安裝 gnome桌面環(huán)境的 Linux操作系統(tǒng)。 4 系統(tǒng)概要設(shè)計(jì) 4.1 程序初始化 程序初始化主要由初始化函數(shù) init_game()在游戲開始時(shí)對(duì)各變量進(jìn) 行初始化賦值。每次重新游戲時(shí),得分將清零,游戲時(shí)間重設(shè)為 300 秒,蛇的長度與位置恢復(fù)為初始狀態(tài),但游戲模式與游戲的地圖將不變,需要玩家自己選擇才會(huì)發(fā)生改變 游戲的初始化流程如圖 4.1 所示。 4.2 程序流程 4.2.1 系統(tǒng)模塊 本系統(tǒng)分為:圖形初始化 gtk_init()與游戲初始化 game_init()模塊、圖形界面設(shè)計(jì) create_window()與地圖設(shè)計(jì) draw_map()模塊、模式選擇 cb_choose()模塊、游戲 play_game()模塊、成績輸出模塊、電腦 AI模塊、游戲退出模塊、游戲中蛇通過判 斷是否撞墻或吃到自己來判斷蛇的死亡。 程序模塊如圖 4.2所示。 4.2.2 系統(tǒng)流程 本系統(tǒng)流程:當(dāng)用戶打開系統(tǒng),系統(tǒng)首先對(duì)各參數(shù)進(jìn)行初始化設(shè)定,當(dāng)玩家點(diǎn)擊“開始”時(shí)開始游戲,用戶通過方向鍵進(jìn)行游戲,游戲過程中 如果蛇死亡或游戲 7 時(shí)間完則停止游戲并顯示分?jǐn)?shù)與結(jié)束信息,當(dāng)玩家選擇從新開始時(shí)游戲進(jìn)行初始化設(shè)定,當(dāng)玩家選擇退出時(shí)退出游戲。 游戲流程如圖 4.3所示。 圖 4.1 程序初始化流程圖 圖 4.2 游戲模塊圖 8 圖 4.3 游戲流程圖 5 系統(tǒng)詳細(xì)設(shè)計(jì) 5.1 系統(tǒng)界面 用戶界面是現(xiàn)代軟件重要的組成部分,界面的好壞對(duì)于游戲軟件來說也相當(dāng)?shù)闹匾驗(yàn)橐粋€(gè)用戶友好的界面能讓玩家在游戲過程中感覺更舒心,而一個(gè)不友好的界面將使游戲的品質(zhì)大打折扣。 本系統(tǒng)界面的設(shè)計(jì)遵循如下的指導(dǎo)規(guī)則: 1 讓用戶駕馭軟件,而不是軟件駕馭用戶。 2 盡可能減少用戶的記性。 3 保持界面的一致性 【 8】 。 本游戲的界面設(shè)計(jì)如圖 5.1所示。 9 圖 5.1 游戲界面的設(shè)計(jì) 此系統(tǒng)界面設(shè)計(jì)簡(jiǎn)約而不簡(jiǎn)單,用戶使用此系統(tǒng)時(shí)能夠很容易記住方便玩家使用,因此不會(huì)讓人感覺復(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è)計(jì)部分。 通過 draw=gtk_drawing_area_new();創(chuàng)建游戲區(qū)域窗口。 (3)游戲開始界面如圖 5.2 所示。 在打開系統(tǒng)時(shí),游戲區(qū)顯示一張歡迎界面的圖片。 用 pixbuf = gdk_pixbuf_new_from_file (./test.jpg,NULL);將文件名為 test.jpg的圖片添加進(jìn)游戲區(qū)并設(shè)為背景 。 (4)信息顯示區(qū):主要顯示游戲過程中的各種信息,如時(shí)間和得分等。 gtk_label_new()函數(shù)用于顯示游戲分?jǐn)?shù)等信息。 信息顯示區(qū)如圖 5.3所示。 (5)按鈕區(qū):主要顯示游戲中需要點(diǎn)擊選擇的按鈕。 通過 gtk_button_new_with_label() 函數(shù)創(chuàng)建按鈕。 按鈕布局如圖 5.4所示。 (6)通過 gtk_fixed_new()創(chuàng)建一個(gè)名叫 fixed 的固定容器,然后將游戲顯示區(qū) draw、信息顯示和按鈕添加進(jìn) fixed,最后把 fixed 容器添加進(jìn) window 主窗口,最后通過gtk_widget_show_all(window)函數(shù)將其顯示出來。 圖 5.2 游戲開始界面設(shè)計(jì) 11 圖 5.3 游戲信息顯示區(qū) 圖 5.4 系統(tǒng)按鈕布局 5.2 對(duì)象模型設(shè)計(jì) 在本系統(tǒng)中對(duì)象模型的設(shè)計(jì)主要是蛇的設(shè)計(jì),食物的設(shè)計(jì),和地圖的設(shè)計(jì)。 蛇的設(shè)計(jì)主要是通過 2 個(gè)畫圓函數(shù) gdk_draw_arc()畫出蛇的每一個(gè)結(jié)點(diǎn)同時(shí)設(shè)定顏色。而食物也是通過畫圓函數(shù)畫出。地圖中的傳送點(diǎn)和墻體是通過畫方格函數(shù)gdk_draw_rectangle()畫出。 圖 5.5中 就是蛇, 即是食物,褐色長方形即使墻的設(shè)計(jì), 是傳送點(diǎn)。 圖 5.5 地圖二的設(shè)計(jì) 12 圖 5.6 地圖一的設(shè)計(jì) 5.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn) 蛇狀態(tài)的初始化是由定義蛇結(jié)構(gòu)體時(shí)初始化決定的,每一次開始蛇的長度,出現(xiàn)位置和移動(dòng)方向都是一樣的,它們長度都為 6 個(gè)結(jié)點(diǎn),方向都向右,蛇 1 初始位置是( 3, 3),蛇 2 初始位置是( 3, 30)。 無論是在游戲的開始還是進(jìn)行中,食物都是隨機(jī)出現(xiàn)的,通過 rand()隨機(jī)數(shù)產(chǎn)生函數(shù)隨機(jī)產(chǎn)生食物出現(xiàn)的坐標(biāo),在產(chǎn)生的隨機(jī)坐標(biāo)上畫出食物。 5.4 游戲運(yùn)行中的設(shè)計(jì)思路 游戲中蛇的運(yùn)動(dòng)是靠通過對(duì)畫面的不斷清除與重畫而實(shí)現(xiàn)的,每一次運(yùn)動(dòng)時(shí)先用背景色擦除掉原有蛇的圖像,再將蛇畫在其新出現(xiàn)的位置,由于每一次擦除與重畫間隔的時(shí)間 非常短,利用人的視覺暫留性,讓蛇看上去就像在連續(xù)不斷的運(yùn)動(dòng)。而食物未被吃前,傳送點(diǎn)和墻體被擦除后重畫的位置與原來一樣,所以讓人感覺其并沒有變化。 蛇身的移動(dòng)與運(yùn)動(dòng)方向主要是受頭結(jié)點(diǎn)控制,因?yàn)樯呙恳淮芜\(yùn)動(dòng)就是靠后一結(jié)點(diǎn)畫在前一結(jié)點(diǎn)的位置上來實(shí)現(xiàn)的,所以對(duì)蛇的控制主要是對(duì)頭結(jié)點(diǎn)的控制。 蛇 1 通過上下左右鍵,蛇 2 通過 W、 S、 A、 D 鍵來控制蛇的移動(dòng)方向 游戲中蛇運(yùn)動(dòng)速度的快慢主要是通過設(shè)置畫面重畫頻率來實(shí)現(xiàn)的,而具體實(shí)現(xiàn)是通過對(duì)函數(shù)的調(diào)用頻率, GTK 中用函數(shù) g_timeout_add ()來實(shí)現(xiàn)對(duì)函數(shù)的定時(shí)調(diào) 13 用。 游戲暫停則是通過 g_source_remove()函數(shù)中止對(duì)蛇運(yùn)行函數(shù)的定時(shí)調(diào)用。通過g_timeout_add()來實(shí)現(xiàn)游戲的繼續(xù)。 設(shè)計(jì)了傳送點(diǎn)和墻體來增加游戲的復(fù)雜性與可玩性 5.5 游戲規(guī)則 1 單人模式 單人模式的規(guī)則比較簡(jiǎn)單,只要在規(guī)定的時(shí)間內(nèi)不死亡和盡量得分最多即可。蛇撞墻或自己身體時(shí)即死亡,當(dāng)蛇進(jìn)入傳送點(diǎn)時(shí)將從另一特定位置出來。 2 雙人競(jìng)技模式 蛇進(jìn)入傳送點(diǎn)時(shí)將從另一特定位置出來,規(guī)定時(shí)間內(nèi)蛇沒死亡得分最多者贏,得分相等為平局,游戲中撞墻或自己身體死亡者輸。兩條蛇可以互相穿透。 3人機(jī)對(duì)戰(zhàn) 模式 當(dāng)用戶選擇此模式時(shí)將于電腦控制的蛇進(jìn)行競(jìng)技,此模式規(guī)則與雙人對(duì)戰(zhàn)模式一樣。 5.6 游戲?qū)崿F(xiàn)以及其代碼 5.6.1 蛇移動(dòng)的實(shí)現(xiàn) 蛇的移動(dòng)方向主要受頭結(jié)點(diǎn)控制,所以每次畫蛇時(shí)只要把前一結(jié)點(diǎn)的值賦給后一節(jié)點(diǎn)即可。 當(dāng)蛇頭的移動(dòng)方向向右時(shí), y 值不變 x 的值不斷增加。 當(dāng)蛇頭的移動(dòng)方向向左時(shí), y 值不變 x 的值不斷減少。 當(dāng)蛇頭的移動(dòng)方向向下時(shí), y 值增加 x 的值不變。 當(dāng)蛇頭的移動(dòng)方向向上時(shí), y 值減小 x 的值不變。 畫蛇和蛇移動(dòng)代碼如下: /蛇身體節(jié)點(diǎn)位置的賦值 gint i; for (i=snake.node;i0;i-) snake.xi= snake.xi-1; snake.yi= snake.yi-1; /蛇移動(dòng)的實(shí)現(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)蛇頭的值與蛇身或與墻的值相等時(shí),蛇即算死亡,代碼如下: 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á)邊框時(shí)從另一端出現(xiàn)和傳送的實(shí)現(xiàn) 當(dāng)蛇頭的 x或 y值達(dá)到邊框的最大或最小位置時(shí)相應(yīng)的給 x或 y賦以邊框的最小或最大值以實(shí)現(xiàn)當(dāng)蛇到達(dá)邊框時(shí)能從另一端出來,同理當(dāng)蛇頭的 x, y 值等于傳送點(diǎn)位置的值時(shí)將蛇頭 x, y 的值賦以被傳送到位置的值,這樣將實(shí)現(xiàn)蛇的傳送功能。 部分代碼實(shí)現(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á)傳送點(diǎn)的處理 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è)計(jì) 本游戲設(shè)計(jì)了人機(jī)對(duì)戰(zhàn)模式,因此電腦貪食蛇的實(shí)現(xiàn)就必須用到人工智能也就是AI,下面將詳細(xì)介紹實(shí)現(xiàn) AI的算法設(shè)計(jì)。 6.1 蛇自己尋找食物的算法設(shè)計(jì) 此部分的算法設(shè)計(jì)是蛇 AI 設(shè)計(jì)的最主要也是最基本的部分。在系統(tǒng)中電腦蛇主要通過搜尋最短路徑來尋找食物,而最短路徑的搜索可以通過很多算法來實(shí)現(xiàn),本系統(tǒng)主要是通過尋找局部最優(yōu)解的方法來搜索蛇到食物的最短路徑,而其中有一個(gè)貪心算法符合此部分的設(shè)計(jì)。 6.1.1 貪心算法 所謂貪心算法是 指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解。 貪心算法不是對(duì)所有問題都能得到整體最優(yōu)解,但對(duì)范圍相當(dāng)廣泛的許多問題他能產(chǎn)生整體最優(yōu)解或者是整體最優(yōu)解的近似解。 貪心算法的基本思路如下: (1)建立數(shù)學(xué)模型來描述問題。 (2)把求解的問題分成若干個(gè)子問題。 (3)對(duì)每一子問題求解,得到子問題的局部最優(yōu)解。 (4)把子問題的解局部最優(yōu)解合成原來解問題的一個(gè)解。 實(shí)現(xiàn)該算法的過程: 從問題的某一初始解 出發(fā); while 能朝給定總目標(biāo)前進(jìn)一步 do 16 求出可行解的一個(gè)解元素; 由所有解元素組合成問題的一個(gè)可行解。 6.1.2 利用貪心算法實(shí)現(xiàn)最短路徑的選擇 本系統(tǒng)中蛇主要是通過頭結(jié)點(diǎn)的移動(dòng)來控制蛇的移動(dòng),因此電腦蛇的移動(dòng)也主要是通過頭結(jié)點(diǎn)的的方向的選擇來控制蛇的移動(dòng)。 根據(jù)貪心算法得出最短路徑的步驟: (1)選擇一組解即在蛇頭結(jié)點(diǎn)有可能移動(dòng)的四個(gè)方向,每個(gè)方向選出一個(gè)點(diǎn)用于挑選最優(yōu)解。 (2)挑選出來的四個(gè)點(diǎn)依次計(jì)算出其與食物的距離,然后進(jìn)行比較。 (3)選出離食物最近的一個(gè)點(diǎn)。 (4)把蛇 頭結(jié)點(diǎn)移動(dòng)的方向設(shè)為移動(dòng)到挑選出來離食物距離最近點(diǎn)的方向。 (5)移動(dòng)到下一點(diǎn)后又從第 1步執(zhí)行,直到最后得到最優(yōu)解為止。 求可行解(第 2步)示意圖如下: 圖 6.1 求可行解示意圖 計(jì)算距離通過比較選出最短距離然后選擇蛇移動(dòng)方向的實(shí)現(xiàn)代碼如下,其中要考慮到選出來的四個(gè)點(diǎn)中有一個(gè)是被蛇身體所占據(jù),蛇是不能往哪個(gè)方向移動(dòng)的,因此要把這一情況排除。 算法實(shí)現(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; /計(jì)算與食物的距離 d1=a1*a1+b*b; d2=a2*a2+b*b; d3=b3*b3+a*a; d4=b4*b4+a*a; /選擇最短距離的點(diǎn)后得到方向 if(d130&snake2.x030&snake2.dir!=4) snake2.dir=3; if(snake2.y0=3&snake2.dir!=2) snake2.dir=1; 此地圖還需要考慮墻的存在,當(dāng)蛇頭到達(dá)墻時(shí)必須改變方向避開它,否則將撞墻死亡。 實(shí)現(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)蛇從一個(gè)區(qū)域到達(dá)另一區(qū)域的時(shí)候,有兩個(gè)出口可供選擇,這個(gè)時(shí)候蛇將選擇離食物最近的那個(gè)出口出現(xiàn)。兩個(gè)出口是上下分布的,因此只用判斷食物所在坐標(biāo)的y 值即可。 因?yàn)橛螒騾^(qū)域 y 的大小是從 0 到 50,所以當(dāng) y 值小于等于 25 時(shí)從上面出口出現(xiàn),當(dāng) y值大于 25時(shí)從下面出口出現(xiàn)。 部分實(shí)現(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;/*蛇移動(dòng)方向 :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è)計(jì) 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)游戲時(shí)間完得分多者贏 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全員安全生產(chǎn)培訓(xùn)新聞稿課件
- 全員安全培訓(xùn)總結(jié)課件
- 古建筑設(shè)計(jì)行業(yè)前景
- 消防安全建議與做法
- 高分子材料職業(yè)前景
- 防爆柜消防安全檢查規(guī)范
- 安全生產(chǎn)管理思路模板講解
- 克隆技術(shù)的過去
- 漫畫視角下的醫(yī)患關(guān)系
- 高質(zhì)量醫(yī)患關(guān)系文案創(chuàng)作
- 2026課件-人工智能通識(shí) 教案 模塊四-教學(xué)設(shè)計(jì)-人工智能通識(shí)-新版
- 加油站合伙合同協(xié)議書范本
- 細(xì)胞治療課件
- 人教版八年級(jí)下冊(cè)數(shù)學(xué)期末試卷測(cè)試卷(含答案解析)
- 2025年電商財(cái)務(wù)統(tǒng)一管理方案報(bào)告-帆軟
- 貴州興義電力發(fā)展有限公司2026年校園招聘?jìng)淇碱}庫及一套參考答案詳解
- 2025年天津大學(xué)管理崗位集中招聘15人備考題庫完整答案詳解
- 門店關(guān)閉清算協(xié)議書
- 2025內(nèi)蒙古鄂爾多斯市鄂托克旗招聘專職社區(qū)人員30人考試筆試備考試題及答案解析
- 三方協(xié)議模板合同
- 2026年元旦校長寄語:向光而行馬到新程
評(píng)論
0/150
提交評(píng)論