畢業(yè)設(shè)計(論文)Linux平臺下基于C的貪食蛇游戲設(shè)計與實現(xiàn)_第1頁
畢業(yè)設(shè)計(論文)Linux平臺下基于C的貪食蛇游戲設(shè)計與實現(xiàn)_第2頁
畢業(yè)設(shè)計(論文)Linux平臺下基于C的貪食蛇游戲設(shè)計與實現(xiàn)_第3頁
畢業(yè)設(shè)計(論文)Linux平臺下基于C的貪食蛇游戲設(shè)計與實現(xiàn)_第4頁
畢業(yè)設(shè)計(論文)Linux平臺下基于C的貪食蛇游戲設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、linux平臺下基于c的貪食蛇游戲設(shè)計與實現(xiàn) 姓 名 系 別、 專 業(yè) 導(dǎo) 師 姓 名、職 稱 完 成 時 間 目 錄摘 要iabstractii 緒 論11.1 論文選題依據(jù)11.2 貪食蛇游戲選題背景11.3 貪食蛇設(shè)計概述1 平臺簡介22.1 系統(tǒng)介紹22.1.2 linux系統(tǒng)的主要特點22.1.3 linux的組成22.2 開發(fā)工具32.2.1 c語言簡介32.2.2gtk簡介32.2.3 linux編譯工具gcc簡介42.3 gtk環(huán)境的搭建43 系統(tǒng)分析53.1 可行性分析53.1.1 技術(shù)可行性53.1.2 經(jīng)濟可行性53.1.3 操作可行性53.2 需求分析53.2.1 功能

2、要求53.2.2 性能要求63.2.3 運行要求64 系統(tǒng)概要設(shè)計64.1 程序初始化64.2程序流程64.2.1系統(tǒng)模塊64.2.2 系統(tǒng)流程65 系統(tǒng)詳細設(shè)計85.1 系統(tǒng)界面85.2 對象模型設(shè)計115.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn)125.4 游戲運行中的設(shè)計思路125.5 游戲規(guī)則135.6 游戲?qū)崿F(xiàn)以及其代碼135.6.1 蛇移動的實現(xiàn)135.6.2 蛇死亡的判斷145.6.3 蛇到達邊框時從另一端出現(xiàn)和傳送的實現(xiàn)146 貪食蛇ai的算法設(shè)計156.1 蛇自己尋找食物的算法設(shè)計156.1.1 貪心算法156.1.2 利用貪心算法實現(xiàn)最短路徑的選擇166.2 蛇避開吃到自己身體

3、的算法設(shè)計176.3 地圖2需要新增的一些判斷187 調(diào)試以及測試結(jié)果分析197.1 系統(tǒng)測試207.2 在軟件的測試過程中發(fā)現(xiàn)的幾個小問題207.3 系統(tǒng)需要的改進與提高21結(jié)束語22參考文獻23致 謝24附 錄25摘 要 貪食蛇游戲操作簡單方便,老少皆宜,是一款不錯的小游戲。而linux挾其價格低廉、品質(zhì)良好與穩(wěn)定的優(yōu)勢,正吸引著眾多以pc為主工作、學(xué)習(xí)和娛樂的人們。 基于linux平臺下的貪食蛇游戲采用的linux底下c語言和gtk圖形化編程工具編寫,操作簡單。玩家首先進入游戲,在游戲中可以對游戲進行暫停、退出等操作,還加入了雙人對戰(zhàn)模式,豐富了游戲,增大游戲的娛樂性。 本文分幾部分闡述

4、了基于linux下的貪食蛇游戲的開發(fā)過程,分章節(jié)較詳細的介紹了游戲的結(jié)構(gòu)和設(shè)計實現(xiàn)過程,并詳細畫出了系統(tǒng)流程圖,還詳細介紹了各個功能完成相關(guān)技術(shù),寫出了調(diào)試以及測試結(jié)果分析。 關(guān)鍵詞: gtk;linux操作系統(tǒng);貪食蛇游戲 abstractsnake 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 attract

5、ing 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 add

6、ed 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-secti

7、ons. 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 論文選題依據(jù)linux挾其價格低廉、品質(zhì)良好與穩(wěn)定的競爭優(yōu)勢,正無形無影地吸引眾多以pc為主工作平

8、臺上的人們。隨著科學(xué)技術(shù)日新月異的發(fā)展,linux提供了更多圖形接口的桌面操作環(huán)境和應(yīng)用軟件,操作更加簡單方便。linux是源代碼開放的操作系統(tǒng),是當今優(yōu)秀的操作系統(tǒng)之一。標準linux經(jīng)過小型化裁剪之后的專用linux操作系統(tǒng)即嵌入式linux,已成為當今的一大熱點,它能夠固化于容量只有幾kb或者幾mb的存儲器芯片或者單片機中,適合于特定嵌入式場合,目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約一半的系統(tǒng)使用嵌入式linux。嵌入式linux得到眾廠商的青睞,在工程實踐中應(yīng)用也十分廣泛,我校的嵌入式系統(tǒng)課程同樣也采用嵌入式linux進行教學(xué)工作,因此,此次游戲設(shè)計環(huán)境也采用linux系統(tǒng)。 linux

9、內(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)的娛樂游戲也越來越多、越來越大眾化,成為人們生活中必不可少的一部分。而

10、隨著人們生活品質(zhì)的提高,電腦游戲也越來越多元化,貪食蛇就是其中一種。貪吃蛇這一游戲簡單易行,操作方便,娛樂性較強,吸引了不少人。這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻起樂無窮,貪食蛇游戲操作簡單方便,老少皆宜,是一款不錯的小游戲,而實現(xiàn)二人對戰(zhàn)使游戲更具新意也更有趣。 該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現(xiàn)代人是很好的放松工具。1.3 貪食蛇設(shè)計概述該游戲主要功能包括:選擇玩家人數(shù)與游戲模式、選擇游戲地圖、開始游戲、暫停游戲、退出游戲等。 選擇玩家人數(shù):玩家可以選擇單人模式、雙人對戰(zhàn)模式和人機對戰(zhàn)模式進入游戲。 選擇游戲地圖:玩家可以選擇玩哪個地圖,暫

11、時有2個地圖供選擇,每一個地圖將會有不同的墻壁和不同的傳送點。 開始游戲:玩家1通過方向鍵,玩家2通過w s d a鍵,使蛇改變向去吃食,每吃一個食物蛇身加長,分數(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)的主要特點

12、linux操作系統(tǒ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)核進行交互操作的一種接口。 linux文件系統(tǒng): linux文件系統(tǒng)是文件存放在磁盤等存儲設(shè)備上的組織方法。linux能支持多種目前主流的文件系統(tǒng),如ext2、ext3、fat、vfat、iso9660、nfs

13、、smb等。 linux應(yīng)用系統(tǒng):標準的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ā)需要一個良好的界面,終端程序顯然無法達到要求。于是gtk圖形化編程工具就成了必然的選擇。下面將簡要介紹本次貪食蛇游戲開發(fā)所要用到的主要工具。2.2.1 c語言簡介 c語言是目前世界上流行、使用最廣泛的高級程序設(shè)計語言。

14、c語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進行操作的場合,用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語法限制不太嚴格、程序設(shè)計自由度大。 (6) c語言允許直接訪問物理地址,可以直接對硬件進行操作。 (7) c語言程序生成代碼質(zhì)量高,程序執(zhí)行效率高。 (8) c語言適用范圍大,可移植性好【5】。 2.2.2gtk簡

15、介 gtk(gimp toolkit)是一套跨多種平臺的圖形工具包,按lgpl許可協(xié)議發(fā)布的。雖然最初是為gimp寫的,但目前已發(fā)展為一個功能強大、設(shè)計靈活的一個通用圖形庫。特別是被gnome選中使得gtk+廣為流傳,成為linux下開發(fā)圖形界面的應(yīng)用程序的主流開發(fā)工具之一,當然gtk+并不要求必須在linux上,事實上,目前gtk+已經(jīng)有了成功的windows版本。 gtk雖然是用c語言寫的,但是您可以使用你熟悉的語言來使用gtk,因為gtk+已經(jīng)被綁定到幾乎所有流行的語言上,如:c+,php, guile, perl, python, tom, ada95, objective c, fr

16、ee pascal, and eiffel【6】。 gtk的一個簡單例子如下:該例子產(chǎn)生一個窗口。它不能自己退出,只能通過shell來殺死進程(調(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 ()

17、; /*進入睡眠狀態(tài),等待事件激活*/return(0); 從上面的程序可以看出,gtk是一個事件驅(qū)動工具包,當它運行到gtk_main()函數(shù)時會自動睡眠,直到有事件發(fā)生,控制權(quán)轉(zhuǎn)讓給相應(yīng)的函數(shù)調(diào)用,在該函數(shù)中可以用標準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也有了許

18、多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)默認安裝了gcc,但是并沒有安裝所需要的頭文件,我們需要手動添加,使用命令: sudo apt-get install build-essential然后再安裝gnome開發(fā)包,使用命令: sudo apt-get install gnome-

19、core-devel系統(tǒng)會自動找到所依賴的庫,并一起下載下來。這樣安裝過后使用下面的命令編譯上面的代碼: 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桌面,因此當系統(tǒng)完成安裝所有g(shù)tk的運行和開發(fā)環(huán)境就已搭建好。3 系統(tǒng)分析3.1 可行性分析3.1.1 技術(shù)可行性本系統(tǒng)的設(shè)計要求是一個能在linux操作系統(tǒng)下運行且界面美觀運

20、行穩(wěn)定且將來可能用于嵌入式移植的系統(tǒng)。綜合考慮選擇c語言與gtk技術(shù)來實現(xiàn)本系統(tǒng)。c語言是一門成熟的高級語言,可用于開發(fā)各種系統(tǒng),也可用于開發(fā)游戲系統(tǒng)【7】。同時c語言也擁有相當多的技術(shù)人員。gtk是linux下的一個圖形化編程工具,其開發(fā)出來的程序能在裝有g(shù)tk環(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)具有相當?shù)?/p>

21、經(jīng)濟利益,到時候我們也可以靜觀其成.3.1.3 操作可行性本系統(tǒng)是一個簡單的單機游戲系統(tǒng),對于這樣一個系統(tǒng),其操作只需要使用簡單的幾個按鍵和鼠標點擊按鈕就可以實現(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)默認模式為單人模式,通過點擊按鈕選擇不同游戲模式進行游戲。系統(tǒng)還要求實現(xiàn)至少2個不同地圖的選擇,以提高游戲的趣味與豐富性。單人模式時只有玩家1通過上下左右鍵

22、來控制蛇的方向,在規(guī)定時間內(nèi)盡量多吃食物,雙人模式時增加的玩家2可以通過w,s,a,d來控制蛇的移動方向,通過雙人競技比較誰吃的食物最多,人機對戰(zhà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ā)出來的程序需要有g(shù)tk環(huán)境才

23、能運行,由于是用c語言實現(xiàn),因此系統(tǒng)對硬件的要求并不是很高。所以本系統(tǒng)的運行要求是搭建有g(shù)tk環(huán)境或是安裝gnome桌面環(huán)境的linux操作系統(tǒng)。4 系統(tǒng)概要設(shè)計4.1 程序初始化 程序初始化主要由初始化函數(shù)init_game()在游戲開始時對各變量進行初始化賦值。每次重新游戲時,得分將清零,游戲時間重設(shè)為300秒,蛇的長度與位置恢復(fù)為初始狀態(tài),但游戲模式與游戲的地圖將不變,需要玩家自己選擇才會發(fā)生改變游戲的初始化流程如圖4.1所示。4.2程序流程4.2.1系統(tǒng)模塊本系統(tǒng)分為:圖形初始化gtk_init()與游戲初始化game_init()模塊、圖形界面設(shè)計create_window()與地圖

24、設(shè)計draw_map()模塊、模式選擇cb_choose()模塊、游戲play_game()模塊、成績輸出模塊、電腦ai模塊、游戲退出模塊、游戲中蛇通過判斷是否撞墻或吃到自己來判斷蛇的死亡。程序模塊如圖4.2所示。4.2.2 系統(tǒng)流程本系統(tǒng)流程:當用戶打開系統(tǒng),系統(tǒng)首先對各參數(shù)進行初始化設(shè)定,當玩家點擊“開始”時開始游戲,用戶通過方向鍵進行游戲,游戲過程中如果蛇死亡或游戲時間完則停止游戲并顯示分數(shù)與結(jié)束信息,當玩家選擇從新開始時游戲進行初始化設(shè)定,當玩家選擇退出時退出游戲。游戲流程如圖4.3所示。圖 4.1 程序初始化流程圖 圖 4.2 游戲模塊圖圖 4.3 游戲流程圖5 系統(tǒng)詳細設(shè)計5.1

25、系統(tǒng)界面 用戶界面是現(xiàn)代軟件重要的組成部分,界面的好壞對于游戲軟件來說也相當?shù)闹匾驗橐粋€用戶友好的界面能讓玩家在游戲過程中感覺更舒心,而一個不友好的界面將使游戲的品質(zhì)大打折扣。本系統(tǒng)界面的設(shè)計遵循如下的指導(dǎo)規(guī)則:1 讓用戶駕馭軟件,而不是軟件駕馭用戶。2 盡可能減少用戶的記性。3 保持界面的一致性【8】。本游戲的界面設(shè)計如圖5.1所示。圖5.1 游戲界面的設(shè)計此系統(tǒng)界面設(shè)計簡約而不簡單,用戶使用此系統(tǒng)時能夠很容易記住方便玩家使用,因此不會讓人感覺復(fù)雜而乏味。界面主要分為以下幾大部分。(1)主界面:所有信息都顯示在主窗口上,其中主要有游戲顯示區(qū)、游戲信息顯示區(qū)和游戲按鈕區(qū)。主窗口創(chuàng)建代碼如下

26、:/創(chuàng)建窗口window=gtk_window_new(gtk_window_toplevel);/設(shè)置主窗口標題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(wind

27、ow,800,500);/邊框大小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的圖片添加進游戲區(qū)并設(shè)為背景。(4)信息顯示區(qū):主要顯示游戲過程中的各種信息,如時間和得分等。

28、gtk_label_new()函數(shù)用于顯示游戲分數(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、信息顯示和按鈕添加進fixed,最后把fixed容器添加進window主窗口,最后通過gtk_widget_show_all(window)函數(shù)將其顯示出來。圖5.2 游戲開始界面設(shè)計 圖5.3游戲信息顯示區(qū) 圖5.4 系統(tǒng)按鈕布局5.2 對象模型設(shè)計 在本系統(tǒng)中對象模型

29、的設(shè)計主要是蛇的設(shè)計,食物的設(shè)計,和地圖的設(shè)計。蛇的設(shè)計主要是通過2個畫圓函數(shù)gdk_draw_arc()畫出蛇的每一個結(jié)點同時設(shè)定顏色。而食物也是通過畫圓函數(shù)畫出。地圖中的傳送點和墻體是通過畫方格函數(shù)gdk_draw_rectangle()畫出。圖5.5中就是蛇, 即是食物,褐色長方形即使墻的設(shè)計,是傳送點。圖5.5地圖二的設(shè)計圖5.6地圖一的設(shè)計5.3 食物及蛇狀態(tài)的初始化及食物的出現(xiàn) 蛇狀態(tài)的初始化是由定義蛇結(jié)構(gòu)體時初始化決定的,每一次開始蛇的長度,出現(xiàn)位置和移動方向都是一樣的,它們長度都為6個結(jié)點,方向都向右,蛇1初始位置是(3,3),蛇2初始位置是(3,30)。無論是在游戲的開始還是

30、進行中,食物都是隨機出現(xiàn)的,通過rand()隨機數(shù)產(chǎn)生函數(shù)隨機產(chǎn)生食物出現(xiàn)的坐標,在產(chǎn)生的隨機坐標上畫出食物。5.4 游戲運行中的設(shè)計思路游戲中蛇的運動是靠通過對畫面的不斷清除與重畫而實現(xiàn)的,每一次運動時先用背景色擦除掉原有蛇的圖像,再將蛇畫在其新出現(xiàn)的位置,由于每一次擦除與重畫間隔的時間非常短,利用人的視覺暫留性,讓蛇看上去就像在連續(xù)不斷的運動。而食物未被吃前,傳送點和墻體被擦除后重畫的位置與原來一樣,所以讓人感覺其并沒有變化。蛇身的移動與運動方向主要是受頭結(jié)點控制,因為蛇每一次運動就是靠后一結(jié)點畫在前一結(jié)點的位置上來實現(xiàn)的,所以對蛇的控制主要是對頭結(jié)點的控制。蛇1通過上下左右鍵,蛇2通過w

31、、s、a、d鍵來控制蛇的移動方向游戲中蛇運動速度的快慢主要是通過設(shè)置畫面重畫頻率來實現(xiàn)的,而具體實現(xiàn)是通過對函數(shù)的調(diào)用頻率,gtk中用函數(shù)g_timeout_add ()來實現(xiàn)對函數(shù)的定時調(diào)用。游戲暫停則是通過g_source_remove()函數(shù)中止對蛇運行函數(shù)的定時調(diào)用。通過g_timeout_add()來實現(xiàn)游戲的繼續(xù)。設(shè)計了傳送點和墻體來增加游戲的復(fù)雜性與可玩性5.5 游戲規(guī)則1 單人模式單人模式的規(guī)則比較簡單,只要在規(guī)定的時間內(nèi)不死亡和盡量得分最多即可。蛇撞墻或自己身體時即死亡,當蛇進入傳送點時將從另一特定位置出來。2雙人競技模式蛇進入傳送點時將從另一特定位置出來,規(guī)定時間內(nèi)蛇沒死亡

32、得分最多者贏,得分相等為平局,游戲中撞墻或自己身體死亡者輸。兩條蛇可以互相穿透。3人機對戰(zhàn)模式當用戶選擇此模式時將于電腦控制的蛇進行競技,此模式規(guī)則與雙人對戰(zhàn)模式一樣。5.6 游戲?qū)崿F(xiàn)以及其代碼5.6.1 蛇移動的實現(xiàn) 蛇的移動方向主要受頭結(jié)點控制,所以每次畫蛇時只要把前一結(jié)點的值賦給后一節(jié)點即可。 當蛇頭的移動方向向右時,y值不變x的值不斷增加。 當蛇頭的移動方向向左時,y值不變x的值不斷減少。 當蛇頭的移動方向向下時,y值增加x的值不變。 當蛇頭的移動方向向上時,y值減小x的值不變。畫蛇和蛇移動代碼如下:/蛇身體節(jié)點位置的賦值gint i;for (i=snake.node;i0;i-)

33、snake.xi= snake.xi-1; snake.yi= snake.yi-1; /蛇移動的實現(xiàn)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 蛇死亡的判斷當蛇頭的值與蛇身或與墻的值相等時,蛇即算死亡,代碼如下:void judge_die(struct snake *psnake)gint j;for(j=3;jnode;j+)if(

34、psnake-xj= psnake-x0& psnake-yj= psnake-y0) psnake-life=1;5.6.3 蛇到達邊框時從另一端出現(xiàn)和傳送的實現(xiàn) 當蛇頭的x或y值達到邊框的最大或最小位置時相應(yīng)的給x或y賦以邊框的最小或最大值以實現(xiàn)當蛇到達邊框時能從另一端出來,同理當蛇頭的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

35、=-1;/到達傳送點的處理if(snake2.x0=1&snake2.y0=3)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,下面將詳細介紹實現(xiàn)ai的算法設(shè)計。6.1 蛇自己尋找食物的算法設(shè)計此部分的算法設(shè)計是蛇ai設(shè)計的最主要也是最基本的部分。在系統(tǒng)中電腦蛇主要通過搜尋最短路徑來尋找食物,而最短路徑的搜索可以通過很多算法來實現(xiàn),本系統(tǒng)主要是通過尋找局部最優(yōu)解的方法來搜索蛇到食物的

36、最短路徑,而其中有一個貪心算法符合此部分的設(shè)計。6.1.1 貪心算法所謂貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解。貪心算法不是對所有問題都能得到整體最優(yōu)解,但對范圍相當廣泛的許多問題他能產(chǎn)生整體最優(yōu)解或者是整體最優(yōu)解的近似解。貪心算法的基本思路如下:(1)建立數(shù)學(xué)模型來描述問題。(2)把求解的問題分成若干個子問題。(3)對每一子問題求解,得到子問題的局部最優(yōu)解。(4)把子問題的解局部最優(yōu)解合成原來解問題的一個解。實現(xiàn)該算法的過程:從問題的某一初始解出發(fā);while 能朝給定總目標前進一步 do求出可行

37、解的一個解元素;由所有解元素組合成問題的一個可行解。6.1.2 利用貪心算法實現(xiàn)最短路徑的選擇本系統(tǒng)中蛇主要是通過頭結(jié)點的移動來控制蛇的移動,因此電腦蛇的移動也主要是通過頭結(jié)點的的方向的選擇來控制蛇的移動。根據(jù)貪心算法得出最短路徑的步驟:(1)選擇一組解即在蛇頭結(jié)點有可能移動的四個方向,每個方向選出一個點用于挑選最優(yōu)解。(2)挑選出來的四個點依次計算出其與食物的距離,然后進行比較。(3)選出離食物最近的一個點。(4)把蛇頭結(jié)點移動的方向設(shè)為移動到挑選出來離食物距離最近點的方向。(5)移動到下一點后又從第1步執(zhí)行,直到最后得到最優(yōu)解為止。求可行解(第2步)示意圖如下:圖6.1 求可行解示意圖計算

38、距離通過比較選出最短距離然后選擇蛇移動方向的實現(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;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=a

39、2*a2+b*b;d3=b3*b3+a*a;d4=b4*b4+a*a;/選擇最短距離的點后得到方向if(d1d2&d1d3&d1d4&snake2.dir!=2)snake2.dir=1;else if(d2d1&d2d3&d2d4&snake2.dir!=1)snake2.dir=2;else if(d3d1&d3d2&d3d4&snake2.dir!=4)snake2.dir=3;else if(d4d1&d4d2&d4d3&snake2.dir!=3)snake2.dir=4;6.2 蛇避開吃到自己身體的算法設(shè)計為了提高電腦的ai,不至于蛇輕易就因為吃到自己而死亡,同時也是增加游戲的可玩

40、性。所以我們應(yīng)該讓蛇有一定的避開自己身體的能力。同樣,因為蛇的移動是受頭節(jié)點的控制,因此我們也只用判斷頭結(jié)點即可。蛇頭節(jié)點每一次運動時將做一個判斷,判斷它的前方是否有蛇身體的存在如果沒有按原有策略運動,如果有則改變蛇移動的方向。但并不是隨意改變方向即可,此系統(tǒng)是通過順時針方向做出判斷與改變的。如當蛇頭下一步的運動是向右移動的時候,電腦將優(yōu)先考慮其前方是否有蛇身體的存在,如果有則改變其方向向下同時判斷下方是否有蛇身體的存在,如果還是有則改變其方向向左同時判斷左方是否有蛇身體的存在,如果有則再改變其方向向上。實現(xiàn)代碼如下:if(snake2.dir=1) int j;for(j=3;j30&sna

41、ke2.x030&snake2.dir!=4)snake2.dir=3;if(snake2.y0=3&snake2.dir!=1)snake2.dir=2;else if(food.x30&snake2.dir!=4)snake2.dir=3;if(snake2.y0=3&snake2.dir!=2)snake2.dir=1;此地圖還需要考慮墻的存在,當蛇頭到達墻時必須改變方向避開它,否則將撞墻死亡。實現(xiàn)代碼如下:if(snake2.x030&(snake2.x0=1|snake2.x0=29)&snake2.dir!=4)snake2.dir=3;if(food.x30&(snake2.x0

42、=58|snake2.x0=31)&snake2.dir!=4)snake2.dir=3;if(food.x30&snake2.y0=3)snake2.dir=1;當蛇從一個區(qū)域到達另一區(qū)域的時候,有兩個出口可供選擇,這個時候蛇將選擇離食物最近的那個出口出現(xiàn)。兩個出口是上下分布的,因此只用判斷食物所在坐標的y值即可。因為游戲區(qū)域y的大小是從0到50,所以當y值小于等于25時從上面出口出現(xiàn),當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=25)s

43、nake2.x0=58;snake2.y0=3;7 調(diào)試以及測試結(jié)果分析 在系統(tǒng)在完善過程中做了大量的測試,這也是一個軟件完善過程中所必須的。7.1 系統(tǒng)測試1測試用例:(1)使蛇經(jīng)過各個邊界的情況。(2)使蛇達到各個傳送點。 (3)測試蛇死亡和游戲時間到的情況。(4)測試使蛇撞墻。(5)測試電腦蛇的運行。(6)測試軟件的各個按鈕。2預(yù)期出現(xiàn)的情況:(1)蛇能夠從一方邊界進去及時的從另一邊界出來。(2)蛇到達傳送點時能夠正確的從被傳送點出來。(3)當蛇死亡時和時間到了的時候,能夠?qū)崿F(xiàn)游戲停止和正確輸出游戲信息。(4)當蛇撞墻將死亡。(5)電腦蛇能夠正確的尋找食物與具有一定的ai。(6)系統(tǒng)能正

44、確夠響應(yīng)點擊按鈕時的操作。3實際結(jié)果:游戲測試的結(jié)果基本上符合預(yù)期目標,但也還有幾個小問題。7.2 在軟件的測試過程中發(fā)現(xiàn)的幾個小問題游戲過程中,當用戶以非常快的速度同時按下幾個控制鍵,蛇有可能會出現(xiàn)死亡現(xiàn)象。分析原因有可能是當以很快的速度按下多個控制鍵時蛇的方向的值已經(jīng)變化而實際移動方向卻未來得及改變,在這同時又按下了另一方向鍵,由此蛇就直接按后一方向的值的方向運動,于是就發(fā)生撞到自己死亡的現(xiàn)象。在蛇撞墻死亡時,頭結(jié)點將會進入墻體中。估計是在判斷蛇死亡后又畫了一幀畫面。電腦蛇有時候會出現(xiàn)吃到自己的情況,情況稍微復(fù)雜的時候無法做出很好的判斷,可能原因是電腦的ai還不夠高。電腦蛇到達邊界時不能及

45、時從另一邊出現(xiàn),尚未發(fā)現(xiàn)原因。系統(tǒng)雖然存在些問題,但系統(tǒng)的功能與模塊都成功實現(xiàn)且系統(tǒng)總體運行良好且穩(wěn)定,系統(tǒng)的下一階段將主要解決這些問題。7.3 系統(tǒng)需要的改進與提高由于各種原因,本系統(tǒng)依然存在著許多缺點如有bug的存在,電腦的ai不高的問題等。針對本系統(tǒng)的一些缺點,在二期開發(fā)時主要在以下方面進行改進:1 完善系統(tǒng),解決系統(tǒng)所出現(xiàn)的問題。2 改善與完善算法,使電腦的能變得高些。3 增加游戲地圖、游戲模式和游戲難度選擇,使游戲的可玩性大大增加。4 加上網(wǎng)絡(luò)功能,實現(xiàn)雙人通過局域網(wǎng)進行對戰(zhàn)。5 豐富界面,使界面更美觀與擁有良好的可操作性。6 對游戲進行優(yōu)化,如果可能,最好能實現(xiàn)linux嵌入式的移

46、植。使游戲具有更廣闊的前景。結(jié)束語由于專業(yè)知識的不足,系統(tǒng)開發(fā)經(jīng)驗的缺乏與時間的倉促,因此免不了系統(tǒng)相對簡單和出現(xiàn)許多的缺點。對gtk開發(fā)環(huán)境的不熟悉,導(dǎo)致系統(tǒng)界面無法得到很好的設(shè)計,許多功能還無法實現(xiàn)。因為時間的限制,游戲的豐富性還不足,目前也只設(shè)計了兩個地圖,還有由于是第一次設(shè)計電腦的ai,所以還存在許多的不足電腦ai也不高。雖然本系統(tǒng)設(shè)計還存在著許多的不足,但其便捷的操作性與高度的可塑性和強烈趣味性,注定其任然是一款成功的設(shè)計。在此次系統(tǒng)開發(fā)中讓我受益良多,不光讓我學(xué)到了許多的知識,也讓我了解到自己的不足,同時也引發(fā)了我對系統(tǒng)開發(fā)特別是linux下游戲開發(fā)的興趣,相信我在這次開發(fā)之后依舊

47、會堅定的走下去。參考文獻1 吳岳編著,linux c程序設(shè)計大全m.清華大學(xué)出版社,2009.2 孟慶昌編著,操作系統(tǒng)教程 - linux實例分析m.西安電子科技大學(xué)出版社,2004.3 主編:孫種秀,操作系統(tǒng)教程(第四版)m.高等教育出版社,2008.4 譚浩強,c程序設(shè)計(第三版)m.清華大學(xué)出版社,2005.5 嚴蔚敏 吳偉明編著,數(shù)據(jù)結(jié)構(gòu)(c語言版)m.清華大學(xué)出版社,2007.6 peter mattis, spencer kimball, josh macdonald,gtk turtoilm..7 浦濱編著,c游戲編程從入門到精通(第二版)m.科

48、學(xué)出版社,2006.8 (美)施奈德曼,用戶界面設(shè)計m.電子工業(yè)出版社,2006.附 錄部分源代碼:/頭文件、變量定義與結(jié)構(gòu)體定義#include#define gtk_up 65362#define gtk_down 65364#define gtk_left 65361#define gtk_right 65363#define n 200static gtkwidget *window = null;static gtkwidget *draw= null,*draw2=null;static gdkpixmap *pixmap = null,*pixbuf=null;gtkwidget

49、 *label;gtkwidget *score_label;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=

50、0;/*得分*/gint speed=130;guint timer=0;guint timer1=0;gint times=300;gint play_n=1;gint t=0;gint mp=1;struct foodint x;int y;int yes; /*判斷是否出現(xiàn)食物的變量 */ food=6,16,0;struct snakeint xn;int yn;int node;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(i

51、nt 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_obje

溫馨提示

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

評論

0/150

提交評論