




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGEPAGEI項(xiàng)目設(shè)計(jì)報(bào)告書項(xiàng)目名稱:貪吃蛇指導(dǎo)老師:所在系別:計(jì)算機(jī)系班級:項(xiàng)目成員:目錄第一章 引言 11.1編寫目的 11.2術(shù)語 11.3參考文獻(xiàn) 1第二章系統(tǒng)概述 22.1實(shí)例說明 22.2設(shè)計(jì)思路 22.3技術(shù)要點(diǎn) 22.4實(shí)現(xiàn)過程 3第三章總體設(shè)計(jì) 43.1項(xiàng)目界面圖 43.2新增功能 8第四章程序代碼 10PAGE21
第一章引言1.1編寫目的鑒于日常工作壓力太大,閑暇的時(shí)間大多比較零碎,為了緩解緊張的情緒,獲得更高工作效率,人們在日常的娛樂生活中,經(jīng)常會玩一些單機(jī)版的益智類小游戲,它的特點(diǎn)是使用的內(nèi)存小,又無需建立網(wǎng)絡(luò),更不會使人沉迷,獲得了大多數(shù)人的喜愛。1.2術(shù)語訪問修飾符用于限制對類型或類型成員的訪問的關(guān)鍵字,如private、protected、internal或public??稍L問成員一種可由給定類型訪問的成員。一種類型的可訪問成員不一定可由另一種類型訪問。類(class)一種描述對象的數(shù)據(jù)類型。類不僅包含數(shù)據(jù),還包含作用于數(shù)據(jù)的方法。字段(field)類或結(jié)構(gòu)的一個(gè)可直接訪問的數(shù)據(jù)成員。方法一個(gè)提供類或結(jié)構(gòu)的行為的命名代碼塊。屬性(property)通過訪問器訪問的數(shù)據(jù)成員。static聲明為靜態(tài)的類或方法不必首先使用關(guān)鍵字new進(jìn)行實(shí)例化就可存在。Main()就屬于靜態(tài)方法。1.3參考文獻(xiàn)C#范例完全自學(xué)手冊第二章系統(tǒng)概述2.1實(shí)例說明本實(shí)例將制作一個(gè)貪吃蛇游戲,讀者可以根據(jù)該實(shí)例了解游戲的制作過程,達(dá)到舉一反三的程度,為以后的開發(fā)工作,打下基礎(chǔ)。2.2設(shè)計(jì)思路制作貪吃蛇的設(shè)計(jì)思路如下:明確貪吃蛇的游戲規(guī)則,例如,蛇頭不能碰到場地的四周;蛇身不能重疊;當(dāng)吃到食物后,應(yīng)在新的位置重新生成食物,且食物不能在蛇身內(nèi)出現(xiàn)。將Panel控件設(shè)為游戲背景。場地、貪吃蛇及食物都是在Panel控件的重繪事件中繪制。繪制蛇身的好處是在貪吃蛇進(jìn)行移動時(shí),不需要重新繪制背景。用Timer組件來實(shí)現(xiàn)貪吃蛇的移動,并用該組件的Interval屬性來控制移動速度。2.3技術(shù)要點(diǎn)本實(shí)例主要使用Graphics類在Panel控件中繪制游戲場地及貪吃蛇。蛇身的移動主要是用ArrayList類來實(shí)現(xiàn)的,該類的主要功能是使用大小可按需要?jiǎng)討B(tài)增加的數(shù)組實(shí)現(xiàn)IList接口。本實(shí)例主要是用ArrayList類的Insert和RemoveAt方法實(shí)現(xiàn)的。Insert方法。該方法的主要功能是將元素插入ArrayList的指定索引處。其常用語法如下:PublicvirtualvoidInsert(intindex,Objectvalue)參數(shù)說明如下:Index:從零開始的索引,應(yīng)在該位置插入value。value:要插入的Object。該值可以為空引用。例如,在數(shù)組的開始位置插入一個(gè)值。代碼如下:Point[]Place={newPoint(-1,-1)}ArrayListList=newArrayList(Place);PointEp=newPoint(0,0);List.Insert(0,Ep);(2)RemoveAt方法。該方法用于移除ArrayList類中指引索引處的元素。其常用語法如下:PublicvirtualvoidRemoveAt(intindex)參數(shù)說明如下。Index:要移除的元素的從零開始的索引。例如,刪除數(shù)組中的尾部元素。代碼如下;Point[]Place={newPoint(-1,-1)newPoint(-1,-1)}ArrayListList=newArrayList(Place);List.RemoveAt(List.count-1);2.4實(shí)現(xiàn)過程新建一個(gè)Windows應(yīng)用程序,將其命名為“貪吃蛇”,默認(rèn)窗體為From1。在當(dāng)前項(xiàng)目中添加一個(gè)類,將其命名為Snake。From1窗體主要用到的控件及說明如表12.1所示。表12.1From1窗體主要用到的控件及說明控件類型控件名稱屬性設(shè)置說明menuStrip1在Items屬性中添加命令項(xiàng)對游戲進(jìn)行控制panel1BroderStyle屬性設(shè)置為None游戲場地Timer1無控制貪吃蛇的移動Label2無顯示當(dāng)前分?jǐn)?shù)Textbox1無用于獲得焦點(diǎn),實(shí)現(xiàn)鍵盤操作說明:在使用MenuStrip組件對游戲進(jìn)行控制時(shí),為了節(jié)省編程代碼,所有命令項(xiàng)的單擊操作,可以在一個(gè)命令項(xiàng)的單擊事件中執(zhí)行,主要是在Tag屬性中根據(jù)不同命令項(xiàng)的功能設(shè)置相應(yīng)的標(biāo)識(int型)。第三章總體設(shè)計(jì)3.1項(xiàng)目界面圖初始界面圖
難度等級圖:
控制界面圖
游戲結(jié)束圖
3.2新增功能新增功能解釋:為了提高貪吃蛇的趣味性,本項(xiàng)目在游戲中添加了障礙物,綠色的方塊是食物,藍(lán)色的是障礙物,碰上就結(jié)束游戲。
新增功能解釋:為了滿足玩家對自己的挑戰(zhàn),本項(xiàng)目添加了挑戰(zhàn)級別的難度,它的速度越來越快,相信一定能給玩家一個(gè)刺激的體驗(yàn)。
第四章程序代碼Form1.csusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespace貪吃蛇{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}publicboolr;//判斷是否是挑戰(zhàn)級publicstaticboolifStart=false;//判斷是否開始publicstaticintcareer=400;//移動的速度Snakesnake=newSnake();//實(shí)例化Snake類intsnake_W=20;//骨節(jié)的寬度intsnake_H=20;//骨節(jié)的高度publicstaticboolpause=false;//是否暫停游戲//封裝一個(gè)GDI+繪圖圖面,繪制游戲場景publicvoidProtractTable(Graphicsg){for(inti=0;i<=panel1.Width/snake_W;i++)//繪制單元格的縱向線{g.DrawLine(newPen(Color.Black,1),newPoint(i*snake_W,0),newPoint(i*snake_W,panel1.Height));//用畫筆將兩點(diǎn)連接成一線,形成豎線}for(inti=0;i<=panel1.Height/snake_H;i++)//繪制單元格的橫向線{g.DrawLine(newPen(Color.Black,1),newPoint(0,i*snake_H),newPoint(panel1.Width,i*snake_H));//用畫筆將兩點(diǎn)連接成一線,形成橫線}}privatevoidpanel1_Paint(objectsender,PaintEventArgse){Graphicsg=panel1.CreateGraphics();//創(chuàng)建panel1控件的Graphics類ProtractTable(g);//繪制游戲場景if(!ifStart)//如是沒有開始游戲{Snake.timer=timer1;Snake.label=label2;snake.Ophidian(panel1,snake_W);//初始化場地及貪吃蛇信息}else{for(inti=0;i<Snake.List.Count;i++)//繪制蛇身{e.Graphics.FillRectangle(Snake.SolidB,((Point)Snake.List[i]).X+1,((Point)Snake.List[i]).Y+1,snake_W-1,snake_H-1);}e.Graphics.FillRectangle(Snake.SolidF,Snake.Food.X+1,Snake.Food.Y+1,snake_W-1,snake_H-1);//繪制食物if(Snake.ifGame)//如果游戲結(jié)束//繪制提示文本e.Graphics.DrawString("GameOver",newFont("宋體",30,FontStyle.Bold),newSolidBrush(Color.DarkSlateGray),newPointF(150,130));}}privatevoid開始ToolStripMenuItem_Click(objectsender,EventArgse){NoviceCortrol(Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()));snake.BuildFood();textBox1.Focus();}//控制游戲的開始、暫停和結(jié)束等標(biāo)識publicvoidNoviceCortrol(intn){switch(n){case1://開始游戲{snake.clear();//清除障礙物點(diǎn)的位置ifStart=false;Graphicsg=panel1.CreateGraphics();//創(chuàng)建panel1控件的Graphics類g.FillRectangle(Snake.SolidD,0,0,panel1.Width,panel1.Height);//刷新游戲場地ProtractTable(g);//繪制游戲場地ifStart=true;//開始游戲snake.Ophidian(panel1,snake_W);//初始化場地及貪吃蛇信息timer1.Interval=career;//設(shè)置貪吃蛇移動的速度timer1.Start();//啟動計(jì)時(shí)器pause=true;//是否暫停游戲label2.Text="0";//顯示當(dāng)前分?jǐn)?shù)break;}case2://暫停游戲{if(pause)//如果游戲正在運(yùn)行{ifStart=true;//游戲正在開始timer1.Stop();//停止計(jì)時(shí)器pause=false;//當(dāng)前已暫停游戲}else{ifStart=true;//游戲正在開始timer1.Start();//啟動計(jì)時(shí)器pause=true;//開始游戲}break;}case3://退出游戲{timer1.Stop();//停止計(jì)時(shí)器Application.Exit();//半閉工程break;}}}privatevoid初級ToolStripMenuItem_Click(objectsender,EventArgse){if(timer1.Enabled==false)//如果游戲沒有開始{初級ToolStripMenuItem.Checked=false;//設(shè)置該項(xiàng)沒有被選中中級ToolStripMenuItem.Checked=false;//設(shè)置該項(xiàng)沒有被選中高級ToolStripMenuItem.Checked=false;//設(shè)置該項(xiàng)沒有被選中挑戰(zhàn)ToolStripMenuItem.Checked=false;//設(shè)置該項(xiàng)沒有被選中((ToolStripMenuItem)sender).Checked=true;//設(shè)置當(dāng)前項(xiàng)被選中switch(Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString())){case1://初級{career=400;//設(shè)置移動的速度r=false;//標(biāo)志label4.Text="初級";break;}case2://中級{career=200;r=false;//標(biāo)志label4.Text="中級";break;}case3://高級{career=50;r=false;//標(biāo)志label4.Text="高級";break;}case4://挑戰(zhàn){career=200;r=true;//標(biāo)志label4.Text="挑戰(zhàn)級";break;}}}textBox1.Focus();//獲得焦點(diǎn)}privatevoidForm1_KeyDown(objectsender,KeyEventArgse){inttem_n=-1;//記錄移動鍵值if(e.KeyCode==Keys.Right)//如果按→鍵{tem_n=0;//向右移}if(e.KeyCode==Keys.Left)//如果按←鍵{tem_n=1;//向左移}if(e.KeyCode==Keys.Up)//如果按↑鍵{tem_n=2;//向上移}if(e.KeyCode==Keys.Down)//如果按↓鍵{tem_n=3;//向下移}if(tem_n!=-1&&tem_n!=Snake.Aspect)//如果移動的方向不是相同方向{if(Snake.ifGame==false){//如果移動的方向不是相反的方向if(!((tem_n==0&&Snake.Aspect==1||tem_n==1&&Snake.Aspect==0)||(tem_n==2&&Snake.Aspect==3||tem_n==3&&Snake.Aspect==2))){Snake.Aspect=tem_n;//記錄移動的方向snake.SnakeMove(tem_n);//移動貪吃蛇}}}inttem_p=-1;//記錄控制鍵值if(e.KeyCode==Keys.F2)//如果按F2鍵tem_p=1;//開始游戲if(e.KeyCode==Keys.F3)//如果按F3鍵tem_p=2;//暫停或繼續(xù)游戲if(e.KeyCode==Keys.F4)//如果按F4鍵tem_p=3;//關(guān)閉游戲if(tem_p!=-1)//如果當(dāng)前是操作標(biāo)識NoviceCortrol(tem_p);//控制游戲的開始、暫止和關(guān)閉}privatevoidtimer1_Tick(objectsender,EventArgse){snake.SnakeMove(Snake.Aspect);//移動貪吃蛇if(r==true)//如果是挑戰(zhàn)級就將速度加快直至一個(gè)值{timer1.Interval-=1;if(timer1.Interval<=20){timer1.Interval=20;}}label5.Text=timer1.Interval.ToString();//獲取時(shí)間間隔}}}Snake.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Drawing;usingSystem.Collections;namespace貪吃蛇{classSnake{publicstaticintCondyle=0;//設(shè)置骨節(jié)的大小publicstaticintAspect=0;//設(shè)置方向publicstaticPoint[]Place={newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1)};//設(shè)置個(gè)骨節(jié)的位置publicstaticPointFood=newPoint(-1,-1);//設(shè)置食物的所在點(diǎn)publicstaticPointfod=newPoint(-1,-2);publicstaticboolifFood=false;//是否有食物publicstaticboolifGame=false;//游戲是否結(jié)束publicstaticintField_width=0;//場地的寬度publicstaticintField_Height=0;//場地的高度publicstaticControlcontrol;//記錄繪制貪吃蛇的控件publicstaticTimertimer;//記錄Timer組件publicstaticSolidBrushSolidB=newSolidBrush(Color.Red);//設(shè)置貪吃蛇身體的顏色publicstaticSolidBrushSolidD=newSolidBrush(Color.LightCoral);//設(shè)置背景顏色publicstaticSolidBrushSolidF=newSolidBrush(Color.Green);//設(shè)置食物的顏色publicstaticSolidBrushsolidf=newSolidBrush(Color.Blue);publicstaticLabellabel;//記錄Label控件publicstaticArrayListList=newArrayList();//實(shí)例化ArrayList數(shù)組Pointtem_p=newPoint(-1,-1);//定義坐標(biāo)結(jié)構(gòu)Pointtem_j=newPoint(-1,-2);publicPoint[]a=newPoint[10000];publicintb=9999;Graphicsg;//實(shí)例化Graphics類//初始化場地及貪吃蛇的信息,控件,骨節(jié)大小等publicvoidOphidian(ControlCon,intcondyle){Field_width=Con.Width;//獲取場地的寬度Field_Height=Con.Height;//獲取場地的高度Condyle=condyle;//記錄骨節(jié)的大小control=Con;//記錄背景控件g=control.CreateGraphics();//創(chuàng)建背景控件的Graphics類SolidD=newSolidBrush(Con.BackColor);//設(shè)置畫刷顏色for(inti=0;i<Place.Length;i++)//繪制貪吃蛇{Place[i].X=(Place.Length-i-1)*Condyle;//設(shè)置骨節(jié)的橫坐標(biāo)位置Place[i].Y=(Field_Height/2)-Condyle;//設(shè)置骨節(jié)的縱坐標(biāo)位置g.FillRectangle(SolidB,Place[i].X+1,Place[i].Y+1,Condyle-1,Condyle-1);//繪制骨節(jié)}List=newArrayList(Place);//記錄每個(gè)骨節(jié)的位置ifGame=false;//停止游戲Aspect=0;//設(shè)置方向?yàn)橛襺//移動貪吃蛇,標(biāo)識,判斷的移動的方向publicvoidSnakeMove(intn){Pointtem_Point=newPoint(-1,-1);//定義坐標(biāo)結(jié)構(gòu)switch(n){case0://右移{tem_Point.X=((Point)List[0]).X+Condyle;//蛇頭向右移tem_Point.Y=((Point)List[0]).Y;break;}case1://左移{tem_Point.X=((Point)List[0]).X-Condyle;//蛇頭向左移tem_Point.Y=((Point)List[0]).Y;break;}case2://上移{tem_Point.Y=((Point)List[0]).Y-Condyle;//蛇頭向上移tem_Point.X=((Point)List[0]).X;break;}case3://下移{tem_Point.Y=((Point)List[0]).Y+Condyle;//蛇頭向下移tem_Point.X=((Point)List[0]).X;break;}}BuildFood();//生成食物if(!EstimateMove(tem_Point))//如果沒有向相反的方向移動{Aspect=n;//改變貪吃蛇的移動方向if(!GameAborted(tem_Point))//如果游戲沒有結(jié)束{ProtractSnake(tem_Point);//重新繪制蛇身EatFood();//吃食}g.FillRectangle(SolidF,Food.X+1,Food.Y+1,Condyle-1,Condyle-1);//繪制食物g.FillRectangle(solidf,fod.X+1,fod.Y+1,Condyle-1,Condyle-1);//繪制障礙物}}//吃食publicvoidEatFood(){if((((Point)List[0])==Food))//如果蛇頭吃到了食物{List.Add(List[List.Count-1]);//在蛇的尾部添加蛇身//career+=10;ifFood=false;//沒有食物for(inti=500;i>=0;i--){}BuildFood();//生成食物label.Text=Convert.ToString(Convert.ToInt32(label.Text)+5);//顯示當(dāng)前分?jǐn)?shù)}}///游戲是否失敗//設(shè)置文本的顯示位置publicboolGameAborted(PointGameP){booltem_b=false;//游戲是否結(jié)束booltem_body=false;//記錄蛇身是否重疊booltem_v=false;for(intb=9999;b>=0;b--)//遍歷數(shù)組{if((Point)List[0]==(Point)a[b]){tem_v=true;}}for(inti=1;i<List.Count;i++)//遍歷所有骨節(jié){if(((Point)List[0])==((Point)List[i]))//如是骨節(jié)重疊tem_body=true;//游戲失敗}//判斷蛇頭是否超出游戲場地if(GameP.X<=-20||GameP.X>=control.Width-1||GameP.Y<=-20||GameP.Y>=control.Height-1||tem_body||tem_v){//繪制游戲結(jié)束的提示文本g.DrawString("GameOver",newFont("宋體",30,FontStyle.Bold),newSolidBrush(Color.DarkSlateGray),newPointF(150,130));ifGame=true;//游戲結(jié)束timer.Stop();//停止記時(shí)器tem_b=true;}returntem_b;}//判斷蛇是否向相反的方向移動//移動的下一步位置publicboolEstimateMove(PointEp){booltem_bool=false;//記錄蛇頭是否向相反的方向移動if(Ep.X==((Point)List[0]).X&&Ep.Y==((Point)List[0]).Y)//如果蛇頭向相反的方向移動tem_bool=true;returntem_bool;}//重新繪制蛇身publicvoidProtractSnake(PointEp){booltem_bool=false;//是否清除移動后的蛇身List.Insert(0,Ep);//根據(jù)蛇頭的移動方向,設(shè)置蛇頭的位置Pointtem_point=((Point)List[List.Count-1]);//記錄蛇尾的位置List.RemoveAt(List.Count-1);//移除蛇的尾部//使骨節(jié)向前移動一位for(inti=0;i<List.Count-1;i++){if(tem_point==((Point)List[i]))tem_bool=true;}if(!tem_bool)//清除貪吃蛇移動前的蛇尾部份g.FillRectangle(SolidD,tem_point.X+1,tem_point.Y+1,Condyle-1,Condyle-1);for(inti=0;i<List.Count;i++)//重新繪制蛇身{g.FillRectangle(SolidB,((Point)List[0]).X+1,((Point)List[0]).Y+1,Condyle-1,Condyle-1);}}//生成食物publicvoidBuildFood(){if(ifFood==false)//如果沒有食物{booltem_bool=true;//是否計(jì)算出食物的合位置booltem_b=false;//判斷食物是否和蛇身重疊while(tem_bool)//計(jì)算食物的顯示位置{tem_b=false;tem_p=RectFood();//隨機(jī)生成食物的位置tem_j=RectFood();for(inti=0;i<List.Count;i++)//遍歷整個(gè)蛇身的位置
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝修項(xiàng)目經(jīng)理年終述職報(bào)告
- 創(chuàng)業(yè)團(tuán)隊(duì)基本情況
- 集團(tuán)員工培訓(xùn)體系建設(shè)
- 藥店溫濕度管理制度培訓(xùn)
- 酒水電話銷售培訓(xùn)課件
- 腦癱患兒作業(yè)治療
- AIGC商業(yè)應(yīng)用實(shí)戰(zhàn)教程 課件 8-1 AIGC助力市場調(diào)研與分析
- 孕期檢查流程表
- 幼兒園小班活動:果皮不亂扔
- 山西省陽泉市2024-2025學(xué)年高三上學(xué)期期末考試地理試題 含解析
- 2025年湖南信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及參考答案
- 2025年湖南司法警官職業(yè)學(xué)院單招職業(yè)技能測試題庫學(xué)生專用
- 2025年湖南水利水電職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫必考題
- 監(jiān)獄生產(chǎn)安全
- 俱樂部射擊安全
- 2025年中國游戲行業(yè)市場深度分析及發(fā)展前景預(yù)測報(bào)告
- 二零二五版小企業(yè)職工勞動合同強(qiáng)化權(quán)益保障
- 2025年春季學(xué)期各周國旗下講話安排表+2024-2025學(xué)年度第二學(xué)期主題班會安排表
- 安慰劑效應(yīng)在臨床應(yīng)用研究-深度研究
- 呼吸道預(yù)防健康宣教
- 2025年春新滬粵版物理八年級下冊課件 7.2 運(yùn)動的快慢 速度
評論
0/150
提交評論