貪吃蛇課程設(shè)計(jì)報(bào)告.doc_第1頁(yè)
貪吃蛇課程設(shè)計(jì)報(bào)告.doc_第2頁(yè)
貪吃蛇課程設(shè)計(jì)報(bào)告.doc_第3頁(yè)
貪吃蛇課程設(shè)計(jì)報(bào)告.doc_第4頁(yè)
貪吃蛇課程設(shè)計(jì)報(bào)告.doc_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本 科 課 程 設(shè) 計(jì)貪吃蛇游戲設(shè)計(jì)摘要2Abstract3一詳細(xì)設(shè)計(jì)31.屬性解釋32.初始化坐標(biāo):33.調(diào)用線程44.具體功能實(shí)現(xiàn):44.1.移動(dòng)功能的實(shí)現(xiàn):44.2.吃食物功能實(shí)現(xiàn):54.3.判斷游戲是否結(jié)束的功能實(shí)現(xiàn):74.4.畫(huà)圖方法的實(shí)現(xiàn)84.5.監(jiān)聽(tīng)鍵盤(pán)動(dòng)作:95.界面的設(shè)計(jì):105.1進(jìn)入程序界面設(shè)計(jì)105.2第2個(gè)界面的設(shè)計(jì):105.3第3個(gè)界面設(shè)計(jì):116.把程序植入手機(jī)中12二字符設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)12三總結(jié):13四參考文獻(xiàn):13五 致謝14摘要程序核心思想:運(yùn)行程序首界面(進(jìn)入游戲,退出游戲)進(jìn)入游戲后選擇難度(簡(jiǎn)單,普通,高難)根據(jù)不同的難度設(shè)置相應(yīng)的屬性。進(jìn)入游戲界面。首先初始化蛇的坐標(biāo),食物的坐標(biāo),和障礙物的坐標(biāo)。然后獲取當(dāng)前屏幕的大小為將來(lái)的邊界判斷做準(zhǔn)備。然后創(chuàng)建并執(zhí)行線程。線程基本流程:判斷是否是暫停階段,如果沒(méi)有暫停就執(zhí)行:eatFood();move(direction); repaint();如果游戲結(jié)束了就重新游戲或者退出。 AbstractCore of the process: first running the program interface (into the game, withdraw from the game) into the game after the difficult choice of (simple, ordinary, highly difficult) depending on the difficulty of setting the corresponding attribute. Into the game interface. First initialize the coordinates of the snake, coordinates food, and the coordinates of obstructions. And access to the size of the current screen for the future of the border to prepare for judgement. And then create and execution threads. Thread the basic process: determine whether the stage is suspended, if not the moratorium on the implementation of: eatFood (); move (direction); repaint (); game to an end if the game or out on the re.一詳細(xì)設(shè)計(jì)1.屬性解釋用1個(gè)2維數(shù)組snake2002存放蛇身坐標(biāo),第2維是0的時(shí)候代表橫坐標(biāo),為1的時(shí)候?yàn)榭v坐標(biāo)。第1維數(shù)字代表蛇身方塊的數(shù)字,例如snake00 就代表蛇頭的橫坐標(biāo)snake11就代表第2個(gè)方塊的總坐標(biāo)。snakeNum為蛇的長(zhǎng)度(以方格為單位)。SNAKEWIDTH為方格大小。direction;為移動(dòng)方向,zhangai0x,zhangai1x,zhangai2x,zhangai3x,zhangai0y,zhangai1y,zhangai2y,zhangai3y,為障礙物的坐標(biāo)。foodx,foody為食物的坐標(biāo)。isPaused為判定是否是暫停狀態(tài),true為暫停false為非暫停。A為難度系數(shù),a可以為1,2,3。1的時(shí)候最難,3的時(shí)候最簡(jiǎn)單。SLEEP_TIME為系統(tǒng)沉睡時(shí)間,其值越小速度越快。2.初始化坐標(biāo): isPaused = true; / 設(shè)置游戲開(kāi)始為暫停狀態(tài) snakeNum = 7; /設(shè)置蛇身長(zhǎng)度7個(gè)方格/ 循環(huán)依次初始化蛇身沒(méi)個(gè)方格的坐標(biāo),蛇頭的坐標(biāo)為(100,40) for(int i = 0;i 0;i-) snakei0 = snakei - 10; snakei1 = snakei - 11; /蛇頭坐標(biāo)的移動(dòng) switch(direction) case DIRECTION_UP: snake01 = snake01 - SNAKEWIDTH; break; case DIRECTION_DOWN: snake01 = snake01 + SNAKEWIDTH; break; case DIRECTION_LEFT: snake00 = snake00 - SNAKEWIDTH; break; case DIRECTION_RIGHT: snake00 = snake00 + SNAKEWIDTH; break; 坐標(biāo)移動(dòng)的總體思想:1. 蛇身的移動(dòng):移動(dòng)的時(shí)候,后面的方格要到前面方格的位置,也就是要讓后面的方格的坐標(biāo)變成前面方格的坐標(biāo)。即把前面方格的坐標(biāo)賦值給后面的方格坐標(biāo)。就是讓最后方格的坐標(biāo)變成倒數(shù)第2個(gè)方格的坐標(biāo),倒數(shù)第2個(gè)方格坐標(biāo)變成倒數(shù)第3個(gè)方格坐標(biāo),依次類(lèi)推直到第2個(gè)方格變成第1個(gè)方格的坐標(biāo)。這樣我們循環(huán)都最后還沒(méi)有第1個(gè)方格的坐標(biāo),所以我們另將蛇頭的坐標(biāo)賦值。2. 蛇頭的移動(dòng):這和蛇當(dāng)前移動(dòng)的方向有關(guān),以向上移動(dòng)為例,那蛇頭的坐標(biāo)應(yīng)該橫坐標(biāo)不變,縱坐標(biāo)減去方格的長(zhǎng)度,因?yàn)樵谄聊簧献笊宵c(diǎn)為(0,0)越往左橫坐標(biāo)越大,越往下縱坐標(biāo)越大。所以向上移動(dòng)縱坐標(biāo)要減小。其他方向的坐標(biāo)運(yùn)算如上述代碼,也不難解釋。注意:關(guān)于蛇身移動(dòng)的循環(huán)for(int i = snakeNum - 1;i 0;i-) 他是先給后面的值賦值最后循環(huán)到正數(shù)第2個(gè)方格。開(kāi)始我想反過(guò)來(lái),從第2個(gè)開(kāi)始賦值再循環(huán)都最后,實(shí)驗(yàn)的時(shí)候卻和以前的方式運(yùn)行結(jié)果不一樣。移動(dòng)的時(shí)候蛇不管有多長(zhǎng)就只能看到2個(gè)方格在移動(dòng)。后來(lái)發(fā)現(xiàn),我這樣改是不對(duì)的,按照我的思路a10=a00;a20=a10;.仔細(xì)看后就發(fā)現(xiàn)我把a(bǔ)00的值賦給a10又把a(bǔ)10的值賦給a20,我樣有值的覆蓋,也就是我讓蛇身的所有方格的值全是a00的,再家上蛇頭移動(dòng)后蛇頭的新坐標(biāo),屏幕上就只有2個(gè)方格了。4.2.吃食物功能實(shí)現(xiàn):private void eatFood() /判別蛇頭是否和食物重疊 if(snake00 = foodX & snake01 = foodY) snakeNum+; generateFood(); /* * 產(chǎn)生食物 * 說(shuō)明:食物的坐標(biāo)必須位于屏幕內(nèi),且不能和蛇身重合 */ private void generateFood() while(true) foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH; foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH; zhangai0x=foodX+4*a; zhangai0y=foodY+4*a; zhangai1x=foodX+4*a; zhangai1y=foodY-4*a; zhangai2x=foodX-4*a; zhangai2y=foodY+4*a; zhangai3x=foodX-4*a; zhangai3y=foodY-4*a; boolean b = true; for(int i = 0;i snakeNum;i+) if(foodX = snakei0 & snakei1 = foodY) b = false; break; if(b) break; 該功能的總體思路:如果蛇頭的坐標(biāo)和食物的坐標(biāo)一樣,也就是吃到了食物,蛇的長(zhǎng)度+1并且產(chǎn)生新的食物。生成食物的方法:隨機(jī)生成新的坐標(biāo)賦值給食物坐標(biāo)。并要保證隨機(jī)生成的坐標(biāo)在屏幕內(nèi)而且隨機(jī)生成的食物坐標(biāo)不能和蛇身重合。生成新的食物后,在食物周?chē)尚碌恼系K物坐標(biāo)。隨機(jī)產(chǎn)生食物坐標(biāo)的方法:foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH;說(shuō)來(lái)慚愧直到現(xiàn)在我還是不明白為什么經(jīng)過(guò)這樣的運(yùn)算后得到的坐標(biāo)就一定在屏幕內(nèi)。但我至少知道這樣的運(yùn)算可以得到必在屏幕內(nèi)的坐標(biāo)。4.3.判斷游戲是否結(jié)束的功能實(shí)現(xiàn): public boolean isGameOver() /邊界判別 if(snake00 (width - SNAKEWIDTH) | snake01 (height - SNAKEWIDTH) return true; /碰到自身 for(int i = 4;i (width - SNAKEWIDTH)呢?因?yàn)槠渥鴺?biāo)是方格左上頂點(diǎn)的坐標(biāo),當(dāng)蛇頭的左上頂點(diǎn)與屏幕右面相隔方格邊長(zhǎng)的時(shí)候,其實(shí)蛇頭已經(jīng)碰到屏幕的右邊。4.4.畫(huà)圖方法的實(shí)現(xiàn)protected void paint(Graphics g) /清屏 g.setColor(0xffffff); /畫(huà)筆設(shè)置成白色 g.fillRect(0,0,width,height); /把整個(gè)屏幕都繪制成白色 g.setColor(0); /把畫(huà)筆再設(shè)置成黑色 /繪制蛇身 for(int i = 0;i snakeNum;i+) g.fillRect(snakei0,snakei1,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai0x,zhangai0y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai1x,zhangai1y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai2x,zhangai2y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai3x,zhangai3y,SNAKEWIDTH,SNAKEWIDTH); /繪制食物 if(b) g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH); if(isGameOver() g.drawString(Game Over, 60, 60, Graphics.TOP | Graphics.LEFT); 總體思路:首先清空屏幕內(nèi)的內(nèi)容,然后畫(huà)出當(dāng)前的蛇,食物,障礙物,因?yàn)樵摲椒ㄊ窃诰€程中被循環(huán)調(diào)用的。每隔SLEEP_TIME就被執(zhí)行1次,在循環(huán)中以為其他方法的調(diào)用,蛇,食物,障礙物的坐標(biāo)是在變化的,這樣在不停的繪畫(huà)新坐標(biāo)的過(guò)程中,就形成了動(dòng)畫(huà)效果。1.清空屏幕內(nèi)容的方法:因?yàn)槲覀兿氘?huà)的蛇的顏色是黑色,我們先把畫(huà)筆設(shè)置成白色,然后把整個(gè)屏幕都繪制成白色,因?yàn)闆](méi)畫(huà)東西的時(shí)候屏幕也是百的,這樣我們看到屏幕中就什么也沒(méi)有了。然后我們?cè)侔旬?huà)筆設(shè)置成黑色,畫(huà)將要畫(huà)的內(nèi)容。2.繪制方格的方法:利用fillRect(a,b,c,d)方法進(jìn)行繪制。a,b為方格的左上頂點(diǎn)坐標(biāo),c為以(a,b)為頂點(diǎn)的長(zhǎng)度,d為高度,畫(huà)完的結(jié)果就是以(a,b)為左上頂點(diǎn),c為長(zhǎng)度d為高度的矩形被畫(huà)筆添滿(mǎn)顏色,因?yàn)槲覀冊(cè)O(shè)置的畫(huà)筆顏色為黑色,所以我們看到的是全黑的方格。3.在屏幕中顯示字體的方法:drawString(Game Over, 60, 60, Graphics.TOP | Graphics.LEFT)第1個(gè)參數(shù)為要寫(xiě)字的內(nèi)容,第2,3個(gè)參數(shù)是顯示的坐標(biāo)位置,第4個(gè)參數(shù)是用來(lái)確定原點(diǎn),這我也是從網(wǎng)上查到的。在Graphics類(lèi)里public static final int LEFT=4; public static final int TOP=16;還有其他類(lèi)似的值都是2的N次方。這樣做的目的就在于,當(dāng)兩個(gè)或多個(gè)錨點(diǎn)定位方式通過(guò)位與的方法計(jì)算后,根據(jù)這個(gè)計(jì)算得到的和可以還原回參與位與計(jì)算的各個(gè)數(shù)值,從而得到有幾種錨點(diǎn)定位方式,然后J2ME根據(jù)還原回的值來(lái)設(shè)置錨點(diǎn)的位置。4.食物閃現(xiàn):在繪畫(huà)食物的時(shí)候if(b) g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH); 只有b是真值的時(shí)候才畫(huà)方格,也就是b是假值的時(shí)候是不畫(huà)的。這樣做是因?yàn)樵诰€程中每循環(huán)1次就執(zhí)行1次b=!b;這樣b的值在真與假之間來(lái)回變化,食物也在屏幕中出現(xiàn),不出現(xiàn),出現(xiàn),不出現(xiàn),這樣就形成了食物閃爍的效果。與障礙形成對(duì)比,使用戶(hù)看的更方便。4.5.監(jiān)聽(tīng)鍵盤(pán)動(dòng)作:public void keyPressed(int keyCode) int action = this.getGameAction(keyCode); /改變方向 switch(action) case UP: if(direction != DIRECTION_DOWN) direction = DIRECTION_UP; break; case DOWN: if(direction != DIRECTION_UP) direction = DIRECTION_DOWN; break; case LEFT: if(direction != DIRECTION_RIGHT) direction = DIRECTION_LEFT; break; case RIGHT: if(direction != DIRECTION_LEFT) direction = DIRECTION_RIGHT; break; case FIRE: /暫停和繼續(xù) isPaused = !isPaused; break; 用getGameAction(keyCode)方法獲取當(dāng)前對(duì)鍵盤(pán)的操作,以上為例case UP: if(direction != DIRECTION_DOWN) direction = DIRECTION_UP; break;首先想要蛇移動(dòng)的方向變成上,要判斷當(dāng)前蛇的移動(dòng)方向是否是向下,因?yàn)楫?dāng)蛇是向下移動(dòng)的時(shí)候,不能讓蛇變成向下移動(dòng),所以要想蛇想上移動(dòng),要先判斷蛇當(dāng)前移動(dòng)的方向不是向下。5.界面的設(shè)計(jì):5.1進(jìn)入程序界面設(shè)計(jì)執(zhí)行程序首先進(jìn)入的界面進(jìn)入游戲和退出游戲的選擇。如果進(jìn)入進(jìn)入第2個(gè)界面,如果退出就退出程序。private TextBox textbox; /定義匡private Command enter; /定義按狃private Command exit;enter=new Command(Enter,Command.OK,1); /設(shè)置按狃信息exit=new Command(Exit,Command.OK,1);textbox=new TextBox(SnakeGame,40,0); /設(shè)置文本匡textbox.addCommand(enter); /添加按鈕到匡里textbox.addCommand(exit);textbox.setCommandListener(this); /監(jiān)聽(tīng)public void commandAction(Command arg0,Displayable arg1) if(arg0=enter) display.setCurrent(textbox2); if(arg0=exit) destroyApp(false); notifyDestroyed(); 5.2第2個(gè)界面的設(shè)計(jì):選擇難度(簡(jiǎn)單,普通,高難)然后進(jìn)入相應(yīng)的難度游戲TextBox textbox2;Command jiandan;Command putong;Command gaonan;jiandan=new Command(jiandan,Command.OK,1);putong=new Command(putong,Command.OK,1);gaonan=new Command(gaonan,Command.OK,1);textbox2=new TextBox(nanduxuanze,40,0);textbox2.addCommand(jiandan);textbox2.addCommand(putong);textbox2.addCommand(gaonan);textbox2.addCommand(exit);textbox2.setCommandListener(this);if(arg0=gaonan) displayable.setA(1); display.setCurrent(displayable); if(arg0=putong) displayable.setA(2); display.setCurrent(displayable); if(arg0=jiandan) displayable.setA(3); display.setCurrent(displayable);5.3第3個(gè)界面設(shè)計(jì):在游戲中可以修改游戲難度,游戲結(jié)束的時(shí)候可以重新游戲,可以 隨時(shí)推出游戲。private Command restart;restart=new Command(Restart,Command.OK,1);displayable.addCommand(gaonan); / displayable是執(zhí)行游戲類(lèi)的對(duì)象displayable.addCommand(putong);displayable.addCommand(jiandan); displayable.addCommand(restart);displayable.addCommand(exit2);displayable.setCommandListener(this);/想要重新游戲,就想設(shè)置當(dāng)前游戲結(jié)束,重新初始化數(shù)據(jù)即restart()方法,然后在開(kāi)始游戲if(arg0=restart) displayable.setGameOver(); displayable.restart(); display.setCurrent(displayable);其中display=Display.getDisplay(this);然后對(duì)display對(duì)象使用display對(duì)象是獲取當(dāng)前Display的信息,我們可以理解成display對(duì)象現(xiàn)在盛放的是1個(gè)像框SnakeCanvas displayable = new SnakeCanvas(); SnakeCanvas類(lèi)中是相關(guān)于游戲本身的程序Displayable對(duì)象現(xiàn)在可以理解成盛放的是相片內(nèi)容display.setCurrent(displayable); 這樣我們就可以理解成把相片里的內(nèi)容放進(jìn)像框里。6.把程序植入手機(jī)中如何把程序傳進(jìn)手機(jī)使起運(yùn)行:由于實(shí)驗(yàn)是前幾天做的,現(xiàn)在有些細(xì)節(jié)忘記了,只能憑印象寫(xiě)了。1. 打開(kāi)WTK2.5.2。2. 創(chuàng)建1個(gè)package,包的名字可隨意起但下面的要起成繼承MIDlet的類(lèi)名。3. 點(diǎn)擊創(chuàng)建右面的名字忘記了,設(shè)置第1個(gè)菜單為custerm下面什么忘記了選2.0然后OK。4. 然后把程序的workspace中的src文件下的代碼復(fù)制到WTK中的src下。具體位置在C盤(pán),什么什么SET。具體名字忘了,然后選J2ME。,然后apps,然后好象就能看到src目錄了。5. 然后build一下,然后在上面有個(gè)按鈕名字忘了,點(diǎn)完之后有個(gè)創(chuàng)建package。6. 在WTK下的bin文件下就能找到轉(zhuǎn)化好的jar文件,把他拷貝到手機(jī)就可以運(yùn)行了。二字符設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)實(shí)驗(yàn)題目:字符設(shè)備驅(qū)動(dòng)程序?qū)嶒?yàn)?zāi)康模簩?shí)現(xiàn)嵌入式Linux系統(tǒng)下的字符設(shè)備驅(qū)動(dòng)程序,要求動(dòng)態(tài)生成設(shè)備號(hào),并在測(cè)試程序中,通過(guò)超級(jí)終端分行顯示數(shù)039,可參考demo驅(qū)動(dòng)程序?qū)嶒?yàn)過(guò)程。上述過(guò)程需在板子端進(jìn)行,執(zhí)行動(dòng)態(tài)加載驅(qū)動(dòng),并通過(guò)超級(jí)終端監(jiān)視測(cè)試程序運(yùn)行結(jié)果。實(shí)驗(yàn)過(guò)程:1. 打開(kāi)虛擬機(jī),新建終端,找到demo文件Up-techpxa270-exp-drives-01.-找到demo 文件2. 輸入以下命令vi demo.c vi demotest.c,可以查看目錄,修改輸入數(shù)字的個(gè)數(shù)和方式,里面有個(gè)錯(cuò)誤,就是主設(shè)備號(hào)那沒(méi)有返回值,需要修改。修改方法只需要把上面那的返回代碼,一樣的寫(xiě)1遍。3. 輸入命令make 生成.o文件。4. 連接好扳子,打開(kāi)超級(jí)終端。5. 掛載虛擬機(jī)那邊的 up-techpxa270文件,我機(jī)器虛擬機(jī)IP為192.168.0.123掛載到mnt目錄下。 具體命令:mount o nolock 192.168.0.123:/up-techpxa270/ /mnt6. mnt-exp-drives-01.-找到demo.o文件7. 創(chuàng)建目錄 mkdir /dev/demo8. 創(chuàng)建節(jié)點(diǎn) mknod /dev/demo c 254 09. 加載驅(qū)動(dòng) insmod demo.ko10. 執(zhí)行程序 . / demotest即可完成實(shí)驗(yàn)要求,顯示出0到39的數(shù)字。三

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論