




已閱讀5頁(yè),還剩20頁(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)介
鄭州輕工業(yè)學(xué)院實(shí)訓(xùn)報(bào)告實(shí)訓(xùn)名稱:貪吃蛇 指導(dǎo)教師: 姓名: 學(xué)號(hào): 班級(jí): 提交日期: 一.實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)開發(fā)一款貪吃蛇游戲程序,熟練掌握C#編程語(yǔ)言、和面向?qū)ο蟪绦蛟O(shè)計(jì)方法,獨(dú)立完成一個(gè)游戲程序的開發(fā)。二.實(shí)驗(yàn)題目 本次實(shí)訓(xùn)的題目為貪吃蛇。通過(guò)使用C#編程語(yǔ)言來(lái)實(shí)現(xiàn)。三.功能描述1.游戲的基本功能描述1) 游戲場(chǎng)地是一片矩形區(qū)域的空地構(gòu)成,蛇可以在這片定義的區(qū)域中自由移動(dòng)。2) 定義一個(gè)Block來(lái)構(gòu)成石塊,蛇頭,蛇身以及豆。蛇由蛇頭和蛇身組成。3) 當(dāng)游戲開始之后,定義的區(qū)域中出現(xiàn)一顆豆和一條蛇,并且蛇不停地移動(dòng),蛇移動(dòng)的方向與蛇頭的方向一致。4) 通過(guò)space或者暫停鍵可以使游戲停止,蛇停止移動(dòng),分?jǐn)?shù)停止積分。5) 當(dāng)蛇移動(dòng)時(shí),玩家可以使用“”、“”、“”和“”四個(gè)方向鍵改變蛇的移動(dòng)方向。6) 當(dāng)蛇頭與豆的位置重合時(shí),豆被蛇吃掉,同時(shí)在草坪中再生成一顆新的豆,蛇身增加一節(jié)。7) 當(dāng)蛇頭碰到石塊時(shí),蛇死亡,游戲結(jié)束。8) 當(dāng)蛇頭咬到蛇身時(shí),則蛇死亡,游戲結(jié)束。9) 當(dāng)蛇頭碰到草坪四周時(shí),蛇立即斃命,游戲結(jié)束。10) 游戲分為不同的級(jí)別,第一關(guān)游戲速度為200,當(dāng)蛇吃五個(gè)豆子就可以過(guò)關(guān),級(jí)別顯示為2,速度增加100變?yōu)?00.第二關(guān)為吃夠10個(gè)豆子,速度增加50,以后以此類推。11) 游戲菜單中設(shè)有游戲幫助,玩家可以通過(guò)點(diǎn)擊幫助了解游戲的玩法。12) 對(duì)于不是第一次玩的玩家可以改變蛇的運(yùn)動(dòng)速度,來(lái)增加難度。在菜單中設(shè)有加速和減速兩個(gè)鍵,單擊可以改變速度。13) 游戲菜單中還有時(shí)間顯示。14) 當(dāng)游戲暫停時(shí),可以通過(guò)“繼續(xù)”鍵使游戲繼續(xù)進(jìn)行。四.需求分析本游戲用戶可以自己練習(xí)和娛樂(lè)。本游戲需要滿足以下幾點(diǎn)要求:(1) 利用方向鍵“、”來(lái)改變蛇的運(yùn)行方向。 (2) 空格鍵暫停游戲,并在隨機(jī)的地方產(chǎn)生食物。 (3) 吃到食物就變成新的蛇體,碰到壁或自身則游戲結(jié)束,否則正常運(yùn)行??尚行苑治觯贺澇陨哂螒蚴且环N簡(jiǎn)單的大眾的游戲,自從計(jì)算機(jī)實(shí)現(xiàn)以來(lái),深受廣大電腦玩家的喜愛(ài),做一個(gè)簡(jiǎn)單的貪吃蛇小游戲。貪吃蛇的核心算法是如何實(shí)現(xiàn)蛇的移動(dòng)和吃掉食物后如何變成新的蛇體。沒(méi)有碰到食物的時(shí)候,把當(dāng)前運(yùn)動(dòng)方向上的下個(gè)節(jié)點(diǎn)入隊(duì),并以蛇節(jié)點(diǎn)的顏色繪制這個(gè)節(jié)點(diǎn),然后把頭指針?biāo)傅墓?jié)點(diǎn)出隊(duì),并以游戲框架內(nèi)部背景色重繪出隊(duì)的節(jié)點(diǎn),這樣就可以達(dá)到移動(dòng)的效果。而在吃到食物的時(shí)候,則只需把食物入隊(duì)即可。實(shí)現(xiàn)貪吃蛇的基本的蛇身移動(dòng)、吃到食物身體增長(zhǎng)、和碰到墻壁或自身死亡,能夠暫停和開始。玩家可以根據(jù)自己的水平選擇不同的級(jí)別進(jìn)行游戲挑戰(zhàn)。貪吃蛇游戲中定義如下:1)空白區(qū)域(Lawn):定義的區(qū)域是貪吃蛇游戲的場(chǎng)地。豆、石頭和蛇只能存在于空白區(qū)域的范圍之內(nèi)。根據(jù)個(gè)人愛(ài)好還可以添加背景,改變區(qū)域的大小和顏色。2)蛇(Snake):在貪吃蛇游戲中,蛇由若干節(jié)組成,其中第一節(jié)是蛇頭,在蛇頭上面定義兩個(gè)點(diǎn),作為蛇的眼睛,其余是蛇身。在游戲過(guò)程中,有且僅有一條蛇,并且蛇在不停地移動(dòng)。如果蛇吃了豆,則蛇生長(zhǎng)一節(jié)。如果蛇頭碰到蛇身,蛇死亡,游戲結(jié)束。如果蛇頭離開所定義的區(qū)域,則蛇死亡游戲結(jié)束。當(dāng)蛇頭撞到定義的石塊上的時(shí)候游戲結(jié)束。在定義蛇的時(shí)候可以改變蛇的初始長(zhǎng)度,也可以改變蛇的顏色和大小。3)豆(Bean):在貪吃蛇游戲中,豆是蛇的食物。在游戲過(guò)程中,有且僅有一顆豆。如果蛇吃了豆,則重新生成一顆豆。豆的出現(xiàn)是隨機(jī)性的。4)石塊(stone):游戲中石塊和豆是同時(shí)出現(xiàn)的,不同的是,豆是隨機(jī)產(chǎn)生的,而石塊是固定的,它的坐標(biāo)在寫代碼的時(shí)候就定義好了,不能夠改變。它的大小和顏色也可以隨便的改變。5)菜單(MenuStrip):在貪吃蛇游戲中有游戲菜單,里面有開局、暫停、繼續(xù)、加速、減速、幫助等菜單。還有Label控件,顯示速度、時(shí)間、日期和積分的。五.設(shè)計(jì)說(shuō)明Snake的每一節(jié)都有位置和大小等屬性。而Bean和stone也具有這兩個(gè)屬性。抽象出這三者的共同特征,抽象出一般類Block,用于描述一個(gè)塊。Block派生出Bean和SnakeBlock兩個(gè)類,其中SnakeBlock類用于描述蛇的一節(jié)。為了使游戲的運(yùn)行更易于控制,定義Game類用于啟動(dòng)、暫停和繼續(xù)游戲。根據(jù)需求分析可知,Lawn僅包含大小和顏色兩個(gè)屬性。為了減少類的數(shù)量,可將其大小和顏色等屬性添加到Game類中。綜上所述,在貪吃蛇游戲中,有Block(塊)、Bean(豆)、SankeBlock(節(jié))、Snake(蛇)、Game(游戲)和MainForm(用戶接口)六個(gè)類。游戲邏輯構(gòu)思圖如下:定義空白區(qū)域游戲開始生成石塊生成豆生成蛇重新開局吃到蛇身增加豆增加級(jí)別統(tǒng)計(jì)分?jǐn)?shù)石塊碰到石壁游戲結(jié)束游戲的設(shè)計(jì)如下:游戲圖標(biāo)及名稱豆子成績(jī)顯示速度顯示游戲菜單蛇身級(jí)別顯示石塊游戲的定義區(qū)域日期及時(shí)間顯示六.源代碼using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1 public partial class MainForm : Form int a = 200;/定義初速度為200 private Game game;/ DateTime c; public MainForm() InitializeComponent(); game = new Game(lawn.Width, lawn.Height); timer1.Enabled = true; timer1.Interval = a; timer1.Enabled = false; Velocity.Text = a.ToString(); Block是用來(lái)構(gòu)成Bean(豆)和Snake(蛇)還有Stone(石塊)的最基本的單位,是Bean和SnakeBlock的基類。Block類的參考代碼如下。 class Block protected Point origion; /Block的左上頂點(diǎn) public const int WIDTH = 10; /Block的寬度 public const int HEIGHT = 10; /Block的高度 protected Color color; /Block的顏色 public Block() origion = new Point(0, 0); color = new Color(); public Block(int x, int y, Color _color) origion = new Point(x, y); color = _color; public Point Origion get return origion; public void Display(Graphics g) SolidBrush brush = new SolidBrush(color); g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT); Pen pen = new Pen(Color.Black); g.DrawRectangle(pen, new Rectangle(origion.X, origion.Y, WIDTH - 1, HEIGHT - 1); public void Clear(Graphics g, Color backGroundColor) SolidBrush brush = new SolidBrush(backGroundColor); g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT); 這是對(duì)豆的定義,是由Block派生而來(lái)的,在系統(tǒng)開始時(shí),使豆產(chǎn)生,它的出現(xiàn)位置為隨機(jī)生成。其代碼如下: class Bean : Block public static int f = 0;/吃到豆子的個(gè)數(shù) public Bean(Color _color) origion = new Point(0, 0); color = _color; public void Creat(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight, Snake snake) Clear(g, backGroundColor); bool bGetAPosition = false; /是否找到生成豆的位置 Random random = new Random(); while (!bGetAPosition) origion.X = random.Next(0, lawnWidth - 1) / WIDTH * WIDTH; origion.Y = random.Next(0, lawnHeight - 1) / HEIGHT * HEIGHT; int i; for (i = 0; i snake.Length; i+) if (origion = snake.blocksi.Origion) break; if (i = snake.Length) bGetAPosition = true; Display(g); f+; new public void Display(Graphics g) SolidBrush brush = new SolidBrush(color); g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT); Pen pen = new Pen(Color.Black); g.DrawRectangle(pen, new Rectangle(origion.X, origion.Y, WIDTH - 1, HEIGHT - 1); /Display(g); SnakeBlock表示蛇的一節(jié),是由Block派生而來(lái)的。它組成蛇身,其代碼如下所示: class SnakeBlock : Block private bool isHead; public bool IsHead get return isHead; public SnakeBlock(int x, int y, Color _color, bool _isHead) origion = new Point(x, y); color = _color; isHead = _isHead; public void ChangeHeadToBody() if (isHead) isHead = false; public void Display(Graphics g, Direction direction) base.Display(g); if (isHead) /繪制蛇眼 SolidBrush brush = new SolidBrush(Color.Black); switch (direction) case Direction.Up: case Direction.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; case Direction.Left: case Direction.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; 控制蛇頭運(yùn)動(dòng)的方向 public enum Direction Up, Down, Left, Right ;對(duì)蛇的編碼也是由Block派生而來(lái)的,在這里面可以定義蛇的顏色和長(zhǎng)度。 class Snake public static bool eatebean; private int length; public Direction direction; private Color color; public List blocks; private const int INIT_LENGTH = 10; public int Length get return length; public Snake(Color _color, Direction _direction) direction = _direction; color = _color; blocks = new List(); public void Creat(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight) Clear(g, backGroundColor); blocks.Clear(); length = INIT_LENGTH; int x; int y; Random random = new Random(); 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(new SnakeBlock(x, y, color, true);蛇運(yùn)動(dòng)的方向控制 switch (direction) case Direction.Up: for (int i = 1; i length; i+) blocks.Add(new SnakeBlock(x, y + Block.HEIGHT * i, color, false); break; case Direction.Down: for (int i = 1; i length; i+) blocks.Add(new SnakeBlock(x, y - Block.HEIGHT * i, color, false); break; case Direction.Left: for (int i = 1; i length; i+) blocks.Add(new SnakeBlock(x + Block.WIDTH * i, y, color, false); break; case Direction.Right: for (int i = 1; i length; i+) blocks.Add(new SnakeBlock(x - Block.WIDTH * i, y, color, false); break; Display(g); public void Grow() int x = 2 * blocksblocks.Count - 1.Origion.X - blocksblocks.Count - 2.Origion.X; int y = 2 * blocksblocks.Count - 1.Origion.Y - blocksblocks.Count - 2.Origion.Y; blocks.Insert(length, new SnakeBlock(x, y, color, false); length+; public void Move() int x = 0; int y = 0; blocks0.ChangeHeadToBody(); switch (direction) case Direction.Up: x = blocks0.Origion.X; y = blocks0.Origion.Y - Block.HEIGHT; break; case Direction.Down: x = blocks0.Origion.X; y = blocks0.Origion.Y + Block.HEIGHT; break; case Direction.Left: x = blocks0.Origion.X - Block.WIDTH; y = blocks0.Origion.Y; break; case Direction.Right: x = blocks0.Origion.X + Block.WIDTH; y = blocks0.Origion.Y; break; blocks.Insert(0, new SnakeBlock(x, y, color, true); blocks.RemoveAt(blocks.Count - 1); public void Display(Graphics g) for (int i = 0; i length; i+) blocksi.Display(g, direction); public void Clear(Graphics g, Color backGroundColor) for (int i = 0; i blockNum - 1; i-) blocksi.Clear(g, backGroundColor); blocks.RemoveAt(i); length = blockNum; 石塊的定義定義如下,在空白區(qū)域中定義一個(gè)位置(坐標(biāo)),使之固定不動(dòng),在蛇頭撞到這個(gè)坐標(biāo)的時(shí)候,參數(shù)傳到判斷蛇生死的函數(shù),時(shí)蛇死亡,游戲結(jié)束。 public bool MeetStone(Point origion) if (blocks0.Origion.X = (origion.X + 40) & blocks0.Origion.Y = (origion.Y + 40) | (blocks0.Origion.X = (origion.X + 300) & blocks0.Origion.Y = (origion.Y + 80) | (blocks0.Origion.X = (origion.X + 150) & blocks0.Origion.Y = (origion.Y + 200)| (blocks0.Origion.X = (origion.X + 100) & blocks0.Origion.Y = (origion.Y + 400) return true; else return false; 當(dāng)蛇碰到一個(gè)豆時(shí),使豆成為蛇體的一部分,其顏色和大小跟蛇一樣,蛇身增加。 public bool CanEatBean(Bean bean) if (blocks0.Origion = bean.Origion) return true; else return false; public int CanEatSnake() for (int i = 3; i blocks.Count; i+) if (blocks0.Origion = blocksi.Origion) return i; return 0; public void EatBean(Bean bean, Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight) bean.Clear(g, backGroundColor); Grow(); bean.Creat(g, backGroundColor, lawnWidth, lawnHeight, this); eatebean = true; public bool IsAlive(int lawnWidth, int lawnHeight) if (blocks0.Origion.X 0) return false; if (blocks0.Origion.Y lawnWidth) return false; if (blocks0.Origion.Y + Block.HEIGHT lawnHeight) return false; else return true; Game控制游戲的運(yùn)行,負(fù)責(zé)在游戲開始時(shí)生成Bean、Stone和Snake,以及負(fù)責(zé)在游戲運(yùn)行中Snake的移動(dòng)、Snake的生長(zhǎng)、Bean的重生和石塊的生產(chǎn)。并隨時(shí)檢測(cè)Snake的生死狀態(tài)。Game類的參考代碼如下: class Game Point origion; public Snake snake; public Bean bean; public bool isSnakeAlive; public int lawnWidth; public int lawnHeight; public Game(int _lawnWidth, int _lawnHeight) Random random = new Random(); int x = random.Next(0, _lawnWidth - 1) / Block.WIDTH * Block.WIDTH; int y = random.Next(0, _lawnHeight - 1) / Block.HEIGHT * Block.HEIGHT; Direction direction = (Direction)random.Next(1, 4); snake = new Snake(Color.Red, direction); bean = new Bean(Color.Red); isSnakeAlive = false; lawnWidth = _lawnWidth; lawnHeight = _lawnHeight; public void Begin(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight) isSnakeAlive = true; snake.Clear(g, backGroundColor); snake.Creat(g, backGroundColor, lawnWidth, lawnHeight); bean.Creat(g, backGroundColor, lawnWidth, lawnHeight, snake); 游戲中石塊的填充,可以根據(jù)自己制定的坐標(biāo)來(lái)固定石塊,可以改變其顏色。 SolidBrush brush = new SolidBrush(Color.DarkViolet); Pen pen = new Pen(Color.DarkViolet); g.FillRectangle(brush, origion.X + 40, origion.Y + 40, 10, 10); g.DrawRectangle(pen, new Rectangle(origion.X + 40, origion.Y + 40, 10, 10); g.FillRectangle(brush, origion.X + 300, origion.Y + 80, 10, 10); g.DrawRectangle(pen, new Rectangle(origion.X + 300, origion.Y + 80, 10, 10); g.FillRectangle(brush, origion.X + 150, origion.Y + 200, 10, 10); g.DrawRectangle(pen, new Rectangle(origion.X + 150, origion.Y + 200, 10, 10); g.FillRectangle(brush, origion.X + 100, origion.Y + 400, 10, 10); g.DrawRectangle(pen, new Rectangle(origion.X + 100, origion.Y + 400, 10, 10); public void OnTime(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight) 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); int blockNum = snake.CanEatSnake(); if (blockNum 0) snake.RemoveAfter(g, backGroundColor, blockNum); isSn
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 發(fā)電企業(yè)管理評(píng)審報(bào)告
- 《金融市場(chǎng)分析》課件
- 合理安排中級(jí)審計(jì)師試題及答案復(fù)習(xí)
- 無(wú)人機(jī)操作人員資格試題及答案
- 《全球消防產(chǎn)業(yè)合作》課件
- 執(zhí)行力培訓(xùn)課程
- 安全生產(chǎn)夏季四防工作要點(diǎn)
- 《腎病綜合征研究進(jìn)展》課件
- 學(xué)前班教師個(gè)人工作總結(jié)模版
- 倒睫的臨床護(hù)理
- 臨床醫(yī)學(xué)同等學(xué)力申碩《內(nèi)科學(xué)》考試題庫(kù)大全(含真題、典型題等)
- 機(jī)車檢測(cè)與監(jiān)測(cè)技術(shù) 課件 項(xiàng)目4 機(jī)車車載安全防護(hù)系統(tǒng)(6A系統(tǒng))
- 比較思想政治教育智慧樹知到期末考試答案章節(jié)答案2024年西南大學(xué)
- 供應(yīng)商改善計(jì)劃表
- DLT 5285-2018 輸變電工程架空導(dǎo)線(800mm以下)及地線液壓壓接工藝規(guī)程
- 10以上20以內(nèi)加減法
- 五年級(jí)家長(zhǎng)會(huì)數(shù)學(xué)老師講話課件
- 急產(chǎn)分娩應(yīng)急演練方案
- 2024中國(guó)充電基礎(chǔ)設(shè)施服務(wù)質(zhì)量發(fā)展報(bào)告-車百智庫(kù)+小桔充電
- 消防維修期間無(wú)水應(yīng)急預(yù)案
- (完整word版)體檢報(bào)告單模版
評(píng)論
0/150
提交評(píng)論