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

下載本文檔

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

文檔簡介

鄭州輕工業(yè)學院實訓報告實訓名稱:貪吃蛇 指導教師: 姓名: 學號: 班級: 提交日期: 一.實驗目的通過開發(fā)一款貪吃蛇游戲程序,熟練掌握C#編程語言、和面向?qū)ο蟪绦蛟O計方法,獨立完成一個游戲程序的開發(fā)。二.實驗題目 本次實訓的題目為貪吃蛇。通過使用C#編程語言來實現(xiàn)。三.功能描述1.游戲的基本功能描述1) 游戲場地是一片矩形區(qū)域的空地構(gòu)成,蛇可以在這片定義的區(qū)域中自由移動。2) 定義一個Block來構(gòu)成石塊,蛇頭,蛇身以及豆。蛇由蛇頭和蛇身組成。3) 當游戲開始之后,定義的區(qū)域中出現(xiàn)一顆豆和一條蛇,并且蛇不停地移動,蛇移動的方向與蛇頭的方向一致。4) 通過space或者暫停鍵可以使游戲停止,蛇停止移動,分數(shù)停止積分。5) 當蛇移動時,玩家可以使用“”、“”、“”和“”四個方向鍵改變蛇的移動方向。6) 當蛇頭與豆的位置重合時,豆被蛇吃掉,同時在草坪中再生成一顆新的豆,蛇身增加一節(jié)。7) 當蛇頭碰到石塊時,蛇死亡,游戲結(jié)束。8) 當蛇頭咬到蛇身時,則蛇死亡,游戲結(jié)束。9) 當蛇頭碰到草坪四周時,蛇立即斃命,游戲結(jié)束。10) 游戲分為不同的級別,第一關(guān)游戲速度為200,當蛇吃五個豆子就可以過關(guān),級別顯示為2,速度增加100變?yōu)?00.第二關(guān)為吃夠10個豆子,速度增加50,以后以此類推。11) 游戲菜單中設有游戲幫助,玩家可以通過點擊幫助了解游戲的玩法。12) 對于不是第一次玩的玩家可以改變蛇的運動速度,來增加難度。在菜單中設有加速和減速兩個鍵,單擊可以改變速度。13) 游戲菜單中還有時間顯示。14) 當游戲暫停時,可以通過“繼續(xù)”鍵使游戲繼續(xù)進行。四.需求分析本游戲用戶可以自己練習和娛樂。本游戲需要滿足以下幾點要求:(1) 利用方向鍵“、”來改變蛇的運行方向。 (2) 空格鍵暫停游戲,并在隨機的地方產(chǎn)生食物。 (3) 吃到食物就變成新的蛇體,碰到壁或自身則游戲結(jié)束,否則正常運行。可行性分析:貪吃蛇游戲是一種簡單的大眾的游戲,自從計算機實現(xiàn)以來,深受廣大電腦玩家的喜愛,做一個簡單的貪吃蛇小游戲。貪吃蛇的核心算法是如何實現(xiàn)蛇的移動和吃掉食物后如何變成新的蛇體。沒有碰到食物的時候,把當前運動方向上的下個節(jié)點入隊,并以蛇節(jié)點的顏色繪制這個節(jié)點,然后把頭指針所指的節(jié)點出隊,并以游戲框架內(nèi)部背景色重繪出隊的節(jié)點,這樣就可以達到移動的效果。而在吃到食物的時候,則只需把食物入隊即可。實現(xiàn)貪吃蛇的基本的蛇身移動、吃到食物身體增長、和碰到墻壁或自身死亡,能夠暫停和開始。玩家可以根據(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控件,顯示速度、時間、日期和積分的。五.設計說明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ū)域游戲開始生成石塊生成豆生成蛇重新開局吃到蛇身增加豆增加級別統(tǒng)計分數(shù)石塊碰到石壁游戲結(jié)束游戲的設計如下:游戲圖標及名稱豆子成績顯示速度顯示游戲菜單蛇身級別顯示石塊游戲的定義區(qū)域日期及時間顯示六.源代碼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是用來構(gòu)成Bean(豆)和Snake(蛇)還有Stone(石塊)的最基本的單位,是Bean和SnakeBlock的基類。Block類的參考代碼如下。 class Block protected Point origion; /Block的左上頂點 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); 這是對豆的定義,是由Block派生而來的,在系統(tǒng)開始時,使豆產(chǎn)生,它的出現(xiàn)位置為隨機生成。其代碼如下: class Bean : Block public static int f = 0;/吃到豆子的個數(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派生而來的。它組成蛇身,其代碼如下所示: 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; 控制蛇頭運動的方向 public enum Direction Up, Down, Left, Right ;對蛇的編碼也是由Block派生而來的,在這里面可以定義蛇的顏色和長度。 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);蛇運動的方向控制 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ū)域中定義一個位置(坐標),使之固定不動,在蛇頭撞到這個坐標的時候,參數(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; 當蛇碰到一個豆時,使豆成為蛇體的一部分,其顏色和大小跟蛇一樣,蛇身增加。 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控制游戲的運行,負責在游戲開始時生成Bean、Stone和Snake,以及負責在游戲運行中Snake的移動、Snake的生長、Bean的重生和石塊的生產(chǎn)。并隨時檢測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ù)自己制定的坐標來固定石塊,可以改變其顏色。 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論