操作系統(tǒng)實(shí)驗(yàn)報(bào)告(貪吃蛇游戲)_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告(貪吃蛇游戲)_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告(貪吃蛇游戲)_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告(貪吃蛇游戲)_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告(貪吃蛇游戲)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

南通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院操作系統(tǒng)試驗(yàn)報(bào)告書試驗(yàn)題目貪吃蛇游戲?qū)I(yè)班級(jí)XXXXXX學(xué)生姓名XXXXX指導(dǎo)教師XXXX日期2017年6月主要內(nèi)容(一)設(shè)計(jì)內(nèi)容:在Windows9x/2000/XP/ME操作系統(tǒng)下,使用VC、VB、Java或C等編程語(yǔ)言,采用多道程序設(shè)計(jì)技術(shù)編寫一個(gè)游戲軟件或解決一個(gè)簡(jiǎn)單的實(shí)際問(wèn)題,要求設(shè)計(jì)一個(gè)兩道以上的程序,可以是固定的2道程序、也可以是靈活的多道模式。設(shè)計(jì)的內(nèi)容可以是下面任選其一:(1)用多道程序技術(shù)實(shí)現(xiàn)一個(gè)游戲程序。如大炮打飛機(jī)、賽車比賽等。用多道程序技術(shù)模擬客觀世界中一個(gè)多任務(wù)實(shí)際問(wèn)題的解決。(二)設(shè)計(jì)要求:本程序可運(yùn)行在Windows9x/2000/XP/ME操作系統(tǒng)下,可安裝到任意路徑下。采用多進(jìn)程或多線程方式運(yùn)行,盡量體現(xiàn)進(jìn)程間的同步和互斥關(guān)系。(3)經(jīng)調(diào)試后程序能夠正常運(yùn)行,并體現(xiàn)多道程序的特點(diǎn)。(三)實(shí)驗(yàn)?zāi)康模赫莆者M(jìn)程和線程的概念。掌握進(jìn)程控制原語(yǔ)或進(jìn)程控制系統(tǒng)調(diào)用的使用掌握多道程序設(shè)計(jì)的基本理論、方法和技術(shù)。掌握相關(guān)語(yǔ)言進(jìn)程控制的API函數(shù)的使用。培養(yǎng)學(xué)生多道程序設(shè)計(jì)的能力。培養(yǎng)學(xué)生團(tuán)隊(duì)合作的能力。實(shí)驗(yàn)的選擇:用多道程序技術(shù)實(shí)現(xiàn)一個(gè)游戲程序。游戲:《貪吃蛇》實(shí)驗(yàn)思想:1.首先制作游戲的窗體布局。其中包括窗體的大小,位置,添加按鈕組件,在窗體上面劃定游戲區(qū)域等。2.為按鈕添加監(jiān)聽器,為開始按鈕,結(jié)束按鈕,鍵盤,還有游戲結(jié)束的時(shí)候的確定按鈕.3.單擊開始按鈕,看到的效果是在游戲區(qū)域里面看到一個(gè)隨機(jī)產(chǎn)生的食物,和蛇體。產(chǎn)生隨見事物使用Random類,隨機(jī)定位一個(gè)游戲區(qū)域里面的方塊,然后使用Graphrics可以定位到這個(gè)方塊的坐標(biāo)圖上顏色,這樣就產(chǎn)生了肉眼可見的食物。關(guān)于蛇體,我們將蛇體的每個(gè)方塊添加到集合里面,使用的是List,為什么不用數(shù)組,原因是數(shù)組的長(zhǎng)度總是有限的,你不知道蛇體里面最終存放多少方格,而且數(shù)組比較繁瑣。我們將蛇體的每個(gè)方塊另外創(chuàng)建一個(gè)類(蛇體的每個(gè)方格)snakeAct,包含成員變量方格的坐標(biāo),每個(gè)snakeAct對(duì)象實(shí)例就是一個(gè)方塊,將這個(gè)對(duì)象添加到列表List中就好了,然后再用Graphics,循環(huán)畫出列表中的每個(gè)對(duì)象,就成功的畫出了蛇體。設(shè)置蛇體的初始長(zhǎng)度只有蛇頭,并設(shè)置蛇頭的初始位置為居中。4.通過(guò)方向鍵設(shè)置蛇頭的移動(dòng),定義move()方法,蛇頭每移動(dòng)一次位置就會(huì)變化到另外一個(gè)方塊,對(duì)應(yīng)的坐標(biāo)x,y都是有相應(yīng)的變化,例如按下UP鍵,坐標(biāo)的變化就是,x不變,y減1。5.蛇頭可以運(yùn)動(dòng)只有面臨的問(wèn)題就是要吃食物,而吃食物的過(guò)程是在移動(dòng)過(guò)程中,所以在move()方法中添加eat()方法,吃到食物的條件是蛇頭的坐標(biāo)和食物的坐標(biāo)對(duì)應(yīng)相等,蛇頭吃到食物的過(guò)程就是將列表中沒(méi)有吃到食物前的最后一個(gè)方格重新畫一遍,這樣列表的長(zhǎng)度就加一,而列表中的對(duì)象就多了一個(gè)。6.將食物添加到列表中之后,仍然只是蛇頭可以移動(dòng),讓蛇體跟著蛇頭移動(dòng)定義othermove()方法,就是將蛇體的每個(gè)蛇塊替換移動(dòng)前的前一個(gè)蛇塊的坐標(biāo),這樣在移動(dòng)只有,整個(gè)蛇體就可以移動(dòng)了,othermove方法也寫在move()方法里面,move()方法寫在鍵盤的監(jiān)聽方法里面。7.撞墻的或者蛇頭撞到自己的身體,可以再move()方法里面進(jìn)行預(yù)判,如果蛇頭移動(dòng)滿足判定條件,才可以移動(dòng),若蛇頭碰到墻壁或者自己的身體,彈出對(duì)話框,點(diǎn)擊確定按鈕,恢復(fù)初始化,清空列表。開始游戲開始游戲蛇開始移動(dòng)根據(jù)鍵盤控制蛇的移動(dòng)方向暫停是否判斷蛇頭和食物的坐標(biāo)是否重合是否繼續(xù) 是否隨機(jī)生成下一個(gè)食物 是否判斷蛇頭和自身及墻、炸彈是否重合是游戲結(jié)束詳細(xì)設(shè)計(jì):1.貪吃蛇的本體設(shè)計(jì)貪吃蛇的頭部擁有一個(gè)坐標(biāo)(x,y),蛇體有一個(gè)長(zhǎng)度length,蛇有一個(gè)運(yùn)動(dòng)方向direct,故定義一個(gè)結(jié)構(gòu)體如下:structSnake{intx,y;intlen;intdirect;}Snake[20];2.貪吃蛇食物設(shè)計(jì)貪吃蛇的食物有一個(gè)坐標(biāo)(x,y),此食物有一個(gè)標(biāo)志isfood,當(dāng)isfood為0時(shí),表示食物還沒(méi)被吃,為1時(shí),表示被吃。structFood{intx;inty;intisfood;}Food;(八)具體模塊實(shí)現(xiàn):#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<conio.h>#include<cmath>#include<windows.h>usingnamespacestd;HANDLEhout=GetStdHandle(STD_OUTPUT_HANDLE);COORDcoord;voidlocate(intx,inty){coord.X=y;coord.Y=x;SetConsoleCursorPosition(hout,coord);};voidhide(){CONSOLE_CURSOR_INFOcursor_info={1,0};SetConsoleCursorInfo(hout,&cursor_info);}doublerandom(doublestart,doubleend){returnstart+(end-start)*rand()/(RAND_MAX+1.0);}intm,n;structnode{intx,y;}snake[1000];intsnake_length,dir;nodefood;intdirect[4][2]={{-1,0},{1,0},{0,-1},{0,1}};voidprint_wall(){cout<<"";for(inti=1;i<=n;i++)cout<<"-";cout<<endl;for(intj=0;j<=m-1;j++){cout<<"|";for(inti=1;i<=n;i++)cout<<"";cout<<"|"<<endl;}cout<<"";for(inti=1;i<=n;i++)cout<<"-";}voidprint_snake(){locate(snake[0].x,snake[0].y);cout<<"@";for(inti=1;i<=snake_length-1;i++){locate(snake[i].x,snake[i].y);cout<<"*";}}boolis_correct(){if(snake[0].x==0||snake[0].y==0||snake[0].x==m+1||snake[0].y==n+1)returnfalse;for(inti=1;i<=snake_length-1;i++){if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y)returnfalse;}returntrue;}boolprint_food(){srand((unsigned)time(0));boole;while(1){e=true;inti=(int)random(0,m)+1,j=(int)random(0,n)+1;food.x=i;food.y=j;for(intk=0;k<=snake_length-1;k++){if(snake[k].x==food.x&&snake[k].y==food.y){e=false;break;}}if(e)break;}locate(food.x,food.y);cout<<"$";returntrue;}boolgo_ahead(){nodetemp;boole=false;temp=snake[snake_length-1];for(inti=snake_length-1;i>=1;i--)snake[i]=snake[i-1];snake[0].x+=direct[dir][0];snake[0].y+=direct[dir][1];locate(snake[1].x,snake[1].y);cout<<"*";if(snake[0].x==food.x&&snake[0].y==food.y){snake_length++;e=true;snake[snake_length-1]=temp;}if(!e){locate(temp.x,temp.y);cout<<"";}elseprint_food();locate(snake[0].x,snake[0].y);cout<<"@";if(!is_correct()){system("cls");cout<<"Youlose!"<<endl<<"Length:"<<snake_length<<endl;returnfalse;}returntrue;}intmain(){cout<<"--------------------貪吃蛇---------------------"<<endl;cout<<"請(qǐng)先輸入兩個(gè)數(shù),表示地圖大小.要求長(zhǎng)寬均不小于10."<<endl;cout<<"請(qǐng)注意窗口大小,以免發(fā)生錯(cuò)位.建議將窗口調(diào)為最大."<<endl;cout<<"再選擇難度.請(qǐng)?jiān)?-10中輸入1個(gè)數(shù),1最簡(jiǎn)單,10則最難"<<endl;cout<<"然后進(jìn)入游戲畫面,以方向鍵控制方向.祝你游戲愉快!"<<endl;cout<<"-----------------------------------------------"<<endl;cin>>m>>n;if(m<10||n<10||m>25||n>40){cout<<"ERROR"<<endl;system("pause");return0;}inthard;cin>>hard;if(hard<=0||hard>100){cout<<"ERROR"<<endl;system("pause");return0;}snake_length=5;clock_ta,b;charch;doublehard_len;for(inti=0;i<=4;i++){snake[i].x=1;snake[i].y=5-i;}dir=3;system("cls");hide();print_wall();print_food();print_snake();locate(m+2,0);cout<<"Nowlength:";while(1){hard_len=(double)snake_length/(double)(m*n);a=clock();while(1){b=clock();if(b-a>=(int)(400-30*hard)*(1-sqrt(hard_len)))break;}if(kbhit()){ch=getch();if(ch==-32){ch=getch();switch(ch){case72:if(dir==2||dir==3)dir=0;break;case80:if(dir==2||dir==3)dir=1;break;case75:if(dir==0||dir==1)dir=2;break;case77:if(dir==0||dir==1)dir=3;break;}}}if(!go_ahead())break;locate(m+2,12);cout<<snake_length;}system("pause");return0;}上機(jī)調(diào)適及運(yùn)行結(jié)果:參考文獻(xiàn):《C++程序設(shè)計(jì)教程》《操作系統(tǒng)》《數(shù)據(jù)結(jié)構(gòu)》管致錦徐慧陳德裕清華大學(xué)出版社附分工總結(jié)1號(hào):這次實(shí)驗(yàn)我負(fù)責(zé)做了游戲的全局框架,給組員分配了一些任務(wù)便于合作完成。我自己負(fù)責(zé)了食物的生成,一開始想的很簡(jiǎn)單,將游戲區(qū)域化成一個(gè)大的二維數(shù)組,另外寫一個(gè)隨即函數(shù)用于生成隨機(jī)數(shù),用隨機(jī)數(shù)組成坐標(biāo)作為生成食物的位置,初次編寫很順利,但是經(jīng)過(guò)多次調(diào)試后發(fā)現(xiàn)漏洞很大,首先食物不能生成在蛇身的位置,需要再添加一條確認(rèn)函數(shù),然后食物與蛇頭的碰撞事件函數(shù)花費(fèi)了不少事件,由于多人合作的遠(yuǎn)古,還需要先弄清組原對(duì)于游戲的認(rèn)知和編寫思路、參數(shù)定義等,這些方面經(jīng)過(guò)多次協(xié)調(diào)修改之后終于得到了解決。最后有一個(gè)問(wèn)題難住了我們,就是關(guān)于食物實(shí)例經(jīng)過(guò)碰撞事件后需要銷毀,但是內(nèi)存卻一直占用得不到回收的問(wèn)題,一直沒(méi)有得到很好的解決,最后求助貼吧,使用解散和激活函數(shù),終于成功解決,使得游戲的進(jìn)行更加流暢了,并且長(zhǎng)時(shí)間的游戲也不會(huì)導(dǎo)致游戲卡頓占用計(jì)算機(jī)過(guò)大的內(nèi)存,這應(yīng)該算是游戲的一個(gè)優(yōu)化了。經(jīng)過(guò)這次長(zhǎng)達(dá)三個(gè)月的實(shí)驗(yàn),我發(fā)現(xiàn)程序的編寫不是想象的那么簡(jiǎn)單,每一步都需要多次演算一絲不茍精確無(wú)誤,否則一步錯(cuò)步步錯(cuò),不能及時(shí)發(fā)現(xiàn)的話最后需要花大量的時(shí)間也不一定能找出錯(cuò)誤進(jìn)行修正。另外,多人合作也使得編寫加快了不少,只要能夠溝通好,合作無(wú)間,解決問(wèn)題會(huì)變?nèi)菀缀芏唷?號(hào):貪吃蛇游戲程序設(shè)計(jì)關(guān)鍵在于表示蛇的圖形及蛇的移動(dòng)。用一個(gè)小矩形快表示蛇的一節(jié)身體,身體每長(zhǎng)一節(jié),增加一個(gè)矩形塊,蛇頭(綠色)用三節(jié)表示。移動(dòng)時(shí)必須從蛇頭開始,所以蛇不可以向相反的方向移動(dòng),如果不按任意鍵,蛇自行在當(dāng)前方向右前移,但按下有效方向鍵后,蛇頭朝該方向移動(dòng),一步移動(dòng)一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇的身體隨蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從蛇頭新位置開始畫出蛇,這時(shí),由于未清屏的原因,原來(lái)的蛇的位置和新的位置差一個(gè)單位,所以看起來(lái)蛇多一節(jié)身體,所以將蛇的最后節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫矩形塊和覆蓋矩形塊。為了便于理解,定義兩個(gè)結(jié)構(gòu)體:食物與蛇,同時(shí)還定義了一個(gè)隨意的墻。然后利用圖形驅(qū)動(dòng),,制作美觀的游戲界面,通過(guò)隨機(jī)函數(shù)產(chǎn)生隨機(jī)的食物,控制游戲過(guò)程食物的出現(xiàn)。定義鍵盤操作控制游戲過(guò)程蛇的移動(dòng)方向,畫出邊界,并判斷游戲是否結(jié)束,統(tǒng)計(jì)游戲過(guò)程中蛇吃的食物數(shù)量,計(jì)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論