搜档网
当前位置:搜档网 › unity制作贪吃蛇

unity制作贪吃蛇

unity制作贪吃蛇
unity制作贪吃蛇

Hello,欢迎来到2D经典游戏——贪吃蛇的游戏教程!我是来自于Unity论坛的raiden,一个程序员。

最近,我用google搜索经典游戏,就发现了Gremlin在1976年发布原始版本的经典的贪吃蛇游戏,我对自己说“为什么不用Unity来做这个游戏呢?”

所以,我宣布,作为一个目标,我不仅要编程游戏,还要以绝对不需要技术设计或建模经验的方式来做。

然后我决定,由于我是用非常“OOP”的方式来编程,“为什么我不把它做成教程呢”,这就是我为什么要完成这个教程的初衷。

你需要的东西:

?Unity游戏引擎–Unity

?CFXR – For Mac Users

?SFXR– For Windows Users

注意:这个游戏用到了4中声音效果,Death.wav、 Food Pickup.wav、Move1Blip.wav以及 Move2 Blip.wav。如果你不想自己制作这4种音效,你可以下载我已经做好的: Game Sounds Effects。在“创建项目”部分,我也会提示你下载这些音效。如果你使用自己做的音效,确保它们的命名和我列出的保持一致。

你需要掌握的东西:

?Unity编辑器的基础知识

?Monodevelop基础知识

?一些通用的编程

教程内容包括:

?你将学到什么

?创建项目

?开始GameManager.cs 脚本

?第一辅助脚本 GUIHelper.cs

?第二辅助脚本 TextureHelper.cs

?SnakeGame.cs 脚本

?让我们来看一些东西

?第三辅助脚本InputHelper.cs

?第四和最后的辅助脚本 ScreenHelper.cs

?食物时间 Food.cs 脚本

?让我们来看一下!

?最后的脚本,player Snake.cs

?让我们开始游戏!

?

挑战! 你将学到什么

这一教程旨在让你对中级C#有进一步了解,并能够运用到自己的游戏中。

我们主要集中点在于C#的Singleton 。我将会在游戏中展示一些实用例子,它们怎样以一种独立并且更多的面向对象的方法来保证代码有结构和组织。

我将向你展示动态实例的力量,它怎样在运行时创造东西,以及更好的控制游戏中在什么时候什么地方发生什么。

我们还将概述“辅助”脚本(“Helper ” script ),展示这些脚本是怎么发挥快速执行某个动作的作用的,这可以运用到你的任何游戏项目中。你还将学到使用这些辅助脚本“overloading ”。 好了,废话不多说,我们开始吧!接下来,我们将开始游戏项目,以及游戏中需要的基本的文件夹/文件结构。Let's go!

创建项目 ?

使用Unity 创建一个新的项目,我们就把这个项目叫做Uni2DSnake ,不要导入任何资产。 ?

将场景保存为Uni2DSnake ?

在项目视图添加如下几个文件夹:Resources 、 Scripts ,在 Scripts 文件夹里添加BuildScripts 和Utils 两个文件夹。 ?

将C# 脚本GameManager.cs 添加到Scripts 文件夹 ?

将C# 脚本Food.cs 、 Snake.cs 、SnakeGame.cs 添加到BuildScripts 文件夹 ?

将C# 脚本GUIHelper.csc 、 InputHelper.cs 、ScreenHelper.cs 和TextureHelper.cs 添加到Utils 文件夹 ? 在场景中添加一个空的游戏对象,命名为GameManager ,并把GameManager.cs 脚本拖拽到上

? 在这里下载声音文件2D Snake Game Sounds ,添加包含声音的文件夹到Resources 文件夹。 就是这些,你的项目应该这样设:Uni2DSnake Tutorial Project Setup View

开始GameManager.cs 脚本

首先在Monodevelop 打开GameManager.cs 脚本,Unity 会默认插入如下代码:

1 2 3 4 5 6 using UnityEngine;

using System.Collections;

public class GameManager : MonoBehaviour

{

// assign public fields here

7 8 9 10 11 12 13 14 15 // assign private fields here

// Use this for initialization

void Start ()

{

}// Update is called once per frame

void Update ()

{

} }

我们需要做的就是为游戏开始GameManager 脚本,像这样:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

using UnityEngine; using System.Collections; ///

/// Stores game state and game information /// public class GameManager : MonoBehaviour { // ----------------------------------------------------------------------------------------- // Start() // ----------------------------------------------------------------------------------------- // Unity method, called at game start automatically // ----------------------------------------------------------------------------------------- void Start () { } } 所以基本上我们现在需要的是一些注释和一个空的Start 方法。在创建几个辅助脚本后,我们将回到GameManager ,添加一条建立贪吃蛇游戏的线。

就让我们开始创建几个辅助脚本吧!这样我们就能在Unity 中创建贪吃蛇游戏脚本并且能看到一些动作。

第一辅助脚本 GUIHelper.cs

1 2 3 4 using UnityEngine;

using System.Collections;

public class GUIHelper : MonoBehaviour

{

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 // method to create a GUIText object in the game

public static GUIText CreateGetGUIText(Vector2

offset, string strText, float layer)

{

// over load to add a name to the gameObject created

return CreateGetGUIText(offset, "GUITextObject", strText, layer);

}

// method to create a GUIText object in the game

public static GUIText CreateGetGUIText(Vector2

offset, string name, string strText, float layer)

{

// we need a new game object to hold the component

GameObject guiTextObject = new GameObject(name);

// set some gameObject

propertiesguiTextObject.transform.position = new Vector3(0, 0, layer);

guiTextObject.transform.rotation = Quaternion.identity; guiTextObject.transform.localScale = Vector3.one;

// add the GUIText component for display

GUIText guiDisplayText =

guiTextObject.AddComponent();

// we set the position to the Vector2 offset passed

guiDisplayText.pixelOffset = offset;

// we set the text to the string strText passed

guiDisplayText.text = strText;

// finally we return the GUIText component for game manipulation return guiDisplayText;

}

// method to create a GUITexture object in game

public static void CreateGUITexture(Rect coordinates, Color colTexture, float layer)

{

// over load to add a name to the gameObject created

CreateGUITexture(coordinates, colTexture, "GUITextureOBject", layer);

}

public static void CreateGUITexture(Rect coordinates, Color colTexture, string name, float layer)

{

// we need a new game object to hold the component

GameObject guiTextureObject = new GameObject(name);

// set some gameObject properties

guiTextureObject.transform.position = new Vector3(0, 0,

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 layer);

guiTextureObject.transform.rotation = Quaternion.identity; guiTextureObject.transform.localScale = new Vector3(0.01f, 0.01f, 1.0f);

// add our GUITexture Component

GUITexture guiDisplayTexture =

guiTextureObject.AddComponent();

// create a simple 1x1 black texture

Texture2D guiTexture =

TextureHelper.Create1x1Texture(colTexture);

// set some GUITexture properties

guiDisplayTexture.texture = guiTexture;

guiDisplayTexture.pixelInset = coordinates;

}

// method to create a GUITexture object in game

public static GUITexture CreateGetGUITexture(Rect coordinates, Color colTexture, float layer)

{

// over load to add a name to the gameObject created return CreateGetGUITexture(coordinates,

colTexture, "GUITextureOBject", layer);

}

public static GUITexture CreateGetGUITexture(Rect coordinates, Color colTexture, string name, float layer)

{

// we need a new game object to hold the component

GameObject guiTextureObject = new GameObject(name);

// set some gameObject properties

guiTextureObject.transform.position = new Vector3(0, 0, layer);

guiTextureObject.transform.rotation = Quaternion.identity; guiTextureObject.transform.localScale = new Vector3(0.01f, 0.01f, 1.0f);

// add our GUITexture Component

GUITexture guiDisplayTexture =

guiTextureObject.AddComponent();

// create a simple 1x1 black textureTexture2D guiTexture = TextureHelper.Create1x1Texture(colTexture);

// set some GUITexture properties

guiDisplayTexture.texture = guiTexture;

guiDisplayTexture.pixelInset = coordinates;

// return our GUITexture

return guiDisplayTexture;

}

} 这是辅助脚本的第一部分,请注意它是如何执行特定的GUI 功能的。通过允许使用者轻松创建一个GUIText 文本对象,或者GUITexture 对象。这个以前版本的教程里,脚本是单独分开的,命、得分、屏幕边缘以及屏幕场地都做了一个公共的东西。通过这种方式使用辅助脚本,我们就只需通过调用它来为游戏创建我们想要的东西。

以第一个方法作为开始CreateGetGUIText(Vector2 offset, string strText, float layer),这个方法的第一行,是另一种方法的调用,叫做overloading 。这看起来确实很奇怪,但是overloading 允许我们用不同参数调用同一种方法。你会注意到第一次调用CreateGetGUIText 只有3个参数:offset, strText & layer ,但是该方法内调用CreateGetGUIText ,需要4个参数。为什么要这样做呢?因为这可以在一定程度上使你的脚本变灵活,让你更容易地用你传递的参数类型和数量来做不同的事。请注意我在用4个参数调用CreateGetGUIText 做什么。我传递一个文本字符串“GUITextureObject”,所有这些为创建的游戏对象配置了一个默认名称。通过overloading 这种方法,我还可以通过4个参数调用CreateGetGUIText 传递我自己的一个字符串,来命名创造出的游戏对象。非常酷!

因此,这一方法,CreateGetGUIText 。先在世界中创建一个新的游戏对象,注意它是怎样使用参数“name”来为创建出的游戏对象命名的。接着我们来给游戏对象转换设置一些属性。注意:

guiTextObject.transform.position 为“z”位置使用层参数。这样做能在其他GUI 对象的的顶部显示GUI 对象。我们需要这个来在GUITextures 上显示GUIText 。

现在我们想要添加GUIText 组件并返回它。接下来用传递的参数来为GUIText 设置一些属性。看看这如何允许我们创建我们自己定制的GUIText 对象!最后回到GUIText 组件,因为在玩游戏需要更新“text”属性。再来看开始的CreateGUITexture ,另一个overload 。它所做的和CreateGetGUIText 的overload 是一样的。它传递第四个参数来命名创建的游戏对象。CreateGUITexture 虽然有一些不同的参数,你将注意到我们传递一个矩形,一个颜色以及又一个层。

我们以创建一个空对象开始,如果不通过一个名称字符串的话,我们就传递“name”或者默认的文字名称来命名。我们设置了一些转变属性,再一次使用了“layer”来指定显示的深度。然后添加并返回GUITexture 组件。下一行将做一些稍有不同的事情,宣布一个Texture2D 并且调用另一个辅助脚本来创建该纹理并返回它。看看辅助脚本多有用处!最后,通过从上面的行返回的纹理设置GUITexture 的纹理属性,再用传递的矩形参数设置GUITexture 的像素嵌入。

注意:你可能注意到了还有一个CreateGetGUITexture 方法,这让我们可以创建并返回GUITexture 。在教程的随后部分中,你将看到我们在什么地方使用它。

这就是所有的GUIHelper.。比较酷的是这个脚本可以用在任何需要GUIText 或 GUITexture 的游戏中。记住这一点:GUIHelper.是建立在TextureHelper 之上的,所有你需要把这些打包在一起。

第二辅助脚本 TextureHelper.cs

编写TextureHelper.cs 脚本

1 2 3 4 5 using UnityEngine;

using System.Collections;

public class TextureHelper : MonoBehaviour

{

// overloaded method to create a texture with color, or if no

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 color is passed, return a black texture

public static Texture2D CreateTexture(int width, int height) {

return CreateTexture(width, height, Color.black);

}

// Create and return a black texture

public static Texture2D CreateTexture(int width, int height, Color color)

{

Texture2D texture = new Texture2D(width, height);

for (int i = 0; i < width; i++)

{

for (int j = 0; j < height; j++)

{texture.SetPixel(i, j, color);

}

}

texture.Apply();

return texture;

}

// Create and return a 1x1 texture, if no color is passed, then a black texture will be created

public static Texture2D Create1x1Texture()

{

return Create1x1Texture(Color.black);

}

// Create and return a 1x1 texture with Color

public static Texture2D Create1x1Texture(Color color) {

Texture2D texture = new Texture2D(1, 1);

texture.SetPixel(0, 0, color);

texture.Apply();

return texture;

} }

TextureHelper 脚本提供一种在Unity 中拓展“Texture2D”的方法,能在代码中迅速实现某些东西。大多是非常简单的,我们在创建“公共静态”方法,这样我们不用在游戏实例中创建就可以直接访问它。 所以你能够看到,我们再一次做了一些overloading 的方法,可以选择创建什么样的尺寸、颜色和纹理。在这个方法中,我们执行一些基本例程来返回纹理。在CreateTexture 中,我们通过一个高度和宽度来指定纹理的大小,还可以通过一个颜色参数来给纹理添加某个颜色。

注意:如果我们不指定颜色纹理将如何默认为黑色。在CreateTexture 和Create1x1Texture ,宣布一个新的Texture2D 并也给它设定宽度和高度,或者直接设置宽和高为1 x 1像素。再设置像素位置的颜色,或者默认为黑色。然后应用设置并回到纹理。

就这样,你已经学会了动态创建纹理的方法。

我知道我们已经在Unity 里做了很多,但是却搁置在那儿,只要再多一个脚本我们就能看到结果。现在该写SnakeGame.cs 脚本了。 Snakegame 脚本,正如他的名字所蕴含的,控制贪吃蛇游戏。现在,就让我们开始吧!

SnakeGame.cs 脚本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 using UnityEngine;

using System.Collections;

public class SnakeGame : MonoBehaviour

{

// private fields

private static SnakeGame instance = null;

//private GameGUI displayGUI;

private GUIText displayLives;

private GUIText displayScore;

// fields

public int gameScore = 0;

public int gameLives = 3;

public int scoreMultiplier = 100;

//

---------------------------------------------------------------------------------------------------

// constructor field: Instance

//

---------------------------------------------------------------------------------------------------

// Creates an instance of ScreenField if one does not exists //

---------------------------------------------------------------------------------------------------

public static SnakeGame Instance

{

get

{

if (instance == null)

{

instance

= new GameObject("SnakeGame").AddComponent(); }

return instance;

}

}

//

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ---------------------------------------------------------------------------------------------------

// Unity method: OnApplicationQuit()

//

---------------------------------------------------------------------------------------------------

// Called when you quit the application or stop the editor player //

---------------------------------------------------------------------------------------------------

public void OnApplicationQuit()

{

DestroyInstance();

}

//

---------------------------------------------------------------------------------------------------

// DestroyInstance()

//

---------------------------------------------------------------------------------------------------

// Destroys the ScreenField instance

//

---------------------------------------------------------------------------------------------------

public void DestroyInstance()

{

print("Snake Game Instance destroyed");

instance = null;

}

//

---------------------------------------------------------------------------------------------------// UpdateScore() //

---------------------------------------------------------------------------------------------------

// Updates the game score, and the Score GUIText text display //

---------------------------------------------------------------------------------------------------

public void UpdateScore(int additive)

{

// add to our current game score

gameScore += additive * scoreMultiplier;

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 // update our display

displayScore.text = "Score: " + gameScore.ToString(); }

//

---------------------------------------------------------------------------------------------------

// UpdateLives()

//

---------------------------------------------------------------------------------------------------

// Updates the snakes lives, and the Lives GUIText text display //

---------------------------------------------------------------------------------------------------

public void UpdateLives(int additive)

{

// add to our current game score

gameLives += additive;

// clamp to o if lower

gameLives = Mathf.Clamp(gameLives, 0, 3);

// update our display

displayLives.text = "Lives: " + gameLives.ToString(); }

//

---------------------------------------------------------------------------------------------------

// Initialize()

//

---------------------------------------------------------------------------------------------------

// Initializes SnakeGame

//

---------------------------------------------------------------------------------------------------

public void Initialize()

{

print("SnakeGame initialized");

// initialize transform information

transform.position = Vector3.zero;

transform.rotation = Quaternion.identity;

transform.localScale = Vector3.one;

// initialize SnakeGame variables

gameScore = 0; // no score initially

gameLives = 3; // 3 lives to start with

68 69 70 71 72 73 74 75 76 77 7

8

7

9

8

8

1

8

2

8

3

8

4

8

5

8

6

8

7

8

8

8

9

scoreMultiplier = 100; // adjusts score display

// setup our snake game border background

GUIHelper.CreateDisplayGUITexture(new Rect(0,0,1024,768), Color.grey, "Background Screen", 0);

// setup our snake game playing field

GUIHelper.CreateDisplayGUITexture(new Rect(22,84,980,600), Color.black, "Playing Field Screen", 1);

// create and initialize our score GUIText

displayScore =

GUIHelper.CreateDisplayGUIText(new Vector2(10,758), "Game Score", "Score", 1);

// update our integer score and display score

UpdateScore(0);

// create and initialize our lives GUIText

displayLives =

GUIHelper.CreateDisplayGUIText(new Vector2(944,758), "Game Lives", "Lives", 1);

// update our integer lives and display lives

UpdateLives(0);}

}

9

9

1

9

2

9

3

9

4

9

5

9

6

9

7

9

8

9

9

1

1

1

1

2

这就是贪吃蛇游戏脚本,结构整齐,注释清楚,这两点都是很好的编程规则。

脚本的第一部分,我们声明了一个贪吃蛇游戏数据类型的私有静态实例。其实这就是在声明一个Singleton。这允许我们通过调用类的实例把贪吃蛇脚本“链接”到其他脚本上。下面是贪吃蛇另一种的声明类型,但它是一个不同字段的两种方式。第一,它的名字不一样,它在字段名Instance里有一个大写字母的“I”,而不是像先前那样叫做“instance”。第二,在字段名里用了一个关键词“get”,这是为了将“instance”类返回到“Instance”。我把这个叫做“constructor field”,因为在“instance”为空的时候在字段里创造一个游戏对象。这太棒了!我们现在有动态实例化的游戏对象,还有一个贪吃蛇游戏公共字段和方法的单例参考。

接下来我们将声明两个私有的GUIText displayLives 和 displayScore字段。因为在贪吃蛇游戏中,我们需要一个GUIText来显示分数,a GUIText来显示命。

然后,我们声明3个公共字段,gameScore, gameLives 以及scoreMultiplier。这个会随着我们玩游戏的进程更新,并且是基于游戏中发生的某些动作更新的。

现在到了OnApplicationQuit(), 这是Unity的方法,在我们放弃游戏或者在编辑器中推出播放时发生。这简单的调用了另一个公共方法DestroyInstance(),它把一些信息复制到控制台,设置实例为空。这是一个能让你退出游戏后将东西清理干净的整洁方式。

再接着是公共UpdateScore 和 UpdateLives 方法,这允许你从别的脚本里改变游戏得分和游戏生命,同时还会更新displayScore GUIText 和 displayLives GUIText 的显示文本。

最后,我们来看看贪吃蛇游戏的核心代码Initialize()。这个操作在游戏对象产生时进行设置。他以设置转换属性开始,初始化ameScore, gameLives and scoreMultiplier 。接下来的几行是辅助脚本真正发挥作用的地方。贪吃蛇游戏需要一个背景,所以,我们用首先GUIHelper 脚本来做一个边界,再做一个游戏区域。记住,在GUIHelper 脚本里,CreateDisplayGUITexture 方法创造一个游戏对象,添加GUITexture 组件,通过参数来给GUITexture 设置大小、颜色、给游戏对象命名,以及在其他GUI 对象上显示“Z”深度层。 接下来我们创建一个GUIText 对象来显示得分,然后重置得分为0,调用updatescore (0)。我们再创建一个GUIText 对象来显示命,重置命,调用updatelives (0)(注:你可能会问,为什么我们没有updatelives (3),因为我们已经初始化gamelives 为3,如果你看看updatelives 方法,它添加传递至当前命的数量,如果我们已用这种方式初始化updatelives (3),我们将显示6条命,而不是3)。 现在该来看看结果了!等等,我按下了播放键却什么也看不见!这就对了,我们需要给GameManager 做一个小的变化来看看snakegame.cs 在做什么。

让我们来看一些东西

先把GameManager.cs 更新成这样:

1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

8

using UnityEngine; using System.Collections; ///

/// Stores game state and game information /// public class GameManager : MonoBehaviour { // --------------------------------------------------------------------------------------------------- // Start() // --------------------------------------------------------------------------------------------------- // Unity method, called at game start automatically // --------------------------------------------------------------------------------------------------- void Start () { // build our SnakeGame object SnakeGame.Instance.Initialize(); } }

现在,按下Unity的Play键,你应该能看到脚本的结果了,就像截屏这样:

看上去好多了,但是还是没有游戏。所以接下来就该添加第三个帮助脚本了。InputHelper.cs.

编写 InputHelper.cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 using UnityEngine;

using System.Collections;

public class InputHelper : MonoBehavior

{

// handle multi Input

public static bool GetStandardMoveMultiInputKeys()

{

// check W

if (Input.GetKey (KeyCode.W) && Input.GetKey (KeyCode.A)) { return true; }

if (Input.GetKey (KeyCode.W) && Input.GetKey (KeyCode.S)) { return true; }

if (Input.GetKey (KeyCode.W) && Input.GetKey (KeyCode.D)) { return true; }

// check A

if (Input.GetKey (KeyCode.A) && Input.GetKey (KeyCode.S)) { return true; }

if (Input.GetKey (KeyCode.A) && Input.GetKey (KeyCode.D)) { return true; }

// check S

if (Input.GetKey (KeyCode.S) && Input.GetKey (KeyCode.D)) { return true; }

// D is resulted in the above checks

// check UpArrow

if (Input.GetKey (KeyCode.UpArrow) && Input.GetKey

(KeyCode.LeftArrow)) { return true; }

if (Input.GetKey (KeyCode.UpArrow) && Input.GetKey

(KeyCode.DownArrow)) { return true; }

if (Input.GetKey (KeyCode.UpArrow) && Input.GetKey

(KeyCode.RightArrow)) { return true; }

// check LeftArrow

if (Input.GetKey (KeyCode.LeftArrow) && Input.GetKey

(KeyCode.DownArrow)) { return true; }

if (Input.GetKey (KeyCode.LeftArrow) && Input.GetKey

(KeyCode.RightArrow)) { return true; }

// check DownArrow

if (Input.GetKey (KeyCode.DownArrow) && Input.GetKey

(KeyCode.RightArrow)) { return true; }

// RightArrow is resulted in the checks above

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 return false;

}

// handle up direction

public static bool GetStandardMoveUpDirection()

{

if (Input.GetKey (KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) { return true; }

return false;

}

// handle left direction

public static bool GetStandardMoveLeftDirection()

{

if (Input.GetKey (KeyCode.A) ||

Input.GetKey(KeyCode.LeftArrow)) { return true; }

return false;

}

// handle down direction

public static bool GetStandardMoveDownDirection()

{

if (Input.GetKey (KeyCode.S) ||

Input.GetKey(KeyCode.DownArrow)) { return true; }

return false;

}

// handle left direction

public static bool GetStandardMoveRightDirection()

{

if (Input.GetKey (KeyCode.D) ||

Input.GetKey(KeyCode.RightArrow)) { return true; }

return false;

}

} InputHelper.cs 是类似于GUIHelper.cs 和TextureHelper.cs 的另一个辅助脚本。请注意:辅助脚本是可以用于多个游戏项目的。

从最上面开始 GetStandardMoveMultiInputKeys(),我们测试多标准的移动键盘按键,如果同时按下了多个按键,就返回True ,反之则返回false 。

下面的函数是一样的,除了只测试一个特定的按键,在按下该按键后返回true 或false 这一点。 我知道好像我们已经走了很长的路,只是为了显示某些颜色和屏幕上的文本,然后放在哪儿。 现在,我们需要最终的辅助脚本, ScreenHelper.cs 。

编写 ScreenHelper.cs

1 2 using UnityEngine;

using System.Collections;

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

2

4

public class ScreenHelper : MonoBehaviour

{

//

---------------------------------------------------------------------------------------------------

// FlashDeathScreen()

//

---------------------------------------------------------------------------------------------------

// Flashes the death screen for a number of times, for a delayed amount, with a specified color

//

---------------------------------------------------------------------------------------------------

public static IEnumerator

FlashScreen(int flashTimes, float flashDelay, Color

flashColor)

{

// create our flash screen texture

GUITexture flashScreenTexture =

GUIHelper.CreateGetGUITexture(new Rect(0, 0, 1024, 768), flashColor, 20);

for (int i = 0; i < flashTimes; i++)

{

flashScreenTexture.color = flashColor;

yield return new WaitForSeconds(flashDelay);

flashScreenTexture.color = Color.clear;

yield return new WaitForSeconds(flashDelay);

}

// remove our flash death screen object since we only need this in the game when we die

Destroy(flashScreenTexture.gameObject);

} }

非常简单,在ScreenHelper 里只有一个帮助,当然我们可以添加更多,但是对于这个游戏,我们只想简单的通过红屏闪烁来表示蛇死了。 Ok ,现在你会发现第一关,这种函数是在C#返回类型IEnumerator ,这种返回类型是在你使用“yield”来等待时间量的时候才需要的。所以FlashDeathScreen 匹配了一个完整的flashTime 。这就是多少次你想要闪现,一个flashDelay 出现,这是闪现和颜色之间的延迟时间量,这是该闪现什么颜色。

接下来,嗯,这看起来很熟悉,现在我们要用GUIHelper 脚本了,但是这一次,我们要创造一个GUITexture 并返回,这是有意义的,因为我们想要操纵纹理的颜色来模拟闪屏。通过一个“for”循环计数flashTimes ,用匹配的颜色显示GUITexture ,等待flashDelay 量,然后设置GUITexture 清除。基本上,这能开启并关闭纹理,模拟出闪屏。最后一行消灭了GUITexture 游戏对象。

如果你想知道这种函数是怎么实现调用的,请看一下Snake 的第138行。它在自己撞到自己而造成的破坏运动循环的时候,产出StartCoroutine 来发出FlashDeathScreen ,

TIP :在世界中产生和销毁游戏对象应该把对象视为一个小小的生命,FlashScreen 对象只是提供一个创造死亡效果的暂时性用途,然后就结束了。请在你的游戏中为游戏对象考虑这些,简单的问一下“这个对象是暂时的还是永久的”,然后再把那些临时用途实例化或是摧毁。

饿了吗?O(∩_∩)O 哈哈~现在就来生产一些食物吧,接下来是Food.cs

编写 Food.cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2

style="line-height:1.5;">using UnityEngine; using Syst em.Collections;

public class Food : MonoBehaviour {

// public fields

public Rect foodPos = new Rect(0,0,20,20);

// private fields

private static Food instance = null;

private static int[] initXPos = new int[]

{22,42,62,82,102,122,142,162,182,202,222,242,262,282,302,322,342,362,

382,402,422,442,462,482,502,522,542,562,582,602,622,642,662,682,702,

722,742,762,782,802,822,842,862,882,902,922,942,962,982}; private static int[] initYPos = new int[]

{94,114,134,154,174,194,214,234,254,274,294,314,334,354,374,394,414,

434,454,474,494,514,534,554,574,594,614,634,654};

private Texture2D foodTexture;

private AudioClip foodPickup;

//

---------------------------------------------------------------------------------------------------

// constructor field: Instance

//

---------------------------------------------------------------------------------------------------

// Creates an instance of Food if one does not exists

//

-------------------------------------------------------------

0 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 4--------------------------------------

public static Food Instance

{

get

{

if (instance == null)

{

instance = new GameObject("Food").AddComponent(); }

return instance;

}

}

//

---------------------------------------------------------------------------------------------------

// Unity method: OnApplicationQuit()

//

---------------------------------------------------------------------------------------------------

// Called when you quit the application or stop the editor player //

---------------------------------------------------------------------------------------------------

public void OnApplicationQuit()

{

DestroyInstance();

}

//

---------------------------------------------------------------------------------------------------

// DestroyInstance()

//

---------------------------------------------------------------------------------------------------

// Destroys the Food instance

//

---------------------------------------------------------------------------------------------------

public void DestroyInstance()

{

print("Food Instance destroyed");

instance = null;

}

//

贪吃蛇小游戏实验报告[

软件设计报告 设计题目:贪吃蛇 学院:华北电力大学科技学院 专业班级:软件10K1 学生姓名:张飞 学生学号:101909020122 指导教师:乔玲玲 提交时间: 成绩: - 0 -

目录 一.需求分析 二.概要设计 三.详细设计 四.心得体会 一.需求分析 1.1关于题目 1.1.1题目要求 利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求: (1)应用MFC单文档制作 (2)能够记录游戏成绩 (3)可根据玩家要求设置游戏速度(级别):初级,中级,高级 (4)可以根据个人喜好更换背景图片,食物图片,障碍物图片,结束图片等 1.1.2选题背景 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此我们选定了这个题目。 1.2关于编译软件 本程序采用Microsoft Visual C++6.0的英文版本进行编译。VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。 - 1 -

- 2 - 1.3关于兼容性 本程序经过调试,可以在XP 系统下编译运行,也可以在Vista 下运行,界面稍有不同,但不影响运行结果。 二. 概要设计 2.1软件主要功能设计 2.1.1程序结构 根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。具体的程序结构如下面的图1-1所示。 图2-1 贪吃蛇结构图 2.1.2程序流程 根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括: 游戏开始,随机出现食物。 贪吃蛇 游 戏开始 游戏设置 游戏结束 开始 初级 中级 高级 结束

贪吃蛇游戏课程设计实验报告全解

辽宁科技大学课程设计说明书 设计题目:基于C#的贪吃蛇游戏 学院、系:装备制造学院 专业班级:计算机科学与技术 学生姓名:叶佳佳 指导教师:丁宁 成绩: 2015年12月12日

目录 一、概述 (1) 1、用C#实现该设计的方法 (1) 2、贪吃蛇游戏说明 (1) 二、实验目的及设计要求 (1) 1、实验目的 (1) 2、实验要求 (2) 三、课程设计具体实现 (2) 1、概要设计 (2) 1.1、设计思想 (2) 1.2、主模块实现 (2) 1.3、主函数流程图 (4) 2、详细设计 (5) 2.1、设计思想 (5) 2.2、具体模块实现: (5) 四、调试过程及运行结果 (10) 1、调试过程 (10) 2、实验结果 (11) 五、实验心得 (12) 六、参考资料 (13) 七、附录:源代码 (13)

一、概述 1、用C#实现该设计的方法 首先应该了解设计要求,然后按照功能设计出实际模块,每个模块都要完成特定的功能,要实现模块间的高内聚,低耦合。设计模块是一个相当重要的环节,模块的数量不宜太多,也不宜太少,要是每个模块都能比较简单的转换成流程图。模块设计完成后,就该给每个模块绘制流程图。流程图要尽可能的简单且容易理解,多使用中文,补一些过长的代码,增加理解难度。此外,流程图应容易转换成代码。 根据流程图编写好代码后在WindowsXP操作系统,https://www.sodocs.net/doc/d817639318.html,2008开发环境下进行运行测试,检查错误,最终设计出可行的程序。 2、贪吃蛇游戏说明 游戏操作要尽可能的简单,界面要尽可能的美观。 编写程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜欢的游戏:一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分;接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁、障碍物或身体交叉(蛇头撞到自己的身体),则游戏结束。游戏结束时输出相应得分。 具体要求有以下几点: (1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理; (2)系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面; (3)说明书、流程图要清楚; 二、实验目的及设计要求 1、实验目的 .NET课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对VC#.NET技术的理解和掌握; 提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质; 培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新 1

c语言课程设计贪吃蛇设计

. 《C语言程序设计》课程设计 题目:贪吃蛇游戏设计 学院:信息学院 专业:网络工程 姓名:李益双 学号:1101010121 班级:信息A1111班 指导教师:罗成 职称:讲师 完成日期:2012年6月

目录 1、前言 (3) 2、摘要 (4) 3、项目背景 (5) 4、需求分析 (6) 5、概要设计 (7) 6、详细设计与测试 (8) 601 定义蛇身的数据结构 (8) 602算法设计与程序流程图 (8) 602.1贪吃蛇算法设计 (8) 602.2程序流程图 (9) 603光标移动的设计与实现 (10) 603.1显示水平围墙的实现 (10) 603.2显示分数的实现 (11) 603.3接受玩家按键信息的实现 (11) 603.4游戏结束时显示信息的实现 (11) 604 贪吃蛇游戏主干的设计 (12) 604.1游戏的初始化与加载的实现 (12) 604.2食物随机产生的实现 (13) 604.3蛇身的增长设计 (14) 604.4蛇身的显示与移动的设计实现 (15)

604.5蛇的头部与物体碰撞的而设计实现 (16) 7、编码 (17) 8、结论 (18) 9、参考文献 (19) 10、致谢 (19) 前言 C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。 C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年由肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Micro soft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C+ +、Objective-C、Java、C#等。 1980年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局(American National Standard Institution)为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。1980年代至今的有关程式开发工具,一般都支持符合ANSI C的语法。

五子棋游戏实验报告

五子棋游戏实验报告 课程名称计算机程序设计(VB) 学号______________________ 姓名______________________ 班级______________________ 提交时间 五子棋软件设计 一、实验目的 1?通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提岀自己的想法及设计方案。 2?通过开发一个较大的系统,增强软件开发能力。 3?通过调试系统,增强逻辑思维能力。 二、实验内容 1.基本要求: (1)输入两个对手名字,然后进入游戏界面。 (2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。(棋盘15*15 ) (3)可以悔棋。 (4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。 (5)能够将棋局的结果保存,保存该棋局

结束的状态、对手名字、棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。

因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息 用文件技术进行棋局保存,思路相同。 (7)五子棋恢复棋局 思路:首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。 窗体启动事件应该完成的事情: 组合框中应该显示曾经保存的棋局名。因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最 后,因此表中关于棋局名的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据 这个特点编程序取出表中不同的棋局名。 具体算法: 用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给strfile,并加入到组合 框中,一直到表中最后一个记录 因为要从数据库中取岀相关数据到a数组中,因此要将a数组所有数据清零。 要建立一个data控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中选择的棋 局名比较),将数据库该棋局中所有信息都赋值给a数组及相关变量。 刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。 重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中。思路如下: 清屏一绘制棋盘一根据a数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值是1还是 2来决定在该位置绘制何颜色的棋子。 决定该黑白方走的blackwhite变量当时没有保存,可以采用在数据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的。 因此设置了一个变量做计数器,每走一步棋计数器的值加一。 用文件技术实现棋局恢复,思路相同。 (8)悔棋 悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔 一步棋即将那几个变量所表示的点的a数组信息清零。而后调用paint ()过程重画。 以上是教师带着学生完成的软件功能。 遗留问题:保存棋手姓名和棋局名并在恢复棋局的时候显示。(需要同学们自己完成)思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。 三、设计日期 十二月 四、完成日期 十二月 五、实验体会 其实,一开始学习vb我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。起初,我对待这门新课程和其他课

《贪吃蛇游戏课程设计》报告资料整理

贪吃蛇游戏程序设计 一、课程设计任务 贪吃蛇小游戏程序设计 二、设计要求 通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。 (1).收集资料,分析课题,分解问题,形成总体设计思路; (2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍; (3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行; (4).完成课程设计报告,并进行答辩 三、需求分析 3.1、程序功能 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

3.2、设计思想 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。

3.3、流程图

四、设计的具体实现 (1)函数定义 函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用 #define N 200 #define M 200 #include"graphics.h" #include #include #include #include #include #include #include #define LEFT 97//A #define RIGHT 100//D #define DOWN 115//S #define UP 119//W #define Esc 0x011b int i,key; int score=0; int gamespeed=250;//游戏速度可根据实际情况自行调整 struct Food { int x;//食物的横坐标 int y;//食物的纵坐标 int yes;//判断是否要出现食物的变量 }food;//食物的结构体 struct Snake { int x[M]; int y[M]; int node;//蛇的节数 int direction;//蛇的移动方向 int life;//蛇的生命,0表示活着,1表示死亡 }snake; void Init();//图形驱动

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一. 概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1、1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正就是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的与那个发,技术与工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习与将来实际软件开发打下坚实的基础。 1、2 设计的任务与需要的知识点 1、2、1 课程设计主要完成的任务 1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解与掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题与解决问题的能力。 1、2、2需要掌握与运用的知识点 1、2、3本次课程设计需要掌握与运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐与动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。 8) 结构化,模块化的设计方法。

贪吃蛇实验报告

创作编号: GB8878185555334563BT9125XW 创作者:凤呜大王* 《计算机程序设计》课程设计报告课题名称贪吃蛇游戏 班级 学号 姓名 指导教师 设计时间至 设计地点 常熟理工学院计算机科学与工程学院

常熟理工学院计算机科学与工程学院 目录 1 需求分析 (1) 2 系统分析和设计 (1) 2.1 数据结构的设计和选择的理由 (1) 2.2 系统模块划分和模块结构 (2) 2.3 流程图 (2) 2.4 数据类型、全局变量和函数说明 (3) 3 程序测试和运行结果 (4) 4 课程报告小结 (5) 4.1分数重叠显示 (5) 4.2速度太快 (5) 4.3食物可能出现在蛇身上 (5) 附录A:程序源代码 (6)

《C程序设计》课程设计 1 需求分析 【阐述课程设计应该完成的功能】 使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。 2 系统分析和设计 2.1 数据结构的设计和选择的理由 本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。 2.1.1从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例: struct Point { int x, y; } struct Point nodes[MAX_LENGTH]; //蛇身数组,MAX_LENGTH为最大蛇长 贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点: 1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用int direction;表示) 2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes[0]表示蛇头的时候,nodes[1]运动到nodes[0]处;nodes[2]运动到nodes[1]处...。 3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示) 根据上面的情况,我们可以设计蛇的数据结构如下: struct Snake { struct Point nodes[MAX_LENGTH]; //蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长 int length; //当前蛇长 int direction; //蛇头运动方向 int live; //蛇活的,还是已经死了? } 2.1.2 关于食物,有两个属性: 1. 坐标位置 2. 状态:存在,或被吃。 故我们用以下结构表示: struct Food { struct Point position; //食物的位置 int exist; //存在?还是被吃? } 1

贪吃蛇游戏程序设计实验报告

Windows编程大作业贪吃蛇设计与实现 学校:武汉轻工大学 院系: 班级: 姓名: 学号:

2015 年12月16日 目录 一、题目介绍 二、设计目的 三、详细设计 3.1贪吃蛇本体设计 3.2贪吃蛇食物设计 3.3游戏界面设计 3.3.1游戏初始化 3.3.2游戏开始 3.3.3游戏暂停 3.3.4游戏退出 3.3.5游戏总界面 3.3.6游戏区域与背景 3.3.7关于SNAKE 3.4玩法规则设计 3.5核心设计 四、功能测试 五、总结 六、参考文献

一、题目介绍: 编写一个基于MFC的小游戏。 基本要求: 1、实现一个小游戏 2、实现基本游戏控制功能 3、具有游戏数据保存功能 4、界面布局合理、美观; 二、设计目的: 通过使用vc++6.0实现一个小游戏的课程设计,进一步掌握MFC的高级使用方法和锻炼自己动手写程序的能力。了解游戏设计的整个过程,通过熟练使用MFC来设计游戏。程序主要包括:游戏界面设计,游戏菜单栏设计,游戏初始化,游戏控制等。培养和锻炼开发游戏的能力。 三、详细设计 3.1贪吃蛇的本体设计 贪吃蛇的头部拥有一个坐标(x,y),蛇体有一个长度len,蛇有一个运动方向direct,故定义一个结构体如下: struct Snake { int x,y; int len; int direct; }Snake[50]; 3.2贪吃蛇食物设计 贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。 struct Food { int x; int y; int isfood; }Food;

C语言贪吃蛇

------------ 大学 C语言程序设计课程设计(论文)题目:贪吃蛇 院(系): 专业班级: 学号: 学生姓名: 指导教师: 教师职称: 起止时间:

课程设计(报告)任务及评语 院(系):教研室: 学号学生姓名专业班级 程序设计 (报告) 题目 贪吃蛇 程序设计(报告)任务 程序设计的任务与要求: (1)掌握C语言编程的基础知识。 (2)较熟练地编写C语言应用程序。 (3)了解C语言的常用标准函数、编程技巧、异常处理。 (5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 (6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。 (7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。 指 导 教 师 评 语 及 成 绩 成绩:指导教师签字: 2011年 1 月 4 日

目录 第1章 C语言课程设计的实训目的与要求 (1) 1.1 C语言课程设计目的 (1) 1.2 C语言课程设计的实验环境 (1) 1.3 C语言课程设计的预备知识 (1) 1.4 C语言课程设计要求 (1) 第2章 C语言课程设计内容 (2) 2.1程序功能介绍 (2) 2.2程序整体设计说明 (2) 2.2.1设计思路 (2) 2.2.2数据结构设计及用法说明 (3) 2.2.4各模块的功能及程序说明 (7) 2.2.5程序结果 (8) 2.3程序源代码及注释 (10) 第3章 C语言课程设计总结 (17) 参考资料.. (20)

VC实现贪吃蛇的实验报告

题目:利用VC++实现贪吃蛇小游戏

一、题目:利用VC++实现贪吃蛇小游戏 利用VC++实现的贪吃蛇小游戏更加注重可视化。一条蛇在封闭的围墙内,在围墙内会随机出现一个食物,通过键盘上的W S A D四个键控制它向上,下,左,右四个方向移动。当蛇头撞到食物时表示将食物吃掉,这时蛇身增长一节,得分加一。接着随机生成食物,等待被蛇吃掉。如果在移动过程中撞到墙壁或者自己的身体,则游戏结束。游戏过程中,可以在菜单中选择暂停或者结束游戏,对游戏进行暂停或者退出。

二、编程要点(或基本思路、算法分析与说明): 本次游戏设计包含两大模块,一个模块是贪吃蛇游戏本身算法的设计,完成了贪吃蛇的食物产生,获取食物,蛇的移动等功能。另一个模块是利用MFC完成贪吃蛇的可视化显示,产生了一个对话框,在对话框可以控制游戏及游戏的显示。 1.贪吃蛇游戏算法设计包括: <1>果实出现的设计思路: (1)采用随机数生成果实出现坐标 (2)判断当前生成的果实是否在贪吃蛇身体范围内。 (3)如果在,重新生成直到不在为止。如果不在,则把坐标位置返回给调用对象。 <2>贪吃蛇更新的算法设计 (1)接收玩家按下的方向键消息,并保存到方向变量中。 (2)定义一个时间定时器,用来控制蛇运动的速度。 (3)当每次时间间隔到达时,则根据方向变量来更新贪吃蛇curr(即贪吃蛇身体)向量。 (4)判断curr向量的第一个元素中的坐标数据是否碰到边界或者蛇身,如果有,则游戏结束。否则,进行下一步。 (5)判断curr向量的第一个元素中的坐标数据是否与当前果实重合,如果有,表示贪吃蛇已经吃到果实。这时就向贪吃蛇curr向量添加一个元素,并重新生成一个果实。 (6)吃到食物后,得分会同步增加。 2.利用MFC完成贪吃蛇的可视化显示: 首先初始对话框,完成游戏的整体框架的显示。然后游戏玩家在菜单栏里选择开始,暂停,结束等,控制游戏状态。游戏开始后,玩家通过键盘上的消息控制蛇的运动。在函数DrawSnake(CDC *pDC,Snake snake),和DrawFood(CDC *pDC,SnakeFood f)完成对蛇和食物的重绘,从而显示出蛇的运动和对食物的获取。在OnPaint()函数中完成得分和游戏操作提示的显示。 本次游戏设计的主要功能函数如下: OnGameStart()(游戏开始函数), OnGamePauseStart()(游戏暂停函

c语言程序贪吃蛇课程设计报告范文

高级语言程序设计 课程设计报告 Experiment Designing reporter 课程名称:高级语言程序设计 英文名称 : C Program Experiment Designing 专业:自动化 111 学号: XXX 姓名: XXX 指导教师: XXX 日期: 2012 年 6月 17日至 2011 年6 月 20 日 山东工商学院信电学院

山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“一:课程设计内容 程序功能介绍 贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。 设计思路 我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”: 第一步: 寻找到一个真正可以运行的已用C编好的贪吃蛇。 因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。 第二步: 运行游戏并了解游戏程序。 我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。 同样重要的是了解游戏程序。因为只有看懂了程序,才能实现对他的改编,才能游刃有余。 第三步: 寻找模块并分类,而后进行改编。 寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那 第一页共十六页 自动化 111

python实现贪吃蛇

Python版贪吃蛇.py #!/usr/bin/python from Tkinter import * import random class snake(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.body = [(0,0)] self.bodyid = [] self.food = [ -1, -1 ] self.foodid = -1 self.gridcount = 10 self.size = 500 self.di = 3 self.speed = 500 self.top = self.winfo_toplevel() self.top.resizable(False, False) self.grid() self.canvas = Canvas(self) self.canvas.grid() self.canvas.config(width=self.size, height=self.size,relief=RIDGE) self.drawgrid() s = self.size/self.gridcount id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s, (self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow") self.bodyid.insert(0, id) self.bind_all("", self.keyrelease) self.drawfood() self.after(self.speed, self.drawsnake) defdrawgrid(self): s = self.size/self.gridcount for i in range(0, self.gridcount+1): self.canvas.create_line(i*s, 0, i*s, self.size) self.canvas.create_line(0, i*s, self.size, i*s) defdrawsnake(self): s = self.size/self.gridcount head = self.body[0] new = [head[0], head[1]] if self.di == 1: new[1] = (head[1]-1) % self.gridcount elifself.di == 2: new[0] = (head[0]+1) % self.gridcount elifself.di == 3: new[1] = (head[1]+1) % self.gridcount

操作系统实验报告(贪吃蛇游戏)

南通大学计算机科学与技术学院 操作系统试验 报告书 试验题目贪吃蛇游戏 专业班级XXXXXX 学生姓名XXXXX 指导教师XXXX 日期2017年6月 主要内容 (一)设计内容:在Windows 9x/2000/XP/ME操作系统下,使用VC、VB、Java或C等编程语言,采用多道程序设计技术编写一个游戏软件或解决一个简单的实际问题,要求设计一个两道以上的程序,可以是固定的2道程序、也可以是灵活的多道模式。设计的内容可以是下面任选其一: (1)用多道程序技术实现一个游戏程序。如大炮打飞机、赛车比赛等。 (2)用多道程序技术模拟客观世界中一个多任务实际问题的解决。 (二)设计要求: (1)本程序可运行在Windows 9x/2000/XP/ME操作系统下,可安装到任意路径下。 (2)采用多进程或多线程方式运行,尽量体现进程间的同步和互斥关系。 (3)经调试后程序能够正常运行,并体现多道程序的特点。

(三)实验目的: 1.掌握进程和线程的概念。 2.掌握进程控制原语或进程控制系统调用的使用 3.掌握多道程序设计的基本理论、方法和技术。 4.掌握相关语言进程控制的API函数的使用。 5.培养学生多道程序设计的能力。 6.培养学生团队合作的能力。 (四)实验的选择:用多道程序技术实现一个游戏程序。游戏:《贪吃蛇》 实验思想: 1.首先制作游戏的窗体布局。其中包括窗体的大小,位置,添加按钮组件,在窗体 上面划定游戏区域等。 2.为按钮添加监听器,为开始按钮,结束按钮,键盘,还有游戏结束的时候的确定 按钮. 3.单击开始按钮,看到的效果是在游戏区域里面看到一个随机产生的食物,和蛇体。 产生随见事物使用Random类,随机定位一个游戏区域里面的方块,然后使用Graphrics可以定位到这个方块的坐标图上颜色,这样就产生了肉眼可见的食物。关于蛇体,我们将蛇体的每个方块添加到集合里面,使用的是List,为什么不用数组,原因是数组的长度总是有限的,你不知道蛇体里面最终存放多少方格,而且数组比较繁琐。我们将蛇体的每个方块另外创建一个类(蛇体的每个方格)snakeAct,包含成员变量方格的坐标,每个snakeAct对象实例就是一个方块,将这个对象添加到列表List中就好了,然后再用Graphics,循环画出列表中的每个对象,就成功的画出了蛇体。设置蛇体的初始长度只有蛇头,并设置蛇头的初始位置为居中。 4.通过方向键设置蛇头的移动,定义move()方法,蛇头每移动一次位置就会变化 到另外一个方块,对应的坐标x,y都是有相应的变化,例如按下UP键,坐标的变化就是,x不变,y减1。 5.蛇头可以运动只有面临的问题就是要吃食物,而吃食物的过程是在移动过程中, 所以在move()方法中添加eat()方法,吃到食物的条件是蛇头的坐标和食物的坐标对应相等,蛇头吃到食物的过程就是将列表中没有吃到食物前的最后一个方格重新画一遍,这样列表的长度就加一,而列表中的对象就多了一个。 6.将食物添加到列表中之后,仍然只是蛇头可以移动,让蛇体跟着蛇头移动定义

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计 (小游戏贪吃蛇的程序设计报告)

设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点 3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试 1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C 语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

贪吃蛇游戏软件可行性分析报告

软件设计与体系架构实验报告 学院:计算机科学与技术学院 学号:0121210680330 姓名:郭烨华 班级:sy1201 课题名:贪吃蛇游戏开发

贪吃蛇开发并进行动态分析 指导老师:陈明俊 组员:李安福 郭烨华 分工明细 成员分工: 职责姓名任务 项目分析经理、程序员李安福可行性分析,系统功能分析,编程 系统设计师、程序员郭烨华概要设计,开发设计、编程 目录 一、引言 (1)

1.1编写目的 (1) 1.2 编写主题 (1) 1.3 游戏运行环境 (1) 二、可行性研究的前提 (1) 2.1游戏基本功能 (1) 2.2 要求 (3) 2.3目标 (3) 2.4 进行可行性研究的方法 (3) 2.5 评价尺度 (4) 三、对现有系统的分析 (4) 3.1 处理流程和数据流程: (4) 3.2 工作负荷 (4) 3.3 人员.................................................................................................. 错误!未定义书签。 3.4 设备 (4) 3.5局限性 (4) 3.6 改进要求 (5) 四、所建议的系统 (5) 4.1 对所建议系统的说明 (5) 4.2处理流程和数据流程 (5) 4.3改进之处 (6) 4.4 影响 (6) 4.4.1对设备的影响: (6) 4.4.3 对用户单位机构的影响 (6) 4.4.4 对系统运行过程的影响 (7) 4.4.5对地点和设施的影响 (7) 4.5 技术条件方面的可行性 (7) 五、可选择的其他系统方案 (7) 六、投资及效益分析 (8) 6.1支出 (8) 6.1.1 基本建设投资 (8) 6.1.2 其他一次性支出 (8) 6.1.3 非一次性支出 (8) 6.2 收益 (8) 6.2.1 一次性收益 (8) 6.2.2 非一次性收益 (8) 6.2.3 不可定量的收益 (8) 6.3 投资回收周期 (9) 6.4 敏感性分析 (9) 七、社会因素方面的可行性 (9) 7.1 法律方面的可行性 (9) 7.2 使用方面的可行性 (9) 八、结论 (9)

单片机贪吃蛇课程设计报告

电气与信息工程学院 单片机课程设计报告 一、设计任务及要求 基本功能: 制作一个8*8点阵的贪吃蛇游戏,系统以单片机的C语言的软件设计,系统通过LED点阵屏为载体显示数据,并用五个输入端表示五个控制键(上下左右及加速)。系统硬件部分由STC89C52RC单片机,8*8点阵屏,5个按键,软件部分在keil环境下用C51语言编写,包括游戏初始化蛇的节数,以及障碍墙壁,游戏结束时自动复位。 具体要求: 1、用四个按钮控制贪吃蛇的行径,一个按钮控制贪吃蛇的加速,蛇的初始长度为2点,设置墙壁。 2、蛇吃到长度为1点的食物时,自身长度增加1点。 2、速度按钮带有一次加速,按两下速度按钮蛇的行进速度回到初始值。 3、当蛇碰到墙壁或自己的身体时游戏结束。 4、用proteus设计,仿真基于STC89C52RC单片机的8x8点阵贪吃蛇的硬件电

路。 5、游戏结束,系统自动复位。 二、硬件电路设计 本系统以STC89C52RC为核心,设置12MHz的晶振,使得单片机有合理的运行速度。LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示程序的运行情况,是模块化的显示组件,本设计采用8*8共阳红色点阵显示屏,用来显示贪吃蛇的游戏画面。五个独立按键控制蛇的游走方向(上下左右)和加速减速的功能。贪吃蛇是一款经典的小游戏,玩家通过按键操控贪吃蛇不断地吃食物,蛇身逐渐伸长,当蛇碰到蛇身和墙壁时游戏结束。 需要注意的是实际元件中,点阵的封装不尽相同,因此需要测试出每个引脚的功能,以便正确连线。注意,每个像素点的额定电压在3v左右,电压过大将会彻底损坏。 三、系统软件设计 软件方面采用了C51编写代码,代码编写模块如下图: 核心代码主要为游戏处理、信息处理和按键处理。编写游戏的功能代码,先定义游戏的数据结构和常量。其中食物的数据结构采用结构体定义,两个unsigned char变量分别定义为食物的横纵坐标;蛇的身体定义为长度最大值为20的数组,游戏中贪吃蛇长度达到39,游戏通关结束。 游戏处理模块为贪吃蛇在游玩过程中遇到的需要被处理的情况,主要实现的功能包括以下四个方面,即移动、食物、死亡和加速。 1、移动

MFC贪吃蛇实验报告

贪吃蛇实验报告201221143049 信计1212 许圣

1.概述 此次课程设计我利用MFC制作了一个贪吃蛇游戏,用户可以通过上下左右控制蛇的移动方向,游戏会根据贪吃蛇身体的长度自动增加难度。在游戏过程中,会记录运行时间和所得分数,我还添加了bmp格式的图片作为游戏背景。 2.功能描述 2.1设计思路 本软件主要由三个模块构成,它们分别是蛇运行模块,初始化处理模块和显示模块。它们的作用分别是,初始化处理:初始化蛇头位置与第一个点位置;蛇运行模块:控制蛇的上下左右运行,并对蛇的运行状态进行判断,根据(吃点、未吃点、死亡等)状态进行不同的子程序模块处理以及游戏者是否能晋级的判断;显示模块:根据对蛇和点子的当前状态进行动画显示。主要有以下步骤: 1.定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的 初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。 2.用数组初始化长度为4的贪吃蛇,并且默认出现一个食物。 3.在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer() 函数让系统提供一个时钟节拍,更新游戏 4.具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中 还包括根据蛇的长度来进行游戏难度的改变。 5.具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown() 来响应玩家的实际操作。 6.添加了bmp格式的图片作为游戏背景。 整体流程图如下图1。

图1:系统流程图

2.2功能介绍 ⑴运行程序,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一个食 物,出现bmp格式图片的背景。 ⑵点击“游戏->游戏开始”,游戏开始。还可暂停游戏继续 ⑶游戏开始后,界面右下角会同步游戏得分。 ⑷通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙 壁或者与自身相交,则该轮游戏结束。 ⑸游戏会根据蛇身的长度自动调节难易程度。 3.详细设计 3.1主要函数 ●void CSnakeView::OnDraw(CDC* pDC)//显示背景图片 ●void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//按照用户的按键来控制蛇的移动 ●void CSnakeView::OnTimer(UINT nIDEvent)//根据蛇的长度来进行 SetTimer()函数的定义,可以根据长度来进行游戏难度的设定。//撞 界判断//蛇身相撞判断//抹掉蛇行走的痕迹//判断吃豆的条件,撞到就 吃//如果食物被吃了就生成 ●void CSnakeView::oninit()//进行贪吃蛇外观的初始化 ●void CSnakeView:: OnGameStart ()//开始游戏 ●void CSnakeView:: IniAim ()//初始化目标的位置 ●void CSnakeView::IniGame()//初始化游戏 ●void CSnakeView::ReDisplay(CPoint pPoint) ●bool CSnakeView::ReadBmp(char *bmpName)

相关主题