版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄TOC\o"1-2"\h\u299601緒論 128801.1論文選題依據(jù) 1210101.2貪吃蛇游戲選題背景 1153881.3貪吃蛇設(shè)計概述 1290972平臺簡介 1103582.1系統(tǒng)介紹 198322.2開發(fā)工具 329352.3GTK環(huán)境的搭建 3117193系統(tǒng)分析 4183813.1可行性分析 4221593.2需求分析 4135024系統(tǒng)概要設(shè)計 5225284.1程序初始化 5238674.2程序流程 5182275系統(tǒng)詳細(xì)設(shè)計 621105.1系統(tǒng)界面 6175305.2對象模型設(shè)計 8238405.3食物及蛇狀態(tài)的初始化及食物的出現(xiàn) 922505.4游戲運行中的設(shè)計思路 9194305.5游戲規(guī)則 9316075.6游戲?qū)崿F(xiàn)及其代碼 9247096調(diào)試及測試結(jié)果分析 10314326.1系統(tǒng)測試 1086206.2測試出現(xiàn)的問題 1156746.3系統(tǒng)需要的改進(jìn)與提高 1124225結(jié)論 1112050致謝 12江蘇海洋大學(xué)Linux課程設(shè)計(論文)第5頁共22頁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ī)中,適合于特定嵌入式場合,目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約一半的系統(tǒng)使用嵌入式Linux。此次游戲設(shè)計環(huán)境也采用Linux系統(tǒng)。???Linux內(nèi)核的大部分代碼是由C語言編寫的,?Linux應(yīng)用程序也多由C語言編寫。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ā)工具。貪吃蛇游戲選題背景隨著人們生活品質(zhì)的提高,游戲進(jìn)入人們的視野,電腦游戲也越來越多元化,貪食蛇就是其中一種。貪吃蛇這一游戲簡單易行、操作方便和娛樂性較強(qiáng),在很大程度上滿足人們對游戲的追求和喜愛。這一款游戲緊緊地抓住了人們的心理,雖然簡單,卻起樂無窮,貪食蛇游戲操作簡單方便,老少皆宜,是一款不錯的小游戲。該游戲給人們帶來了追逐的快感,以及成功后的滿足感,對于一直處于高壓下的現(xiàn)代人是很好的放松工具。?貪吃蛇設(shè)計概述該游戲的功能包括:開始游戲、游戲等級和當(dāng)前速度顯示、退出游戲。開始游戲:玩家通過方向鍵去改變蛇的行動方向,每吃一個食物蛇身加長,分?jǐn)?shù)加1。?游戲等級和當(dāng)前速度顯示:玩家可以即時了解蛇的當(dāng)前狀態(tài)。退出游戲:“q”退出游戲。?2平臺簡介2.1系統(tǒng)介紹2.1.1Linux簡介Linux,全稱GNU/Linux,是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。伴隨著互聯(lián)網(wǎng)的發(fā)展,Linux得到了來自全世界軟件愛好者、組織、公司的支持。它除了在服務(wù)器方面保持著強(qiáng)勁的發(fā)展勢頭以外,在個人電腦、嵌入式系統(tǒng)上都有著長足的進(jìn)步。使用者不僅可以直觀地獲取該操作系統(tǒng)的實現(xiàn)機(jī)制,而且可以根據(jù)自身的需要來修改完善Linux,使其最大化地適應(yīng)用戶的需要。Linux不僅系統(tǒng)性能穩(wěn)定,而且是開源軟件。其核心防火墻組件性能高效、配置簡單,保證了系統(tǒng)的安全。在很多企業(yè)網(wǎng)絡(luò)中,為了追求速度和安全,Linux不僅僅是被網(wǎng)絡(luò)運維人員當(dāng)作服務(wù)器使用,它還被當(dāng)作服務(wù)器,甚至當(dāng)作網(wǎng)絡(luò)防火墻,這是Linux的一大亮點。
Linux具有開放源碼、沒有版權(quán)、技術(shù)社區(qū)用戶多等特點,開放源碼使得用戶可以自由裁剪,靈活性高,功能強(qiáng)大,成本低。尤其系統(tǒng)中內(nèi)嵌網(wǎng)絡(luò)協(xié)議棧,經(jīng)過適當(dāng)?shù)呐渲镁涂蓪崿F(xiàn)路由器的功能。這些特點使得Linux成為開發(fā)路由交換設(shè)備的理想開發(fā)平臺。
2.1.2Linux系統(tǒng)的主要特點Linux操作系統(tǒng)作為當(dāng)今主要的操作系統(tǒng)之一具有以下這些特點:?開放性?多用戶多任務(wù)?良好的用戶界面設(shè)備獨立性?提供了豐富的網(wǎng)絡(luò)功能?可靠的安全系統(tǒng)?良好的可移植性?2.1.3Linux的組成LINUX的內(nèi)核:內(nèi)核是系統(tǒng)的核心,是運行程序和管理?像磁盤和打印機(jī)等硬件設(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等。LINUX應(yīng)用系統(tǒng):標(biāo)準(zhǔn)的Linux系統(tǒng)都有一整套稱為應(yīng)用程序的程序集,包括文本編輯器、編程語言、X?Window、辦公套件、Internet工具、數(shù)據(jù)庫等。2.2開發(fā)工具Linux的內(nèi)核主要是由C語言編寫的,所以C語言在Linux下的軟件開發(fā)具有獨到的優(yōu)勢。本次游戲設(shè)計用到的語言就是C。2.2.1C語言簡介C語言是目前世界上流行、使用最廣泛的高級程序設(shè)計語言。C語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進(jìn)行操作的場合,用C語言明顯優(yōu)于其它高級語言,許多大型應(yīng)用軟件都是用C語言編寫的。C語言具有繪圖能力強(qiáng),可移植性,并具備很強(qiáng)的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動畫它是數(shù)值計算的高級語言。C語言的特點有:?簡潔緊湊、靈活方便。運算符豐富。數(shù)據(jù)結(jié)構(gòu)豐富。??C是結(jié)構(gòu)式語言。???(5)?C語法限制不太嚴(yán)格、程序設(shè)計自由度大。???(6)?C語言允許直接訪問物理地址,可以直接對硬件進(jìn)行操作。2.2.2GTK簡介GTK(GIMP?Toolkit)是一套跨多種平臺的圖形工具包,按LGPL許可協(xié)議發(fā)布的。雖然最初是為GIMP寫的,但目前已發(fā)展為一個功能強(qiáng)大、設(shè)計靈活的一個通用圖形庫。特別是被GNOME選中使得GTK+廣為流傳,成為Linux下開發(fā)圖形界面的應(yīng)用程序的主流開發(fā)工具之一,當(dāng)然GTK+并不要求必須在Linux上,事實上,目前GTK+已經(jīng)有了成功的windows版本。?2.2.3Linux編譯工具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.3GTK環(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)會自動找到所依賴的庫,并一起下載下來這樣安裝過后使用下面的命令編譯上面的代碼:?????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)。同時C語言也擁有相當(dāng)多的技術(shù)人員。GTK是Linux下的一個圖形化編程工具,其開發(fā)出來的程序能在裝有GTK環(huán)境的Linux系統(tǒng)下順利運行??梢哉f在技術(shù)方面開發(fā)此系統(tǒng)不會有什么問題。3.1.2經(jīng)濟(jì)可行性隨著手機(jī)和電腦的普及,這樣的小游戲也將隨著普及因此其需求也將不斷上升,而由于技術(shù)的成熟與為數(shù)眾多的開發(fā)人員使得此系統(tǒng)的開發(fā)并不困難,再者此系統(tǒng)運行的平臺Linux操作系統(tǒng)是開源和免費的,所以開發(fā)此系統(tǒng)的成本并不會很高。因此此系統(tǒng)具有相當(dāng)?shù)慕?jīng)濟(jì)利益,到時候我們也可以靜觀其成。3.1.3操作可行性本系統(tǒng)是一個簡單的單機(jī)游戲系統(tǒng),對于這樣一個系統(tǒng),其操作只需要使用簡單的幾個按鍵和鼠標(biāo)點擊按鈕就可以實現(xiàn),因此本系統(tǒng)的操作簡單易記,可以說一看就會的,系統(tǒng)在操作上是不會存在問題的,本系統(tǒng)需要在Linux操作系統(tǒng)下運行,用戶上手也快,有著很好的游戲體驗。3.2需求分析3.2.1功能需求本系統(tǒng)是一個簡單的單機(jī)游戲,界面分為兩個部分。一個是游戲區(qū),在游戲區(qū)中,用戶可通過鍵盤上的W、S、A和D來控制蛇的移動方向,及時了解貪吃蛇當(dāng)前的狀態(tài)。用戶可通過q隨時退出游戲。另一個是日志區(qū),包含游戲的玩法介紹和說明。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ù)initsnake()在游戲開始時對蛇的進(jìn)行初始化賦值,每次重新開始游戲時,蛇都會恢復(fù)為原始狀態(tài),游戲模式與地圖不變。4.2程序流程4.2.1系統(tǒng)模塊本系統(tǒng)分為:創(chuàng)建日志窗口WINDOW*logwin模塊;蛇初始化initshake()模塊、創(chuàng)建新游戲窗口WINDOW*newgame()模塊;游戲中,蛇通過跑斷是否撞墻或吃到自己來判斷蛇的死亡。4.2.2系統(tǒng)流程本游戲作為一個簡單的linux小游戲,當(dāng)運行程序是默認(rèn)程序開始啟動,程序啟動后,隨著所吃食物的增多,每當(dāng)吃到一定程度的食物,則系統(tǒng)會提示“LevelUP!”,隨著等級的升高,蛇的移動速度會越來越快。游戲過程中,玩家可以按“q”或“Q”來終止游戲,如果蛇死亡則系統(tǒng)提示“Gameover!”,玩家可以選擇重新開始游戲和退出。系統(tǒng)流程圖如下圖4-1所示:圖4-1系統(tǒng)流程圖系統(tǒng)構(gòu)架圖如下圖4-2所示:圖4-2系統(tǒng)構(gòu)架圖5系統(tǒng)詳細(xì)設(shè)計5.1系統(tǒng)界面用戶界面是現(xiàn)代軟件重要的組成部分,界面的好壞對于游戲軟件來說也相當(dāng)?shù)闹匾?,因為一個用戶友好的界面能讓玩家在游戲過程中感覺更舒心,而一個不友好的界面將使游戲的品質(zhì)大打折扣。本系統(tǒng)界面的設(shè)計遵循如下的指導(dǎo)規(guī)則:?讓用戶駕馭軟件,而不是軟件駕馭用戶。盡可能減少用戶的記性。?保持界面的一致性。游戲界面如圖5-1所示:圖5-1主界面游戲界面:標(biāo)志著貪吃蛇的活動范圍,主要為游戲顯示區(qū);另外還有等級劃分和速度劃分,簡單明了。游戲界面窗口代碼如下:
#define
INITRUNLOG()logwin
=
newlogw()
#define
GAMEWIN_YLEN
15//設(shè)計游戲窗口的寬度
#define
GAMEWIN_XLEN
60//設(shè)計游戲窗口的長度#define
RUNLOG(str)
runlog(logwin,
str)//代表蛇的移動界面圖5-2游戲界面圖日志界面:日志界面中主要描述貪吃蛇的操作按鍵以及如何退出游戲日志界面代碼如下:#define
LOGWIN_YLEN
7//使日志界面的寬度為7#define
LOGWIN_XLEN
(GAMEWIN_XLEN)//使日志界面的長度與游戲界面一樣
圖5-3日志界面圖5.2對象模型設(shè)計在本系統(tǒng)中對象模型的設(shè)計主要是蛇的設(shè)計、食物的設(shè)計。蛇的設(shè)計主要是通過drawsnakew()函數(shù)畫出蛇的身體。而食物也是通過drawfoodw()函數(shù)畫出。蛇身代碼如下:
void
drawsnakew(WINDOW
*win,
struct
TSnake
*psnake)
{
static
int
taily
=
0;
static
int
tailx
=
0;
if
(taily
!=
0
&&
tailx
!=
0)
{
mvwaddch(win,
taily,
tailx,
'
');
}食物代碼如下:
void
drawfoodw(WINDOW
*win,
struct
TFood
*pfood,
struct
TSnake
*psnake)
{
do
{
pfood->y
=
random()
%
(GAMEWIN_YLEN
-
1)
+
1;
pfood->x
=
random()
%
(GAMEWIN_XLEN
-
1)
+
1;
}
while
(False
==
checkfood(pfood,
psnake));
checkfood(pfood,
psnake);
mvwaddch(win,
pfood->y,
pfood->x,
SHAPE_FOOD);
wrefresh(win);
}圖5-4中***就是蛇,@即是食物。圖5-45.3食物及蛇狀態(tài)的初始化及食物的出現(xiàn)蛇狀態(tài)的初始化是由定義蛇結(jié)構(gòu)體時初始化決定的,每一次開始蛇的長度,出現(xiàn)位置和移動方向都是一樣的,它們長度都為4個結(jié)點,方向都向右。無論是在游戲的開始還是進(jìn)行中,食物都是隨機(jī)出現(xiàn)的,通過checkfood()函數(shù)隨機(jī)產(chǎn)生食物出現(xiàn)的坐標(biāo),在產(chǎn)生的隨機(jī)坐標(biāo)上畫出食物。5.4游戲運行中的設(shè)計思路游戲中蛇的運動是靠通過對畫面的不斷清除與重畫而實現(xiàn)的,每一次運動時先用背景色擦除掉原有蛇的圖像,再將蛇畫在其新出現(xiàn)的位置,由于每一次擦除與重畫間隔的時間非常短,利用人的視覺暫留性,讓蛇看上去就像在連續(xù)不斷的運動。而食物未被吃前,傳送點和墻體被擦除后重畫的位置與原來一樣,所以讓人感覺其并沒有變化。?蛇身的移動與運動方向主要是受頭結(jié)點控制,因為蛇每一次運動就是靠后一結(jié)點畫在前一結(jié)點的位置上來實現(xiàn)的,所以對蛇的控制主要是對頭結(jié)點的控制。用戶通過鍵盤上的w、s、a和d對蛇身進(jìn)行操控。5.5游戲規(guī)則本系統(tǒng)是一個簡單的單機(jī)游戲,界面分為兩個部分。用戶可通過鍵盤上的W、S、A和D來控制蛇的移動方向,及時了解貪吃蛇當(dāng)前的狀態(tài)。用戶可通過q隨時退出游戲。5.6游戲?qū)崿F(xiàn)及其代碼5.6.1蛇的移動蛇的移動方向主要受頭結(jié)點控制,所以每次畫蛇時只要把前一結(jié)點的值賦給后一節(jié)點即可。?當(dāng)蛇頭的移動方向向右時,y值不變x的值不斷增加。????當(dāng)蛇頭的移動方向向左時,y值不變x的值不斷減少。當(dāng)蛇頭的移動方向向下時,y值增加x的值不變。當(dāng)蛇頭的移動方向向上時,y值減小x的值不變。蛇身移動代碼如下:?void
movesnake(struct
TSnake
*psnake)
{
int
hy
=
psnake->head->y;
int
hx
=
psnake->head->x;
psnake->head
=
GetSnakeTail(psnake);
switch
(psnake->dir)
{
case
DIR_UP:
psnake->head->y
=
hy
-
1;
psnake->head->x
=
hx;
break;
case
DIR_DOWN:
psnake->head->y
=
hy
+
1;
psnake->head->x
=
hx;
break;
case
DIR_LEFT:
psnake->head->y
=
hy;
psnake->head->x
=
hx
-
1;
break;
case
DIR_RIGHT:
psnake->head->y
=
hy;
psnake->head->x
=
hx
+
1;
break;
5.6.2蛇的死亡當(dāng)蛇頭的值與蛇身或與墻的值相等時,蛇即算死亡,代碼如下:
void
gameover(WINDOW
*win,
char
*str)
{
mvwprintw(win,
(int)(GAMEWIN_YLEN/2),
(GAMEWIN_XLEN/2
-
strlen(str)/2),
str);
mvwprintw(win,
(int)(GAMEWIN_YLEN/2
+
1),
20,
"Press
any
key
to
quit...");
wrefresh(win);
}6調(diào)試及測試結(jié)果分析6.1系統(tǒng)測試1測試用例:?使蛇經(jīng)過各個邊界的情況。使蛇達(dá)到各個傳送點。?(3)測試蛇死亡和游戲時間到的情況。?(4)測試使蛇撞墻。(5)測試軟件的各個命令。?2預(yù)期出現(xiàn)的情況:?蛇能夠從一方邊界進(jìn)去及時的從另一邊界出來。蛇到達(dá)傳送點時能夠正確的從被傳送點出來。?(3)當(dāng)蛇死亡時和時間到了的時候,能夠?qū)崿F(xiàn)游戲停止和正確輸出游戲信息。?(4)當(dāng)蛇撞墻將死亡。?(5)系統(tǒng)能正確響應(yīng)命令時的操作。3實際結(jié)果:?游戲測試的結(jié)果基本上符合預(yù)期目標(biāo),但也還有幾個小問題。6.2測試出現(xiàn)的問題游戲過程中,當(dāng)用戶以非??斓乃俣韧瑫r按下幾個控制鍵,蛇有可能會出現(xiàn)死亡現(xiàn)象。分析原因有可能是當(dāng)以很快的速度按下多個控制鍵時蛇的方向的值已經(jīng)變化而實際移動方向卻未來得及改變,在這同時又按下了另一方向鍵,由此蛇就直接按后一方向的值的方向運動,于是就發(fā)生撞到自己死亡的現(xiàn)象。??貪吃蛇到達(dá)邊界時不能及時從另一邊出現(xiàn)。?系統(tǒng)雖然存在些問題,但系統(tǒng)的功能與模塊都成功實現(xiàn)且系統(tǒng)總體運行良好且穩(wěn)定,系統(tǒng)的下一階段將主要解決這些問題。6.3系統(tǒng)需要的改進(jìn)與提高由于各種原因,本系統(tǒng)依然存在著許多缺點如有BUG的存在。針對本系統(tǒng)的一些缺點,在后期開發(fā)時主要在以下方面進(jìn)行改進(jìn):?完善系統(tǒng),解決系統(tǒng)所出現(xiàn)的問題。改善與完善算法,使電腦的能變得高些。?增加游戲地圖、游戲模式和游戲難度選擇,使游戲的可玩性大大增加。加上網(wǎng)絡(luò)功能,實現(xiàn)游戲更好的交互。?豐富界面,使界面更美觀與擁有良好的可操作性。?對游戲進(jìn)行優(yōu)化,使游戲具有更廣闊的前景。結(jié)論Linux是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和Unix的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。Linux不僅系統(tǒng)性能穩(wěn)定,而且是開源軟件。其核心防火墻組件性能高效、配置簡單,保證了系統(tǒng)的安全。在很多企業(yè)網(wǎng)絡(luò)中,為了追求速度和安全,Linux不僅僅是被網(wǎng)絡(luò)運維人員當(dāng)作服務(wù)器使用,它還被當(dāng)作服務(wù)器,甚至當(dāng)作網(wǎng)絡(luò)防火墻。Linux具有開放源碼、沒有版權(quán)、技術(shù)社區(qū)用戶多等特點,開放源碼使得用戶可以自由裁剪,靈活性高,功能強(qiáng)大,成本低。尤其系統(tǒng)中內(nèi)嵌網(wǎng)絡(luò)協(xié)議棧,經(jīng)過適當(dāng)?shù)呐渲镁涂蓪崿F(xiàn)路由器的功能。這些特點使得Linux成為開發(fā)路由交換設(shè)備的理想開發(fā)平臺。
致謝在此感謝我們linux課程的老師,是老師孜孜不倦的教導(dǎo),是老師的教導(dǎo)讓我們能夠成功在linux的環(huán)境之下成功的運行出貪吃蛇這樣的小游戲,不僅增加了我們對未來研究更困難的課題的信心,也豐富了我們的課外生活,讓我們的生活變得更加的多姿多彩。同樣還要感謝我們的室友,在我們電腦出現(xiàn)問題的時候,是室友無私的奉獻(xiàn),幫助我們解決了難題。正是因為有你們的幫助,使我們在相處和學(xué)習(xí)的過程中收獲頗多,互相成長。本論文編寫過程中還得到了很多朋友的支持和幫助,限于篇幅,雖然不能對你們一一表示感謝,但對你們一樣心存感激。附錄:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/time.h>#include<sys/types.h>#include<unistd.h>#include<ncurses.h>#defineTBoolint#defineTrue1#defineFalse0#defineSHAPE_FOOD'@'#defineSHAPE_SNAKE'*'#defineGAMEWIN_YLEN15#defineGAMEWIN_XLEN60#defineLOGWIN_YLEN7#defineLOGWIN_XLEN(GAMEWIN_XLEN)#defineLOGBUF_NUM(LOGWIN_YLEN-2)#defineLOGBUF_LEN(GAMEWIN_XLEN-2)#defineMAXLEVEL12#defineGetSnakeTail(s)((s)->head->front)WINDOW*logwin;#defineINITRUNLOG()logwin=newlogw()#defineRUNLOG(str)runlog(logwin,str)#defineDESTROYRUNLOG()delwin(logwin)intg_level;enumTDirection{DIR_UP,DIR_DOWN,DIR_LEFT,DIR_RIGHT};structTFood{inty;intx;};structTSnakeNode{inty;intx;structTSnakeNode*front;};structTSnake{intlength;structTSnakeNode*head;enumTDirectiondir;};intrefreshgamew(WINDOW*win,structTSnake*psnake);voidmovesnake(structTSnake*psnake);intchecksnake(structTFood*pfood,structTSnake*psnake);voidsnakegrowup(structTFood*pfood,structTSnake*psnake);voidgameover(WINDOW*win,char*str);structTSnakeNode*newsnakenode(structTSnakeNode**ppsnode,inty,intx);WINDOW*newgamew();structTSnake*initsnake();voiddestroysnake(structTSnake*psnake);voiddrawsnakew(WINDOW*win,structTSnake*psnake);voiddrawfoodw(WINDOW*win,structTFood*pfood,structTSnake*psnake);TBoolcheckfood(structTFood*pfood,structTSnake*psnake);WINDOW*newlogw();voidrunlog(WINDOW*win,char*str);voidcleanline(WINDOW*win,inty,intx);intmain(){initscr();raw();noecho();keypad(stdscr,TRUE);curs_set(0);refresh();g_level=1;INITRUNLOG();RUNLOG("Press'q'or'Q'toquit.");RUNLOG("Press'w/s/a/d'or'W/S/A/D'tomovethesnake.");RUNLOG("Info:");WINDOW*gwin=newgamew();structTSnake*psnake=initsnake();drawsnakew(gwin,psnake);while(refreshgamew(gwin,psnake)>=0);getch();destroysnake(psnake);delwin(gwin);DESTROYRUNLOG();endwin();return0;}intrefreshgamew(WINDOW*win,structTSnake*psnake){staticTBoolffood=False;structTFoodpfood;if(!ffood){drawfoodw(win,&pfood,psnake);ffood=True;}intkey=-1;fd_setset;FD_ZERO(&set);FD_SET(0,&set);structtimevaltimeout;timeout.tv_sec=0;timeout.tv_usec=(6-(int)(g_level/3))*100*1000;if(select(1,&set,NULL,NULL,&timeout)<0)return-1;if(FD_ISSET(0,&set)){while((key=getch())==-1);switch(key){case'w':case'W':(psnake->dir==DIR_DOWN)?:(psnake->dir=DIR_UP);break;case's':case'S':(psnake->dir==DIR_UP)?:(psnake->dir=DIR_DOWN);break;case'a':case'A':(psnake->dir==DIR_RIGHT)?:(psnake->dir=DIR_LEFT);break;case'd':case'D':(psnake->dir==DIR_LEFT)?:(psnake->dir=DIR_RIGHT);break;case'q':case'Q':RUNLOG("QuitGame!");gameover(win,"QuitGame!");return-1;default:break;}}movesnake(psnake);drawsnakew(win,psnake);switch(checksnake(&pfood,psnake)){case0:break;case1:ffood=False;if(++g_level>MAXLEVEL){RUNLOG("Win!!!");gameover(win,"Win!!!");return-1;}mvwprintw(win,GAMEWIN_YLEN-1,2,"Level:%d",g_level);mvwprintw(win,GAMEWIN_YLEN-1,30,"Speed:%d",(int)(g_level/3));wrefresh(win);RUNLOG("LevelUP!");snakegrowup(&pfood,psnake);break;default:RUNLOG("Gameover!");gameover(win,"Gameover!");return-1;}return1;}/***stuctTSnake是一個倒置的首尾相連的鏈表,head->front指向snake的尾部*如:[a]<-[b]<-[c]<-[d]a為head*|^snake移動的時候,只用head指向d,*`'并且修改d的(y,x)為snake頭移動到的位置.*/voidmovesnake(structTSnake*psnake){inthy=psnake->head->y;inthx=psnake->head->x;psnake->head=GetSnakeTail(psnake);switch(psnake->dir){caseDIR_UP:psnake->head->y=hy-1;psnake->head->x=hx;break;caseDIR_DOWN:psnake->head->y=hy+1;psnake->head->x=hx;break;caseDIR_LEFT:psnake->head->y=hy;psnake->head->x=hx-1;break;caseDIR_RIGHT:psnake->head->y=hy;psnake->head->x=hx+1;break;default:break;}}intchecksnake(structTFood*pfood,structTSnake*psnake){if(psnake->head->y<=0||psnake->head->y>=GAMEWIN_YLEN||psnake->head->x<=0||psnake->head->x>=GAMEWIN_XLEN){return-1;}structTSnakeNode*pnode=GetSnakeTail(psnake);inti=0;for(;i<psnake->length-1;++i,pnode=pnode->front)if(psnake->head->y==pnode->y&&psnake->head->x==pnode->x)return-1;if(psnake->head->y==pfood->y&&psnake->head->x==pfood->x)return1;return0;}voidsnakegrowup(structTFood*pfood,structTSnake*psnake){structTSnakeNode*pnode=(structTSnakeNode*)malloc(sizeof(structTSnakeNode));switch(psnake->dir){caseDIR_UP:pnode->y=psnake->head->y-1;pnode->x=psnake->head->x;break;caseDIR_DOWN:pnode->y=psnake->head->y+1;pnode->x=psnake->head->x;break;caseDIR_LEFT:pnode->y=psnake->head->y;pnode->x=psnake->head->x-1;break;caseDIR_RIGHT:pnode->y=psnake->head->y;pnode->x=psnake->head->x+1;break;default:break;}pnode->front=GetSnakeTail(psnake);psnake->head->front=pnode;psnake->head=pnode;++psnake->length;}voidgameover(WINDOW*win,char*str){mvwprintw(win,(int)(GAMEWIN_YLEN/2),(GAMEWIN_XLEN/2-strlen(str)/2),str);mvwprintw(win,(int)(GAMEWIN_YLEN/2+1),20,"Pressanykeytoquit...");wrefresh(win);}WINDOW*newgamew(){WINDOW*win=newwin(GAMEWIN_YLEN,GAMEWIN_XLEN,1,3);box(win,0,0);mvwprintw(win,0,2,"GAME");mvwprintw(win,GAMEWIN_YLEN-1,2,"Level:%d",g_level);mvwprintw(win,GAMEWIN_YLEN-1,30,"Speed:%d",(int)(g_level/3));wrefresh(win);returnwin;}structTSnake*initsnake(){structTSnake*psnake=(structTSnake*)malloc(sizeof(structTSnake));psnake->dir=DIR_LEFT;psnake->length=4;newsnakenode(&newsnakenode(&newsnakenode(&newsnakenode(&psnake->head,4,50)->front,4,53)->front,4,52)->front,4,51)->front=psnake->head;returnpsnake;}structTSnakeNode*newsnakenode(structTSnakeNode**ppsnode,inty,intx){*ppsnode=(structTSnakeNode*)malloc(sizeof(structTSnakeNode));(*ppsnode)->y=y;(*ppsnode)->x=x;(*ppsnode)->front=NULL;return*ppsnode;}voiddestroysnake(structTSnake*psnake){structTSnakeNode*psnode=GetSnakeTail(psnake);structTSnakeNode*ptmp=NULL;inti=0;for(;i<psnake->length;++i){ptmp=psnode;psnode=psnode->front;free(ptmp);}free(psnake);psnake=NULL;}voiddrawsnakew(W
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育心理學(xué)提升訓(xùn)練試卷A卷附答案
- 2024年度山西省高校教師資格證之高等教育法規(guī)能力測試試卷A卷附答案
- 2024年微波集成電路AL2O3基片項目資金申請報告代可行性研究報告
- 四年級數(shù)學(xué)(四則混合運算)計算題專項練習(xí)與答案
- 2024年反擔(dān)保協(xié)議法律文件樣式
- 生態(tài)農(nóng)業(yè)園建設(shè)項目可行性研究報告
- 2024年勞動協(xié)議監(jiān)管手冊內(nèi)容概覽
- 2024年期辦公場所租賃協(xié)議模板
- 2024室內(nèi)涂裝批白施工服務(wù)協(xié)議
- 2024新裝修工程項目協(xié)議
- 天津市基本醫(yī)療保險意外傷害首診報告卡
- Unit+5+Into+the+Unknown+Understanding+ideas+教學(xué)設(shè)計 高二下學(xué)期英語外研版(2019)選擇性必修第四冊
- 港口、航道與海岸工程概論
- 綜合英語Book-III-Unit-15-A-Fable-for-Tomorrow-課件
- MT99XX測試機(jī)的維修報告畢業(yè)設(shè)計
- 亞馬遜品牌采購合同范本
- Unit 10 I don't feel well today (說課稿)-2022-2023學(xué)年英語六年級上冊-湘少版(三起)
- 二年級數(shù)學(xué)上冊第六單元7的乘法口訣課件蘇教版
- 經(jīng)濟(jì)學(xué)基礎(chǔ)高職PPT完整全套教學(xué)課件
- 關(guān)于學(xué)生會主席的就職演講稿
- 《體前變向換手運球》教學(xué)課件
評論
0/150
提交評論