当前位置:文档之家› 贪吃蛇游戏实验报告

贪吃蛇游戏实验报告

贪吃蛇游戏实验报告
贪吃蛇游戏实验报告

*****************

实验报告

实验名称:网络编程基础实训教程(贪吃蛇)

指导教师:

姓名:

学号:

班级:

提交日期:

1.实验目的

通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。

2.实验题目

使用C#编程语言,开发一款贪吃蛇游戏,如下图所示。

3.功能描述

a)游戏场地是一片矩形区域的草坪。

b)一条蛇由蛇头和蛇身组成。

c)当游戏开始之后,草坪中出现一颗豆和一条蛇,并且蛇不停

地移动,蛇移动方向与蛇头一致。

d)当游戏暂停之后,蛇停止移动。

e)当蛇移动时,玩家使用“↑”、“↓”、“←”和“→”四个键控制蛇的移

动方向。

f)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生

成一颗新的豆,蛇身增加一节。

g)当蛇头碰到蛇身时,则咬断蛇身,后半部分的蛇身消失。

h)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。

4.需求分析

根据功能描述可知,贪吃蛇游戏的系统结构图如下所示。

定义数据字典如下:

1)草坪(Lawn):草坪是贪吃蛇游戏的场地。豆和蛇只能存

在于草坪范围之内。草坪具有大小和颜色等属性。

2)蛇(Snake):在贪吃蛇游戏中,蛇由若干节组成,其中第

一节是蛇头,其余是蛇身。在游戏过程中,有且仅有一条

蛇,并且蛇在不停地移动。如果蛇吃了豆,则蛇生长一节。

如果蛇头碰到蛇身,则咬断蛇身,后半部分的蛇身消失。

如果蛇头离开草坪,则蛇死亡游戏结束。蛇具有长度、颜

色、运动方向、每一节的位置等属性。

3)豆(Bean):在贪吃蛇游戏中,豆是蛇的食物。在游戏过

程中,有且仅有一颗豆。如果蛇吃了豆,则重新生成一颗

豆。豆具有位置、大小和颜色等属性。

5.设计说明

根据需求分析可知,Snake的每一节都有位置和大小等属性。

而Bean也具有这两个属性。抽象出二者的共同特征,抽象出一般类Block,用于描述一个块。Block派生出Bean和SnakeBlock两个类,其中SnakeBlock类用于描述蛇的一节。

为了使游戏的运行更易于控制,定义Game类用于启动、暂停和继续游戏。

根据需求分析可知,Lawn仅包含大小和颜色两个属性。为了减少类的数量,可将其大小和颜色等属性添加到Game类中。

综上所述,在贪吃蛇游戏中,有Block(块)、Bean(豆)、SankeBlock(节)、Snake(蛇)、Game(游戏)和MainForm(用户接口)六个类。贪吃蛇游戏的逻辑模型如下图所示。

6.源代码

1)Block(块)类的编码

Block是用来构成Bean(豆)和Snake(蛇)的最基本的单位,是Bean和SnakeBlock的基类。Block类的参考代码如下。

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

namespace WindowsFormsApplication1

{

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);

}

}

}

2)Bean(豆)类编码

Bean表示豆,是由Block派生而来的。Bean类的参考代码如下。

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

namespace WindowsFormsApplication1

{ class Bean : Block

{

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.blocks[i].Origion)

break;

}

if (i == snake.Length)

bGetAPosition = true;

}

Display(g);

}

}

}

3)SnakeBlock(节)类编码

SnakeBlock表示蛇的一节,是由Block派生而来的。SnakeBlock 类的参考代码如下:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

namespace WindowsFormsApplication1

{ 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.Brown);

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;

}

}

}

}

}

Snake(蛇)类编码

4)Snake(蛇)类编码

Snake表示蛇。Snake类的参考代码如下:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

namespace HungrySanke

{

public enum Direction

{

Up,

Down,

Left,

Right

};

class Snake

{

private int length;

public Direction direction;

private Color color;

public List blocks;

private const int INIT_LENGTH = 3;

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 * blocks[blocks.Count - 1].Origion.X - blocks[blocks.Count - 2].Origion.X;

int y = 2 * blocks[blocks.Count - 1].Origion.Y - blocks[blocks.Count

- 2].Origion.Y;

blocks.Insert(length, new SnakeBlock(x, y, color, false)); length++;

}

public void Move()

{

int x = 0;

int y = 0;

blocks[0].ChangeHeadToBody();

switch (direction)

{

case Direction.Up:

x = blocks[0].Origion.X;

y = blocks[0].Origion.Y - Block.HEIGHT;

break;

case Direction.Down:

x = blocks[0].Origion.X;

y = blocks[0].Origion.Y + Block.HEIGHT;

break;

case Direction.Left:

x = blocks[0].Origion.X - Block.WIDTH;

y = blocks[0].Origion.Y;

break;

case Direction.Right:

x = blocks[0].Origion.X + Block.WIDTH;

y = blocks[0].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++)

{

blocks[i].Display(g, direction);

}

}

public void Clear(Graphics g, Color backGroundColor)

{

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

{

blocks[i].Clear(g, backGroundColor);

}

}

public void RemoveAfter(Graphics g,Color backGroundColor,int blockNum) {

for (int i=length -1;i>blockNum -1;i--)

{

blocks[i].Clear (g,backGroundColor );

blocks.RemoveAt(i);

length =blockNum;

}

}

public bool CanEatBean(Bean bean)

{

if (blocks[0].Origion == bean.Origion)

return true;

else

return false;

}

public int CanEatSnake()

{

for (int i = 3; i < blocks.Count; i++)

{

if (blocks[0].Origion == blocks[i].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);

}

public bool IsAlive(int lawnWidth, int lawnHeight)

{

if (blocks[0].Origion.X < 0)

return false;

if (blocks[0].Origion.Y < 0)

return false;

if (blocks[0].Origion.X + Block.WIDTH > lawnWidth)

return false;

if (blocks[0].Origion.Y + Block.HEIGHT > lawnHeight)

return false;

else

return true;

}

}

}

5)Game(游戏)类编码

Game控制游戏的运行,负责在游戏开始时生成Bean和Snake,以及负责在游戏运行中Snake的移动、Snake的生长、Bean的重生,并随时检测Snake 的生死状态。Game类的参考代码如下:

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

namespace HungrySanke

{

class Game

{

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.YellowGreen, direction);

bean = new Bean(Color.Pink);

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);

}

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);

}

if (!snake.IsAlive(lawnWidth, lawnHeight))

isSnakeAlive = false;

}

}

}

}

Form1的设计代码

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/7718039695.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace HungrySanke

{

public partial class Form1 : Form

{

private Game game;

public Form1()

{

InitializeComponent();

game = new Game(lawn.Width, lawn.Height);

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void timer1_Tick(object sender, EventArgs e)

{

if ( game.isSnakeAlive)

{

Graphics g;

g = lawn.CreateGraphics();

game.OnTime(g, lawn.BackColor, lawn.Width, lawn.Height);

if (!game.isSnakeAlive)

{

MessageBox.Show("Game Over");

}

}

}

private void ToolStrpMenuItemStart_Click(object sender, EventArgs e) {

Graphics g;

g = lawn.CreateGraphics();

game.Begin(g, lawn.BackColor, lawn.Width, lawn.Height);

timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true;

ToolStripMenuItemContinue.Enabled = false;

}

private void ToolStripMenuItemPause_Click(object sender, EventArgs e) {

timer1.Enabled = false ;

ToolStripMenuItemPause.Enabled = false ;

ToolStripMenuItemContinue.Enabled = true ;

}

private void ToolStripMenuItemCONTINUE_Click(object sender, EventArgs e) {

timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true;

ToolStripMenuItemContinue.Enabled = false;

}

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

if(game.snake.direction == Direction.Down || game.snake.direction == Direction.Up)

{

switch (e.KeyCode)

{

case Keys.Left :

game.snake.direction = Direction.Left;

break ;

case Keys .Right :

game .snake .direction =Direction .Right ;

break ;

}

}

else

{

switch (e.KeyCode )

{

case Keys .Up:

game .snake .direction =Direction .Up;

break ;

case Keys .Down :

game .snake .direction =Direction .Down ;

break ;

}

}

}

private void lawn_Paint(object sender, PaintEventArgs e)

{

}

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

{

}

private void ToolStripMenuItemStart_Click(object sender, EventArgs e) {

Graphics g;

g = lawn.CreateGraphics();

game.Begin(g, lawn.BackColor, lawn.Width, lawn.Height);

timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true;

ToolStripMenuItemContinue.Enabled = false;

}

private void ToolStripMenuItemPause_Click_1(object sender, EventArgs e) {

timer1.Enabled = false;

ToolStripMenuItemPause.Enabled = false;

ToolStripMenuItemContinue.Enabled = true;

}

private void ToolStripMenuItemContinue_Click_1(object sender, EventArgs e)

{

timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true;

ToolStripMenuItemContinue.Enabled = false;

}

}

}

7.测试报告

测试用例;

1)、Bean 的生成、消除与显示

Bean在游戏开始时,能生成一颗豆且能在游戏运行中,

正常显示,能在豆被蛇吃掉时,消除原先的豆,并重新

生成一颗豆。

Snake 的生成、显示、移动、生长与死亡

在游戏开始时,生成一条蛇并能在游戏运行中,正常显示一

条蛇的运动。蛇能在游戏运行中,根据用户的按键情况,改

变蛇的移动方向。能在蛇吃掉豆时,生长一节。

当蛇头碰到蛇尾或者蛇身的时候,后面的部分将被剪断不再

显示,而且能在蛇头碰到场地边界时死亡,并结束游戏。

测试结果

当游戏运行时,游戏能正常运行!

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

辽宁科技大学课程设计说明书 设计题目:基于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.doczj.com/doc/7718039695.html,2008开发环境下进行运行测试,检查错误,最终设计出可行的程序。 2、贪吃蛇游戏说明 游戏操作要尽可能的简单,界面要尽可能的美观。 编写程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜欢的游戏:一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分;接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁、障碍物或身体交叉(蛇头撞到自己的身体),则游戏结束。游戏结束时输出相应得分。 具体要求有以下几点: (1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理; (2)系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面; (3)说明书、流程图要清楚; 二、实验目的及设计要求 1、实验目的 .NET课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对VC#.NET技术的理解和掌握; 提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质; 培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新 1

贪吃蛇小游戏实验报告[

软件设计报告 设计题目:贪吃蛇 学院:华北电力大学科技学院 专业班级:软件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语言中所学的知识,合理的运用资料,实现理论与实际相结合。 (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();//图形驱动

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()(游戏暂停函

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

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;

贪吃蛇总结

上网搜集点阵贪吃蛇的参考资料并分析:参考资料:

贪吃蛇游戏的要点: (1)蛇身信息(用何种方式储存每个蛇身点的坐标,蛇身的移动及方向) (2)食物的产生及位置 (3)食物与蛇身的显示 (4)接触检测(与自身是否碰撞,与墙是否碰撞,是否接触到食物等) (5)蛇体增长 8.16周二 解决要点(1)(蛇身点部分及移动部分,方向部分后来周四时改进解决)及(3)的蛇身部分: (1) 蛇身信息:定义一个结构体数组,用来储存蛇身坐标。 代码: 蛇体移动:(此处应用队列数据结构的思想,附图为百度资料) 另声明一个char head;一个char tail;,则该数组snake[head]则代表蛇头,snake[tail]代表蛇尾,蛇体的移动方式是:点亮下一个点,并使其成为新的蛇头(head++),然后熄灭蛇尾,且使现时最后的点成为新的蛇尾(tail++)。(当head或tail超过数组元素最大值时,其值清0,以此构成队列数据结构。) 百度资料: 代码:

(其中value_snake(tail,8,8)会熄灭尾灯,稍后会提及。)此处的蛇头移动方向无法被定时移动部分使用。(后来在周四解决掉了) (3) 蛇身的显示:这里采取逐点显示的方式来显示蛇身每点。首先,据点阵工作原理,先将蛇身某点的坐标转换成字节的形式(如x=0为00000001,y=0为11111111),然后再赋给对应IO 口(此处设置为P1与P2),短暂延时后再显示下一个点。具体代码如下:

总效果如图:

(仍未实现定向移动与食物产生) 8.17周三 解决要点(2):此处使用rand()函数作为食物坐标的种子,经过与蛇身各点的对比,排除掉与蛇身重叠的点后,产生食物的坐标,并用一个结构体来保存。 代码:

java课程设计贪吃蛇游戏设计

前言 Java最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景。于是改造了Oak,以“Java”的名称正式发布。 Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。但在J2SE 1.4.2 发布后,Java 的执行速度有了大幅提升。 与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。 Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。

贪吃蛇暑期实训总结报告

实训报告 实训题目:贪吃蛇游戏程序设计 院系:计算机科学与工程学院 专业:网络工程 班级:网络工程131 学号:090213128 姓名: 指导教师:肖微 实训地点:九章楼N6-101 开课时间:2013 至2014学年第 2 学期常熟理工学院计算机科学与工程学院制

学生姓名周豪实训报告成绩 评语: 指导教师(签名) 年月日说明:指导教师评分后,实训报告交院办公室保存。

目录 1实训的目的和任务 (5) 实训的目的: (5) 实训的任务: (6) 2.开发环境(软件开发环境和硬件开发环境) (6) 3.界面设计 (6) 3.1设计思路 (6) 3.2实现原理 (7) 4.算法设计 (9) 5.程序流程 (30) 6.总结 (31) 1实训的目的和任务 实训的目的: 1.巩固和加深对C语言课程基本知识的理解和掌握 2.掌握C语言编程和程序调试的基本技能 3.利用C语言进行基本的程序设计 4.掌握书写程序设计说明文档的能力 5.提高运用C语言解决实际问题的能力 6. 进一步理解和运用结构化程设计的思想和方法

7.独立完成一个游戏的设计应用 实训的任务: 1.分析实训题目要求 2.了解实训要求内容 3.掌握实训要求代码 4.编写程序代码,调试程序使其能正确运行 5.设计完成的软件要便于操作和使用 6.完成课程设计报告,并进行答辩 2.开发环境(软件开发环境和硬件开发环境) 1、一台能正常运行的计算机电脑 2、Windows XP 3、Microsoft Visual Studio2010 4、Microsoft Word2010 3.界面设计 3.1设计思路: 大家在运行这个游戏的时候,开始界面能够出现一只蛇,这样的图案比较符合游戏的内容。首先是蛇图形的绘画,我们可以运用搜狗输入法轻松的绘出蛇的大致图像,但是值得大家注意的是搜狗直接生成的图形,在里面

贪吃蛇游戏报告书

青岛大学软件技术学院交互式游戏设计实践实训题目名称贪吃蛇 姓名 专业数字媒体艺术 班级 10级3班 指导教师解新峰 2014 年 1 月 14 日 1

目录 第一章引言 (3) 1.1选题背景 (3) 1.2项目意义 (3) 1.3开发技术 (3) 1.3.1 Java语言简介 (3) 1.3.3 Eclipse开发环境 (3) 第二章贪吃蛇游戏概述 (5) 2.1游戏分析 (5) 2.1.1 游戏规则 (5) 2.1.2 游戏玩法 (5) 2.2算法分析 (5) 2.3架构分析 (5) 第三章贪吃蛇游戏的详细设计 (7) 3.1游戏总体结构设计 (7) 3.2 游戏运行图 (10) 小结 (13) 参考文献 (13)

第一章引言 1.1选题背景 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。 1.2项目意义 游戏在设计方面应该本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,应始终坚持清晰明了,在性能方面应能够实现效率高,不易出错等优点。游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。 1.3开发技术 1.3.1 Java语言简介 Java是一种简单易用的编程语言,它采用了一种虚拟机作为中间层来屏蔽平台差异,能够实现跨平台运行。Java支持面向对象编程,有封装、继承、多态的特性,它还支持多线程,实现多个程序流程同时执行,完成不同任务。 1.3.2 Java语言的开发工具包JDK JDK(Java Development Kit)是Java语言的开发工具包,工具包里除了包含Java语言编译器、调试器以及演示程序以外,一般还会包含Java运行环境(Java Runtime Environment,JRE)。JRE是某一平台运行Java程序的软件环境,包括虚拟机(JVM)和核心类库等。 1.3.3 Eclipse开发环境 Eclipse是一个开放源代码的、基于Java的可扩展开发平台,是目前非常流行的跨平台的自由集成开发环境(IDE)。最初主要用于Java语言开发,但是目前也有人通过插件使其作为其他编程语言(如C++、PHP)的开发工具。Eclipse本身也只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 Eclipse本身核心非常小,其设计思想是“一切皆为插件”。其他功能都是基于插件的形式与Eclipse无缝结合,协同工作,如Eclipse的图形API、多国语言包等。在Eclipse

贪吃蛇游戏程序设计

测控技术与仪器专业课程设计题单 班级0982011 学生刘某某 课程名称计算机课程设计 课题贪吃蛇游戏程序设计 设计要求 1.学习游戏设计有关知识。 2.设计贪吃蛇游戏程序。 3.调试并修改程序。 4.完成课程设计论文。 课题发给日期 2011年6月25日 课程设计完成日期 2011年7月09日 指导教师余某某 评语:

贪吃蛇游戏 学生姓名:刘某某班级:0882011 指导老师:余某某 摘要:编写C语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。 作为一个完整的程序,必须考虑人机交流与用户体验。游戏的界面不能太丑,更不能连个简单的界面都没有。游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下,游戏开发者必须最大限度的使游戏美观。游戏的美观是一方面,游戏的内在素质是另一方面。一个游戏的优劣,最终由玩家决定。在游戏与玩家见面之前,游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。 关键词:贪吃蛇流程图 c语言源程序

目录 1 前言 (1) 2 课设内容 (3) 2.1课设目的 (3) 2.2设计功能 (3) 2.3结构设计 (7) 3结论 (11) 参考文献 (15) 附录A (16)

1 前言 C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。作为一位当代的大学生更要很好的利用它,学好一门设计语言,实现学以至用。 制作C程序报告,可以巩固和加深自己对C语言课程的基本知识的理解和掌握,并且能够掌握C语言编程和程序调试的基本技能。 通过游戏程序的设计训练可以提高自己的基本技能,更好地掌握字符串的表示方法和字符串函数的功能、Tc图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高自己编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用C语言解决实际问题的能力,巩固C语言语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。 C语言课程应注重边学边练,但由于课堂教学和实验的深度和广度有限,练习的深度也受到一定限制。为了弥补这一点,学校开设了本课程设计。它比教学实验复杂一些,涉及的深度广些并更加接近实用。目的是通过课程设计的综合训练,培养我们实际分析问题、编程和动手能力,最终目标是想通过这种形式,帮助我们系统地掌握程序设计的主要内容,更好地完成学业。 这次课程设计的主要特点如下: 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)

vc++贪吃蛇实习报告

贪吃蛇程序程序设计报告 【1】游戏介绍 产生一个固定大小有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域有边界,所以蛇在区域内作循环运动;蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇身体的长度从4开始每吃掉一份食物就增加一个长度;食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;每吃掉一份食物得分为1,游戏结束后统计全部的得分;游戏结束的条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位或者碰到四壁。 【2】基本概念,要点分析 蛇的活动区域是由若干个小方格组成的。当这些小方格呈现灰色时,便显示蛇身。设整个区域由由m×n个方格组成,最左角上的方格坐标为(0,0),蛇由若干个相邻的方格组成的,将这些方格的坐标依蛇头至蛇尾的次序存入到一个数组中便代表了蛇身。当蛇在游戏区域中游动一格时,所对应的数组操作应该是将新的位置坐标插入到数组头部,同时将数组中最后一个元素删除,这项工作可以用一个一般的数组来完成,但当进行插入操作时需要自己移动数组中的元素;也可以使用CArray来完成这些工作,CArray的成员函数提供了需要的操作,这样做更简单一些。 游戏使用四个方向键来控制它的前进方向,在OnKeyDown消息处理函数中,根据不同的方向键设置成员变量m_nDirect的值。当在菜单中选择开始时,启动了定时器,游戏开始,在定时器消息处理函数中,根据m_nDirect的值判断出蛇的下个位置,如果没有超出边界或碰到自身,则它可以移到新的位置。如果吃到了食物,则在CArray中只插入而不删除最后一个元素,蛇身长度增加。 另外值得注意的是,当蛇移动一格时,只有蛇头和蛇身的位置需要重绘,为此专门编写了成员函数ReDisplay来刷新一个小格。 【3】程序概要设计 程序流程图如下:

基于labview的贪吃蛇游戏程序设计

成绩评定表

课程设计任务书

目录 1 目的及基本要求 0 本程序是基于常看到的一款小游戏贪吃蛇而设计的,即有一条小 蛇不停地在屏幕上游走,吃各个方向上出现的苹果(姑且称它为 “苹果”),越吃越长,只要蛇头碰到屏幕四壁或者碰到自己的 身子,游戏就立刻结束。本程序基于传统贪吃蛇游戏的特点利用LabVIEW制作的一款完整的迷你贪吃蛇游戏。 0 4.1 运行结果 (8)

1 目的及基本要求 本程序是基于常看到的一款小游戏贪吃蛇而设计的,即有一条小蛇不停地在屏幕上游走,吃各个方向上出现的苹果(姑且称它为“苹果”),越吃越长,只要蛇头碰到屏幕四壁或者碰到自己的身子,游戏就立刻结束。本程序基于传统贪吃蛇游戏的特点利用LabVIEW制作的一款完整的迷你贪吃蛇游戏。 熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器原理、设计方法和实现技巧,运用专业课程中的基本理论和实践知识,采用LabVIEW开发工具,实现贪吃蛇游戏的设计和仿真。要求通过本课程设计使学生熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器设计原理、设计方法和实现技巧,使学生掌握通信系统设计和仿真工具,为毕业设计做准备,为将来的学习及今后从事科学研究、工程技术工作打下较坚实的基础。 2 贪吃蛇游戏设计原理 贪吃蛇游戏大体上可分为以下几个部分: 1) 控制部分就是通过输入输出来控制蛇的运动 2) 逻辑部分进行判断蛇吃了没有是否撞墙同时把蛇的长度增加一节还要实现分数的计算 3) 图象显示部分就是将游戏显示出来 本程序的主要实现如下功能:1.小蛇在屏幕上不停的游走;2.用键盘方向键可控制小蛇的移动方向;3.吃过一个苹果后小蛇长度增加并随机产生另一个蛋; 4.小蛇碰到四壁或者碰到自己的身体时游戏结束并给出得分和提示是否继续; 5.游戏可以有多种难度选择等 3 贪吃蛇游戏设计与仿真 3.1 前面板设计 采用LabVIEW中提供的“Express XY图”作为游戏界面,显示蛇和苹果,这样就可以通过方向键来移动小蛇到想要去的地方。对XY图的属性做如下修改:

C语言贪吃蛇实验报告

C语言程序设计报告 题目:贪吃蛇游戏的程序设计 院系:西语学院英语教育6班 : 学号:

1.1题目: 设计贪吃蛇小游戏 1.2题目的要求: 玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。 1.3设计的步骤: ●分析设计题目的要求,即需求分析。 ●总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。 ●详细设计,确定每个模块的功能,绘制主要函数的流程图。 ●编写程序代码,调试程序使其能正确运行。要求书写规范,注意采用缩进格式。函数 名、变量名要见文晓意,注释要简而不失、详而不缀。设计完成的软件要便于操作和使用。 ●程序测试,发现程序中存在的错误并改正。 ●完成报告。 2详细设计说明 2.1课程设计的要求: 通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。 ●收集资料,分析课题,分解问题,形成总体设计思路;

●对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具 体介绍; ●上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能 正常运行; ●完成课程设计报告。 2.2程序的功能: 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。 2.3课程设计的思想: 程序关键在于表示蛇的图形及蛇的移动。用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画一个圆点和覆盖原来的圆点。为了便于理解,定义两个结构体:食物与蛇。

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

电气与信息工程学院 单片机课程设计报告 一、设计任务及要求 基本功能: 制作一个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、移动

贪吃蛇实训报告

郑州轻工业学院实训报告 实训名称:贪吃蛇 指导教师: 姓名: 学号: 班级: 提交日期:

一.实验目的 通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。 二.实验题目 本次实训的题目为贪吃蛇。通过使用C#编程语言来实现。 三.功能描述 1.游戏的基本功能描述 1)游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区 域中自由移动。 2)定义一个Block来构成石块,蛇头,蛇身以及豆。蛇由蛇头和 蛇身组成。 3)当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇 不停地移动,蛇移动的方向与蛇头的方向一致。 4)通过space或者暂停键可以使游戏停止,蛇停止移动,分数停 止积分。 5)当蛇移动时,玩家可以使用“↑”、“↓”、“←”和“→”四个方向键改变蛇 的移动方向。 6)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成 一颗新的豆,蛇身增加一节。 7)当蛇头碰到石块时,蛇死亡,游戏结束。 8)当蛇头咬到蛇身时,则蛇死亡,游戏结束。 9)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。

10)游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个 豆子就可以过关,级别显示为2,速度增加100变为300.第二 关为吃够10个豆子,速度增加50,以后以此类推。 11)游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏 的玩法。 12)对于不是第一次玩的玩家可以改变蛇的运动速度,来增加难 度。在菜单中设有加速和减速两个键,单击可以改变速度。 13)游戏菜单中还有时间显示。 14)当游戏暂停时,可以通过“继续”键使游戏继续进行。 四.需求分析 本游戏用户可以自己练习和娱乐。本游戏需要满足以下几点要求: (1)利用方向键“↑、→、←、→”来改变蛇的运行方向。 (2)空格键暂停游戏,并在随机的地方产生食物。 (3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则 正常运行。 可行性分析: 贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。没有碰到食物的时候,把当前运动方向上的下个节点入队,

游戏基础课程设计

枣庄学院 信息科学与工程学院课程设计任务书题目:贪吃蛇游戏的设计与开发 专业:计算机多媒体技术专业 课程:游戏基础 姓名: 姓名: 姓名: 指导教师:孙晓飞职称:助教 完成时间:2013年12 月----2014年1 月 枣庄学院信息科学与工程学院制 2013年12月29日

课程设计任务书及成绩评定

目录 引言 (5) 1.工作计划 (5) 1.1 主要任务阶段划分 (5) 1.2 工作任务分工 (5) 2.需求分析 (6) 2.1 概述 (6) 2.2 用户分析 (6) 2.3 约束条件 (6) 2.4 功能需求 (6) 2.5 用户界面需求 (7) 3.设计与实现 (7) 3.1 概述 (7) 3.2 详细设计 (7) 3.2.1类的抽象与设计 (7) 3.3 主要程序文件 (8) 3.4开发环境以及部署环境要求 (10) 3.5主要源码 (10) 4.测试 (14) 4.1 概述 (14) 4.2 测试环境 (14) 4.3 测试计划 (14) 4.4测试项目及结果 (14) 5.工作总结 (15) 5.1 工作成果 (15) 5.2 过程分析 (15) 5.3 经验教训及其分析 (15)

引言 由于传统的贪吃蛇只是在一个宽阔的用户区进行游戏。对于蛇只是在区域四周有障碍墙壁,这样也许在一开始不会有太大的难度和成就感。 又由于人们曾经也钟爱一种迷宫游戏,它主要是考察玩家的观察力,看能否在最短的时间里走出迷宫。 基于以上两个游戏,我们准备利用本学期学到的windows界面程序设计方法将两个游戏有机结合起来,使用户既能体验贪吃蛇中看着蛇身不断加长而绕出各种折线的成就感,又能感受到在迷宫中找寻出路的紧张心情,而且迷宫的出现使蛇遇到的障碍遍布游戏区,这样用户就更能展示一下自己操作的高水平。 1 工作计划 1.1主要工作阶段划分 1.2工作任务分工

贪吃蛇实训报告

郑州轻工业学院 实训报告 实训名称:贪吃蛇 指导教师: 姓名: 学号: 班级: 提交日期: 一.实验目的 通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对

象程序设计方法,独立完成一个游戏程序的开发。 二.实验题目 本次实训的题目为贪吃蛇。通过使用C#编程语言来实现。 三.功能描述 1.游戏的基本功能描述 1)游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区 域中自由移动。 2)定义一个Block来构成石块,蛇头,蛇身以及豆。蛇由蛇头和 蛇身组成。 3)当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇 不停地移动,蛇移动的方向与蛇头的方向一致。 4)通过space或者暂停键可以使游戏停止,蛇停止移动,分数停 止积分。 5)当蛇移动时,玩家可以使用“↑”、“↓”、“←”和“→”四个方向键改变蛇 的移动方向。 6)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成 一颗新的豆,蛇身增加一节。 7)当蛇头碰到石块时,蛇死亡,游戏结束。 8)当蛇头咬到蛇身时,则蛇死亡,游戏结束。 9)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。 10)游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个 豆子就可以过关,级别显示为2,速度增加100变为300.第二

关为吃够10个豆子,速度增加50,以后以此类推。 11)游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏 的玩法。 12)对于不是第一次玩的玩家可以改变蛇的运动速度,来增加难 度。在菜单中设有加速和减速两个键,单击可以改变速度。 13)游戏菜单中还有时间显示。 14)当游戏暂停时,可以通过“继续”键使游戏继续进行。 四.需求分析 本游戏用户可以自己练习和娱乐。本游戏需要满足以下几点要求: (1)利用方向键“↑、↓、←、→”来改变蛇的运行方向。 (2)空格键暂停游戏,并在随机的地方产生食物。 (3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则 正常运行。 可行性分析: 贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效

贪吃蛇游戏设计报告

贪吃蛇游戏设计 班级:13级7班 学号: 姓名: 一、实验目的 1.熟练掌握C6713 的中断结构和对中断的处理过程。 2.熟练掌握C6713 定时器的控制和使用方法。 3.熟练掌握键盘的使用原理及编程方法。 4.熟练掌握使用C6713DSP的扩展空间控制外围设备信息的方法;掌握蜂鸣器发声原理和音乐发生方法;掌握液晶显示器的显示控制原理及编程方法。 5.掌握C6713的系统自启动设计方法。 6.熟练掌握C语言开发DSP程序的流程及调试方法。 二、实验设备 计算机,ICETEK-C6713-EDU 实验箱,示波器。 三、实验内容(*号为选做内容) 1、在液晶屏上显示游戏背景、初始蛇身及运动、随机产生食物。 2、可以用键盘控制蛇身运动、暂停游戏。 3、游戏烧写到FLASH内,可以上电自启动运行。 四、设计原理 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个按键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体叉蛇头撞倒自

己身体游戏结束。 要想实现贪吃蛇功能,需要应用到键盘,按键中断,和液晶显示。想要正常使用按键,就要调用包含于有文件"ICETEK-C6713-A.h"中的init_emif();和InitCTR();程序用来初始化emif和ICETEK-CTR。 中断原理:dsp有三种类型的中断cpu的TMS320C6000:重置、可屏蔽的、不可屏敝的复位中断优先级最高,对应于复位信号。不可屏蔽中断优先级最高,对应于第二敝中断信号。最低优先级中断中断4?15对应INT4?INT15信号。重置,敝中断,一些INT4?INT15信号映射到C6000设备上的别针。一些INT4?INT15中断信号是内部使用的外设和一些可能不可用或在软件的控制下可以使用。 外中断区别于计时器等片内设备中断,它来源于DSP 片外,属于硬件中断。外中断信号通过DSP 器件封装上的专用管脚输入DSP,属于可屏蔽中断。TMS3206713DSP 有三个外中断:EXT_INT4~EXT_INT7,如果CPU 允许,这四个信号线上的低脉冲信号会中断CPU。 中断是为使CPU 具有对外界异步事件的处理能力而设置的。通常DSP 工作在包含多个外界异步事件环境中,当这些事件发生时,DSP 应及时执行这些事件所要求的任务。中断就是要求CPU 暂停当前的工作,转而去处理这些事件,处理完成后,再回到原来被中断的地方继续原来的工作。显然,服务一个中断包括保存当前处理现场,完成中断服务,恢复各寄存器和现场,然后返回继续执行被暂时中断的程序。请求CPU 中断的请求源称为中断源。这些中断源可以是片内的,如定时器等,也可以是片外的,如A/D 转换及其他片外装置。片外中断请求连接到芯片的中断管脚,并且在这些管脚处的电平上升沿产生。如果这个中断被使能,则CPU开始处理这个中断,将当前程序流程转向中断服务程序。当几个中断源同时向CPU 请求中断时,CPU 会根据中断源的优先级别,优先响应级别最高的中断请求。TMS320C6000 有11 个寄存器管理中断服务: *控制状态寄存器CSR 控制全局使能或禁止中断 *中断使能寄存器IER 使能或禁止中断处理 *中断标志寄存器IFR 指示有中断请求但未被响应的中断发生 *中断设置寄存器ISR 手动设置IFR 中的标志位 *中断清除寄存器ICR 手动清除IFR 中的标志位 *中断服务表指针ISTP 指向中断服务表的起始地址 *不可屏蔽中断返回指针NRP 包含从不可屏蔽中断返回的地址,该中断返回通过B NRP指令完成

相关主题
文本预览
相关文档 最新文档