版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
*****************實驗報告實驗名稱:網絡編程基礎實訓教程(貪吃蛇)指導教師:姓名:學號:班級:提交日期:
實驗目的通過開發(fā)一款貪吃蛇游戲程序,熟練掌握C#編程語言、和面向對象程序設計方法,獨立完成一個游戲程序的開發(fā)。實驗題目使用C#編程語言,開發(fā)一款貪吃蛇游戲,如下圖所示。功能描述游戲場地是一片矩形區(qū)域的草坪。一條蛇由蛇頭和蛇身組成。當游戲開始之后,草坪中出現(xiàn)一顆豆和一條蛇,并且蛇不停地移動,蛇移動方向與蛇頭一致。當游戲暫停之后,蛇停止移動。當蛇移動時,玩家使用“↑”、“↓”、“←”和“→”四個鍵控制蛇的移動方向。當蛇頭與豆的位置重合時,豆被蛇吃掉,同時在草坪中再生成一顆新的豆,蛇身增加一節(jié)。當蛇頭碰到蛇身時,則咬斷蛇身,后半部分的蛇身消失。當蛇頭碰到草坪四周時,蛇立即斃命,游戲結束。需求分析根據功能描述可知,貪吃蛇游戲的系統(tǒng)結構圖如下所示。定義數據字典如下:草坪(Lawn):草坪是貪吃蛇游戲的場地。豆和蛇只能存在于草坪范圍之內。草坪具有大小和顏色等屬性。蛇(Snake):在貪吃蛇游戲中,蛇由若干節(jié)組成,其中第一節(jié)是蛇頭,其余是蛇身。在游戲過程中,有且僅有一條蛇,并且蛇在不停地移動。如果蛇吃了豆,則蛇生長一節(jié)。如果蛇頭碰到蛇身,則咬斷蛇身,后半部分的蛇身消失。如果蛇頭離開草坪,則蛇死亡游戲結束。蛇具有長度、顏色、運動方向、每一節(jié)的位置等屬性。豆(Bean):在貪吃蛇游戲中,豆是蛇的食物。在游戲過程中,有且僅有一顆豆。如果蛇吃了豆,則重新生成一顆豆。豆具有位置、大小和顏色等屬性。設計說明根據需求分析可知,Snake的每一節(jié)都有位置和大小等屬性。而Bean也具有這兩個屬性。抽象出二者的共同特征,抽象出一般類Block,用于描述一個塊。Block派生出Bean和SnakeBlock兩個類,其中SnakeBlock類用于描述蛇的一節(jié)。為了使游戲的運行更易于控制,定義Game類用于啟動、暫停和繼續(xù)游戲。根據需求分析可知,Lawn僅包含大小和顏色兩個屬性。為了減少類的數量,可將其大小和顏色等屬性添加到Game類中。綜上所述,在貪吃蛇游戲中,有Block(塊)、Bean(豆)、SankeBlock(節(jié))、Snake(蛇)、Game(游戲)和MainForm(用戶接口)六個類。貪吃蛇游戲的邏輯模型如下圖所示。MainFormMainFormGameBlockBeanSnakeBlockSnake源代碼Block(塊)類的編碼Block是用來構成Bean(豆)和Snake(蛇)的最基本的單位,是Bean和SnakeBlock的基類。Block類的參考代碼如下。usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Text;namespaceWindowsFormsApplication1{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);}}}2)Bean(豆)類編碼Bean表示豆,是由Block派生而來的。Bean類的參考代碼如下。usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Text;namespaceWindowsFormsApplication1{classBean:Block{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);}}}3)SnakeBlock(節(jié))類編碼SnakeBlock表示蛇的一節(jié),是由Block派生而來的。SnakeBlock類的參考代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Text;namespaceWindowsFormsApplication1{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.Brown);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;}}}}}Snake(蛇)類編碼4)Snake(蛇)類編碼Snake表示蛇。Snake類的參考代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Text;namespaceHungrySanke{publicenumDirection{Up,Down,Left,Right};classSnake{privateintlength;publicDirectiondirection;privateColorcolor;publicList<SnakeBlock>blocks;privateconstintINIT_LENGTH=3;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;}}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);}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;}}}5)Game(游戲)類編碼Game控制游戲的運行,負責在游戲開始時生成Bean和Snake,以及負責在游戲運行中Snake的移動、Snake的生長、Bean的重生,并隨時檢測Snake的生死狀態(tài)。Game類的參考代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Text;namespaceHungrySanke{classGame{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.YellowGreen,direction);bean=newBean(Color.Pink);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);}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);}if(!snake.IsAlive(lawnWidth,lawnHeight))isSnakeAlive=false;}}}}Form1的設計代碼usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceHungrySanke{publicpartialclassForm1:Form{privateGamegame;publicForm1(){InitializeComponent();game=newGame(lawn.Width,lawn.Height);}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidtimer1_Tick(objectsender,EventArgse){if(game.isSnakeAlive){Graphicsg;g=lawn.CreateGraphics();game.OnTime(g,lawn.BackColor,lawn.Width,lawn.Height);if(!game.isSnakeAlive){MessageBox.Show("GameOver");}}}privatevoidToolStrpMenuItemStart_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;}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;}privatevoidForm1_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
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度平菇香菇線上線下銷售渠道拓展合同
- 2025年度二手房買賣合同交易手續(xù)辦理指南
- 2025年度文化創(chuàng)意產業(yè)項目合作開發(fā)合同4篇
- 2025年度寧夏糧食和物資儲備局糧食儲備庫安全管理合同4篇
- 二零二五年度高品質木箱紙箱租賃經營合同3篇
- 二零二五年停薪留職員工績效管理合同
- 二零二五年度床上用品電商平臺合作推廣合同2篇
- 江蘇省村衛(wèi)生室人員合理用藥培訓
- 二零二五年度民政局認證離婚協(xié)議書范本
- 二零二五年度林地使用權租賃合同范例3篇
- 《中國高考評價體系》解讀(化學學科)
- 公司發(fā)展能力提升方案
- 電梯安全守則及乘客須知
- IT硬件系統(tǒng)集成項目質量管理方案
- 《容幼穎悟》2020年江蘇泰州中考文言文閱讀真題(含答案與翻譯)
- 水上水下作業(yè)應急預案
- API520-安全閥計算PART1(中文版)
- 2023年廣東省廣州地鐵城際鐵路崗位招聘筆試參考題庫附帶答案詳解
- 商務提成辦法
- 直流電機電樞繞組簡介
- GB/T 19889.5-2006聲學建筑和建筑構件隔聲測量第5部分:外墻構件和外墻空氣聲隔聲的現(xiàn)場測量
評論
0/150
提交評論