貪吃蛇實訓(xùn)總結(jié)報告_第1頁
貪吃蛇實訓(xùn)總結(jié)報告_第2頁
貪吃蛇實訓(xùn)總結(jié)報告_第3頁
貪吃蛇實訓(xùn)總結(jié)報告_第4頁
貪吃蛇實訓(xùn)總結(jié)報告_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

鄭州輕工業(yè)學(xué)院實訓(xùn)匯報實訓(xùn)名稱:貪吃蛇指導(dǎo)老師:姓名:學(xué)號:班級:提交日期: 一.試驗?zāi)繕私?jīng)過開發(fā)一款貪吃蛇游戲程序,熟練掌握C#編程語言、和面向?qū)ο蟪绦蛟O(shè)計方法,獨立完成一個游戲程序開發(fā)。二.試驗題目此次實訓(xùn)題目為貪吃蛇。經(jīng)過使用C#編程語言來實現(xiàn)。三.功效描述1.游戲基礎(chǔ)功效描述游戲場地是一片矩形區(qū)域空地組成,蛇能夠在這片定義區(qū)域中自由移動。定義一個Block來組成石塊,蛇頭,蛇身和豆。蛇由蛇頭和蛇身組成。當游戲開始以后,定義區(qū)域中出現(xiàn)一顆豆和一條蛇,而且蛇不停地移動,蛇移動方向和蛇頭方向一致。經(jīng)過space或暫停鍵能夠使游戲停止,蛇停止移動,分數(shù)停止積分。當蛇移動時,玩家能夠使用“↑”、“↓”、“←”和“→”四個方向鍵改變蛇移動方向。當蛇頭和豆位置重合時,豆被蛇吃掉,同時在草坪中再生成一顆新豆,蛇身增加一節(jié)。當蛇頭碰到石塊時,蛇死亡,游戲結(jié)束。當蛇頭咬到蛇身時,則蛇死亡,游戲結(jié)束。當蛇頭碰到草坪四面時,蛇立即斃命,游戲結(jié)束。游戲分為不一樣等級,第一關(guān)游戲速度為200,當蛇吃五個豆子就能夠過關(guān),等級顯示為2,速度增加100變?yōu)?00.第二關(guān)為吃夠10個豆子,速度增加50,以后以這類推。游戲菜單中設(shè)有游戲幫助,玩家能夠經(jīng)過點擊幫助了解游戲玩法。對于不是第一次玩玩家能夠改變蛇運動速度,來增加難度。在菜單中設(shè)有加速和減速兩個鍵,單擊能夠改變速度。游戲菜單中還有時間顯示。當游戲暫停時,能夠經(jīng)過“繼續(xù)”鍵使游戲繼續(xù)進行。四.需求分析本游戲用戶能夠自己練習(xí)和娛樂。本游戲需要滿足以下幾點要求:利用方向鍵“↑、↓、←、→”來改變蛇運行方向??崭矜I暫停游戲,并在隨機地方產(chǎn)生食物。吃到食物就變成新蛇體,碰到壁或本身則游戲結(jié)束,不然正常運行??尚行苑治觯贺澇陨哂螒蚴且粋€簡單大眾游戲,自從計算機實現(xiàn)以來,深受廣大電腦玩家喜愛,做一個簡單貪吃蛇小游戲。貪吃蛇關(guān)鍵算法是怎樣實現(xiàn)蛇移動和吃掉食物后怎樣變成新蛇體。沒有碰到食物時候,把目前運動方向上下個節(jié)點入隊,并以蛇節(jié)點顏色繪制這個節(jié)點,然后把頭指針所指節(jié)點出隊,并以游戲框架內(nèi)部背景色重繪出隊節(jié)點,這么就能夠達成移動效果。而在吃到食物時候,則只需把食物入隊即可。實現(xiàn)貪吃蛇基礎(chǔ)蛇身移動、吃到食物身體增加、和碰到墻壁或本身死亡,能夠暫停和開始。玩家能夠依據(jù)自己水平選擇不一樣等級進行游戲挑戰(zhàn)。貪吃蛇游戲中定義以下:1) 空白區(qū)域(Lawn):定義區(qū)域是貪吃蛇游戲場地。豆、石頭和蛇只能存在于空白區(qū)域范圍之內(nèi)。依據(jù)個人愛好還能夠添加背景,改變區(qū)域大小和顏色。2) 蛇(Snake):在貪吃蛇游戲中,蛇由若干節(jié)組成,其中第一節(jié)是蛇頭,在蛇頭上面定義兩個點,作為蛇眼睛,其它是蛇身。在游戲過程中,有且僅有一條蛇,而且蛇在不停地移動。假如蛇吃了豆,則蛇生長一節(jié)。假如蛇頭碰到蛇身,蛇死亡,游戲結(jié)束。假如蛇頭離開所定義區(qū)域,則蛇死亡游戲結(jié)束。當蛇頭撞到定義石塊上時候游戲結(jié)束。在定義蛇時候能夠改變蛇初始長度,也能夠改變蛇顏色和大小。3) 豆(Bean):在貪吃蛇游戲中,豆是蛇食物。在游戲過程中,有且僅有一顆豆。假如蛇吃了豆,則重新生成一顆豆。豆出現(xiàn)是隨機性。4)石塊(stone):游戲中石塊和豆是同時出現(xiàn),不一樣是,豆是隨機產(chǎn)生,而石塊是固定,它坐標在寫代碼時候就定義好了,不能夠改變。它大小和顏色也能夠隨便改變。5)菜單(MenuStrip):在貪吃蛇游戲中有游戲菜單,里面有開局、暫停、繼續(xù)、加速、減速、幫助等菜單。還有Label控件,顯示速度、時間、日期和積分。五.設(shè)計說明Snake每一節(jié)全部有位置和大小等屬性。而Bean和stone也含有這兩個屬性。抽象出這三者共同特征,抽象出通常類Block,用于描述一個塊。Block派生出Bean和SnakeBlock兩個類,其中SnakeBlock類用于描述蛇一節(jié)。為了使游戲運行更易于控制,定義Game類用于開啟、暫停和繼續(xù)游戲。依據(jù)需求分析可知,Lawn僅包含大小和顏色兩個屬性。為了降低類數(shù)量,可將其大小和顏色等屬性添加到Game類中??偠灾谪澇陨哂螒蛑?,有Block(塊)、Bean(豆)、SankeBlock(節(jié))、Snake(蛇)、Game(游戲)和MainForm(用戶接口)六個類。游戲邏輯構(gòu)思圖以下:定義空白區(qū)域定義空白區(qū)域游戲開始游戲開始生成石塊生成石塊生成豆生成蛇生成豆生成蛇重新開局重新開局 吃到蛇身增加 豆蛇身增加增加等級增加等級統(tǒng)計分數(shù)石塊統(tǒng)計分數(shù)石塊碰到石壁碰到石壁游戲結(jié)束游戲結(jié)束游戲設(shè)計以下:游戲圖標及名稱游戲圖標及名稱豆子豆子成績顯示速度顯示成績顯示速度顯示游戲菜單蛇身等級顯示石塊蛇身等級顯示石塊游戲定游戲定義區(qū)域日期立即間顯示六.源代碼usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowsFormsApplication1{publicpartialclassMainForm:Form{inta=200;//定義初速度為200privateGamegame;//DateTimec;publicMainForm(){InitializeComponent();game=newGame(lawn.Width,lawn.Height);timer1.Enabled=true;timer1.Interval=a;timer1.Enabled=false;Velocity.Text=a.ToString();}Block是用來組成Bean(豆)和Snake(蛇)還有Stone(石塊)最基礎(chǔ)單位,是Bean和SnakeBlock基類。Block類參考代碼以下。classBlock{protectedPointorigion;//Block左上頂點publicconstintWIDTH=10;//Block寬度publicconstintHEIGHT=10;//Block高度protectedColorcolor;//Block顏色publicBlock(){origion=newPoint(0,0);color=newColor();}publicBlock(intx,inty,Color_color){origion=newPoint(x,y);color=_color;}publicPointOrigion{get{returnorigion;}}publicvoidDisplay(Graphicsg){SolidBrushbrush=newSolidBrush(color);g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);Penpen=newPen(Color.Black);g.DrawRectangle(pen,newRectangle(origion.X,origion.Y,WIDTH-1,HEIGHT-1));}publicvoidClear(Graphicsg,ColorbackGroundColor){SolidBrushbrush=newSolidBrush(backGroundColor);g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);}}這是對豆定義,是由Block派生而來,在系統(tǒng)開始時,使豆產(chǎn)生,它出現(xiàn)位置為隨機生成。其代碼以下:classBean:Block{publicstaticintf=0;//吃到豆子個數(shù)publicBean(Color_color){origion=newPoint(0,0);color=_color;}publicvoidCreat(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight,Snakesnake){Clear(g,backGroundColor);boolbGetAPosition=false;//是否找到生成豆位置Randomrandom=newRandom();while(!bGetAPosition){origion.X=random.Next(0,lawnWidth-1)/WIDTH*WIDTH;origion.Y=random.Next(0,lawnHeight-1)/HEIGHT*HEIGHT;inti;for(i=0;i<snake.Length;i++){if(origion==snake.blocks[i].Origion)break;}if(i==snake.Length)bGetAPosition=true;}Display(g);f++;}newpublicvoidDisplay(Graphicsg){SolidBrushbrush=newSolidBrush(color);g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);Penpen=newPen(Color.Black);g.DrawRectangle(pen,newRectangle(origion.X,origion.Y,WIDTH-1,HEIGHT-1));}//Display(g);}SnakeBlock表示蛇一節(jié),是由Block派生而來。它組成蛇身,其代碼以下所表示:classSnakeBlock:Block{privateboolisHead;publicboolIsHead{get{returnisHead;}}publicSnakeBlock(intx,inty,Color_color,bool_isHead){origion=newPoint(x,y);color=_color;isHead=_isHead;}publicvoidChangeHeadToBody(){if(isHead)isHead=false;}publicvoidDisplay(Graphicsg,Directiondirection){base.Display(g);if(isHead){//繪制蛇眼SolidBrushbrush=newSolidBrush(Color.Black);switch(direction){caseDirection.Up:caseDirection.Down:g.FillRectangle(brush,origion.X+WIDTH/4,origion.Y+HEIGHT/2,2,2);g.FillRectangle(brush,origion.X+WIDTH/4*3,origion.Y+HEIGHT/2,2,2);break;caseDirection.Left:caseDirection.Right:g.FillRectangle(brush,origion.X+WIDTH/2,origion.Y+HEIGHT/4,2,2);g.FillRectangle(brush,origion.X+WIDTH/2,origion.Y+HEIGHT/4*3,2,2);break;}}}}控制蛇頭運動方向publicenumDirection{Up,Down,Left,Right};對蛇編碼也是由Block派生而來,在這里面能夠定義蛇顏色和長度。classSnake{publicstaticbooleatebean;privateintlength;publicDirectiondirection;privateColorcolor;publicList<SnakeBlock>blocks;privateconstintINIT_LENGTH=10;publicintLength{get{returnlength;}}publicSnake(Color_color,Direction_direction){direction=_direction;color=_color;blocks=newList<SnakeBlock>();}publicvoidCreat(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight){Clear(g,backGroundColor);blocks.Clear();length=INIT_LENGTH;intx;inty;Randomrandom=newRandom();x=random.Next(lawnWidth/4,lawnWidth/4*3)/Block.WIDTH*Block.WIDTH;y=random.Next(lawnHeight/4-1,lawnHeight/4*3)/Block.HEIGHT*Block.HEIGHT;blocks.Add(newSnakeBlock(x,y,color,true));蛇運動方向控制switch(direction){caseDirection.Up:for(inti=1;i<length;i++){blocks.Add(newSnakeBlock(x,y+Block.HEIGHT*i,color,false));}break;caseDirection.Down:for(inti=1;i<length;i++){blocks.Add(newSnakeBlock(x,y-Block.HEIGHT*i,color,false));}break;caseDirection.Left:for(inti=1;i<length;i++){blocks.Add(newSnakeBlock(x+Block.WIDTH*i,y,color,false));}break;caseDirection.Right:for(inti=1;i<length;i++){blocks.Add(newSnakeBlock(x-Block.WIDTH*i,y,color,false));}break;}Display(g);}publicvoidGrow(){intx=2*blocks[blocks.Count-1].Origion.X-blocks[blocks.Count-2].Origion.X;inty=2*blocks[blocks.Count-1].Origion.Y-blocks[blocks.Count-2].Origion.Y;blocks.Insert(length,newSnakeBlock(x,y,color,false));length++;}publicvoidMove(){intx=0;inty=0;blocks[0].ChangeHeadToBody();switch(direction){caseDirection.Up:x=blocks[0].Origion.X;y=blocks[0].Origion.Y-Block.HEIGHT;break;caseDirection.Down:x=blocks[0].Origion.X;y=blocks[0].Origion.Y+Block.HEIGHT;break;caseDirection.Left:x=blocks[0].Origion.X-Block.WIDTH;y=blocks[0].Origion.Y;break;caseDirection.Right:x=blocks[0].Origion.X+Block.WIDTH;y=blocks[0].Origion.Y;break;}blocks.Insert(0,newSnakeBlock(x,y,color,true));blocks.RemoveAt(blocks.Count-1);}publicvoidDisplay(Graphicsg){for(inti=0;i<length;i++){blocks[i].Display(g,direction);}}publicvoidClear(Graphicsg,ColorbackGroundColor){for(inti=0;i<length;i++){blocks[i].Clear(g,backGroundColor);}}publicvoidRemoveAfter(Graphicsg,ColorbackGroundColor,intblockNum){for(inti=length-1;i>blockNum-1;i--){blocks[i].Clear(g,backGroundColor);blocks.RemoveAt(i);length=blockNum;}}石塊定義定義以下,在空白區(qū)域中定義一個位置(坐標),使之固定不動,在蛇頭撞到這個坐標時候,參數(shù)傳到判定蛇生死函數(shù),時蛇死亡,游戲結(jié)束。publicboolMeetStone(Pointorigion){if((blocks[0].Origion.X==(origion.X+40)&&blocks[0].Origion.Y==(origion.Y+40))||(blocks[0].Origion.X==(origion.X+300)&&blocks[0].Origion.Y==(origion.Y+80))||(blocks[0].Origion.X==(origion.X+150)&&blocks[0].Origion.Y==(origion.Y+200))||(blocks[0].Origion.X==(origion.X+100)&&blocks[0].Origion.Y==(origion.Y+400)))returntrue;elsereturnfalse;}當蛇碰到一個豆時,使豆成為蛇體一部分,其顏色和大小跟蛇一樣,蛇身增加。publicboolCanEatBean(Beanbean){if(blocks[0].Origion==bean.Origion)returntrue;elsereturnfalse;}publicintCanEatSnake(){for(inti=3;i<blocks.Count;i++){if(blocks[0].Origion==blocks[i].Origion)returni;}return0;}publicvoidEatBean(Beanbean,Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight){bean.Clear(g,backGroundColor);Grow();bean.Creat(g,backGroundColor,lawnWidth,lawnHeight,this);eatebean=true;}publicboolIsAlive(intlawnWidth,intlawnHeight){if(blocks[0].Origion.X<0)returnfalse;if(blocks[0].Origion.Y<0)returnfalse;if(blocks[0].Origion.X+Block.WIDTH>lawnWidth)returnfalse;if(blocks[0].Origion.Y+Block.HEIGHT>lawnHeight)returnfalse;elsereturntrue;}}Game控制游戲運行,負責(zé)在游戲開始時生成Bean、Stone和Snake,和負責(zé)在游戲運行中Snake移動、Snake生長、Bean重生和石塊生產(chǎn)。并隨時檢測Snake生死狀態(tài)。Game類參考代碼以下:classGame{Pointorigion;publicSnakesnake;publicBeanbean;publicboolisSnakeAlive;publicintlawnWidth;publicintlawnHeight;publicGame(int_lawnWidth,int_lawnHeight){Randomrandom=newRandom();intx=random.Next(0,_lawnWidth-1)/Block.WIDTH*Block.WIDTH;inty=random.Next(0,_lawnHeight-1)/Block.HEIGHT*Block.HEIGHT;Directiondirection=(Direction)random.Next(1,4);snake=newSnake(Color.Red,direction);bean=newBean(Color.Red);isSnakeAlive=false;lawnWidth=_lawnWidth;lawnHeight=_lawnHeight;}publicvoidBegin(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight){isSnakeAlive=true;snake.Clear(g,backGroundColor);snake.Creat(g,backGroundColor,lawnWidth,lawnHeight);bean.Creat(g,backGroundColor,lawnWidth,lawnHeight,snake);游戲中石塊填充,能夠依據(jù)自己制訂坐標來固定石塊,能夠改變其顏色。SolidBrushbrush=newSolidBrush(Color.DarkViolet);Penpen=newPen(Color.DarkViolet);g.FillRectangle(brush,origion.X+40,origion.Y+40,10,10);g.DrawRectangle(pen,newRectangle(origion.X+40,origion.Y+40,10,10));g.FillRectangle(brush,origion.X+300,origion.Y+80,10,10);g.DrawRectangle(pen,newRectangle(origion.X+300,origion.Y+80,10,10));g.FillRectangle(brush,origion.X+150,origion.Y+200,10,10);g.DrawRectangle(pen,newRectangle(origion.X+150,origion.Y+200,10,10));g.FillRectangle(brush,origion.X+100,origion.Y+400,10,10);g.DrawRectangle(pen,newRectangle(origion.X+100,origion.Y+400,10,10));}publicvoidOnTime(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight){if(isSnakeAlive){snake.Clear(g,backGroundColor);snake.Move();snake.Display(g);bean.Display(g);if(snake.CanEatBean(bean)){bean.Clear(g,backGroundColor);snake.EatBean(bean,g,backGroundColor,lawnWidth,lawnHeight);bean.Display(g);}intblockNum=snake.CanEatSnake();if(blockNum>0){snake.RemoveAfter(g,backGroundColor,blockNum);isSnakeAlive=false;MessageBox.Show("就算再餓也不能咬自己啊,死了吧!");}if(!snake.IsAlive(lawnWidth,lawnHeight)||snake.MeetStone(origion))isSnakeAlive=false;}}}Timer組件用于在用戶定義時間間隔引發(fā)事件。在游戲運行過程中,經(jīng)過時間函數(shù)能夠判定蛇生死,蛇吃豆子多少。還有日期顯示,時間顯示。統(tǒng)計蛇吃豆子多少。當吃夠要求豆時候,等級增加,游戲速度增加,蛇運動速度增加。privatevoidtimer1_Tick(objectsender,EventArgse){Date.Text=DateTime.Today.ToLongDateString();time.Text=DateTime.Now.ToLongTimeString();Success.Text=(Bean.f*10).ToString();if(Bean.f==5){jibie.Text=(1+(Bean.f+1)%5).ToString();timer1.Enabled=true;timer1.Interval=100;Velocity.Text=(a+100).ToString();}if(Bean.f==10){jibie.Text=(2+(Bean.f+1)%10).ToString();timer1.Enabled=true;timer1.Interval=80;Velocity.Text=(a+150).ToString();}if(Bean.f==20){jibie.Text=(3+(Bean.f+1)%20).ToString();timer1.Enabled=true;timer1.Interval=70;Velocity.Text=(a+200).ToString();}if(Bean.f==30){jibie.Text=(3+(Bean.f+1)%30).ToString();timer1.Enabled=true;timer1.Interval=60;Velocity.Text=(a+250).ToString();}if(Bean.f==40){jibie.Text=(3+(Bean.f+1)%40).ToString();timer1.Enabled=true;timer1.Interval=50;Velocity.Text=(a+300).ToString();}if(Bean.f==50){MessageBox.Show("闖關(guān)成功!");}判定蛇生死if(game.isSnakeAlive){Graphicsg;g=lawn.CreateGraphics();game.OnTime(g,lawn.BackColor,lawn.Width,lawn.Height);if(!game.isSnakeAlive){MessageBox.Show("死翹翹!");jibie.Text=1.ToString();}}}游戲開始按鈕,游戲開始,正確數(shù)據(jù)全部初始化,其中有timer函數(shù),和等級,分數(shù)全部初始化,蛇運行速度也初始到原來速度。豆統(tǒng)計清零。privatevoidToolStripMenuItemStart_Click(objectsender,EventArgse){Graphicsg;g=lawn.CreateGraphics();game.Begin(g,lawn.BackColor,lawn.Width,lawn.Height);timer1.Enabled=true;ToolStripMenuItemPause.Enabled=true;ToolStripMenuItemContinue.Enabled=false;Bean.f=0;timer1.Interval=200;Velocity.Text=a.ToString();c=DateTime.Now;}privatevoidToolStripMenuItemPause_Click(objectsender,EventArgse){timer1.Enabled=false;ToolStripMenuItemPause.Enabled=false;ToolStripMenuItemContinue.Enabled=true;}privatevoidToolStripMenuItemContinue_Click(objectsender,EventArgse){timer1.Enabled=true;ToolStripMenuItemPause.Enabled=true;ToolStripMenuItemContinue.Enabled=false;}KeyDown事件。在貪吃蛇游戲中,使用“↑”、“↓”、“←”和“→”四個方向鍵改變蛇移動方向。KeyDown事件用于在用戶按鍵時,提供改變蛇移動方向功效。privatevoidMainForm_KeyDown(objectsender,KeyEventArgse){if(game.snake.direction==Direction.Down||game.snake.direction==Direction.Up){switch(e.KeyCode){caseKeys.Left:game.snake.direction=Direction.Left;break;caseKeys.Right:game.snake.direction=Direction.Right;break;}}else{switch(e.KeyCode){

溫馨提示

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

最新文檔

評論

0/150

提交評論