贪吃蛇设计说明书.docx
《贪吃蛇设计说明书.docx》由会员分享,可在线阅读,更多相关《贪吃蛇设计说明书.docx(41页珍藏版)》请在冰豆网上搜索。
贪吃蛇设计说明书
贪吃蛇设计说明书
摘要
本贪吃蛇(Snake)游戏仿照以往的贪吃蛇游戏,尽管在图形界面方面存在一定的缺陷,但能够基本实现游戏的功能。
本游戏分为10个级别,玩家通过方向键对蛇的运动进行控制,如果蛇吃到食物,得分加10分,并且到一定的程度级别会上升。
此外,用户可以根据需要选择速度、界面以及播放的音乐,并且在游戏中保存了以往前三名玩家的记录,供玩家参考。
关键字:
主页面,快捷键,方向键,解决方案
目录
第一章:
ATM系统概述
1.1系统的主要任务
1.2基本要求
1.3主要功能
1.4设计方法及涉及知识点
1.4.1设计方法
1.4.2涉及知识点
1.5系统开发的目的
第二章:
系统分析
2.1分析问题和定义类,给出类的定义和联系,
2.2系统开发平台的选择
2.3程序设计语言的选择
2.4操作平台
第三章:
总体设计
3.1系统的结构图(总图)
3.2函数模块说明(每个函数的原型、功能说明)
3.3系统运行界面截图
第四章:
系统评价
4.1系统的特点
4.2系统的缺点
4.3将来可能提出的要求
第五章:
小结
第六章:
参考文献
第一章ATM系统概述
1.系统的主要任务
本游戏主要提供给玩家进行娱乐。
2.基本要求
1.要求利用面向对象的方法以及C#程序设计语言来完成该系统的设计;
2.要求在设计的过程中,建立清晰的类的层次;
3.在系统中建立相关的类,每个类中都要有各自的属性和方法;
4.程序运行结果正确,操作方面,界面美观,逻辑层次清楚,程序结构合理,文档规范清晰。
3.主要功能
该系统具备以下功能:
控制蛇运动方向:
用键盘上的↑、↓、←、→控制蛇的运动方向。
当蛇向一个方向运动时,它的反向键被锁定。
不能通过连续按住某个方向键而加快蛇的运动。
若在游戏中,蛇头碰了墙或是自己的身体,则游戏结束。
蛇吃食物:
蛇每吃一个食物增长一节,并且得分加10分,总共为100节。
蛇每增长10节游戏上升一个级别。
游戏结束:
如果在游戏过程中,蛇头碰墙或是碰到了自己的身体,则游戏结束。
如果在游戏过程中,用户选择退出游戏,则提醒用户游戏正在进行,是否要退出。
选择退出,则游戏结束。
选择取消,则游戏继续。
如果玩家成功过关,则游戏结束。
在上述任何一种情况下,系统都会询问用户:
是否保存游戏成绩?
选择确定,如果姓名为空,则默认以“匿名玩家”记录。
选择取消,则不记录。
开始:
开始游戏
暂停:
暂停游戏
退出:
退出游戏
速度:
玩家可以通过:
选项->速度打开窗口。
系统默认的方式是变速游戏。
玩家可以自行选择变速游戏或是均速游戏。
变速游戏:
速度分1-10个级别。
并且根据关卡的高低决定速度的快慢。
均速游戏:
用户可以自行选择所要速度的快慢。
1表示最慢,10表示最快。
音乐:
当打开游戏界面时,音乐会自动播放,默认的音乐是:
Remeber。
若玩家要修改或关闭音乐,可以通过:
选项->音乐或是F5快捷键打开窗口。
若玩家不想播放音乐,请点击关闭。
若玩家要播放选中的音乐,请点击确定。
界面:
玩家可以根据爱好选择想要的图片,总共有8张背景图片供选择。
玩家选择图片后,可以在对话框的右边预览到图片。
点击确定则显示选中的图片,点击取消则显示原先图片。
当游戏开始后,此功能键不能用。
查看记录:
玩家可以通过:
关于->查看记录或F6快捷键打开窗口。
窗口中显示了以往玩家的前三名成绩。
游戏说明:
玩家可以通过:
关于->游戏说明或F7快捷键打开窗口。
窗口中显示了本游戏的说明。
游戏的快捷键:
开始:
F2
暂停:
F3
退出:
F4
音乐:
F5
查看记录:
F6
游戏说明:
F7
4.设计方法及涉及知识点
4.1设计方法
因为界面的需要,在程序中有很多窗口:
frmStart:
游戏刚开始的窗口
frmGame:
在frmStart窗口中选择“进入游戏”后打开的窗口
frmSpeed:
用户选择速度时打开的窗口
frmMusic:
用户选择音乐时打开的窗口
frmFace:
用户选择界面时打开的窗口
frmScores:
用户查看记录时打开的窗口
frmAboutGame:
用户选择游戏说明时打开的窗口
frmMessage:
当游戏进行时,用户终止游戏出现的窗口
frmGameOver:
在蛇撞墙或是撞到自己身体是打开的窗口
frmGameSuccess:
用户成功结束游戏时打开的窗口
frmSave:
游戏开始后,游戏结束打开的窗口
此外,还创建了其他类:
Food类和Snake类
4.2涉及知识点
此程序涉及的知识点有:
函数的重载
线程的运用
文件的打开、读写和保存
窗口的创建,控件、容器、菜单和工具栏和组建的使用
5.系统开发的目的
1.通过开发该自动取款机系统,加强我们对所习的C#知识的理解掌握,理解并且学会使用面向对象的设计思想去设计程序。
2.考察我们的实践动手能力,独立思考能力,自主学习能力,还有通过一系列方法寻求帮助的能力等。
3.通过巩固以往的知识也为后续的课程打下良好的基础。
第二章系统分析
1.分析问题和定义类,给出类的定义和联系
玩家打开游戏,首先进入主页面(frmStart窗口),主页面有三个按钮:
进入游戏、退出游戏和关于游戏
进入游戏:
打开frmStart窗口
frmStart窗口:
工具栏分为游戏、选项和关于
游戏:
开始(F2)、暂停或继续(F3)、退出(F4)
开始:
游戏开始
暂停或继续:
游戏暂停或继续
退出:
游戏还没开始:
回到主界面
游戏已经开始:
打开frmMessage窗口:
选择确定:
打开frmSave窗口:
选择确定:
保存后回到主界面
选择取消:
不保存且回到主界面
选择取消:
游戏继续
选项:
速度、音乐(F5)、背景
速度:
打开frmSpeed窗口,玩家选择变速游戏或是均速游戏(此项还要选择速度)
音乐:
打开frmMusic窗口,玩家选择是否播放音乐以及播放的歌曲
背景:
打开frmFace窗口,玩家选择游戏界面的背景图片
关于:
查看记录(F6)、游戏说明(F7)
查看记录:
打开frmScores窗口
游戏说明:
打开frmAboutGame窗口
退出游戏:
程序结束
关于游戏:
打开frmAboutGame窗口
若在游戏过程中:
蛇头碰墙或自己身体:
打开frmGameOver窗口:
打开frmSave窗口:
玩家过关:
打开frmGameSuccess窗口:
打开frmSave窗口
之后回到主页面
此外frmGame中还调用了Snake和Food类,用来画蛇和食物。
2.系统开发平台的选择
此系统是基于MicrosoftVisualStudio2005开发环境开发的。
3.程序设计语言的选择
此系统的设计语言采用面向对象的程序设计语言MicrosoftVisualC#2.0。
4.操作平台
硬件条件:
IntelPIICPU、256RAM、20G硬盘以上的PC机
软件条件:
Windows98以上操作系统
第三章总体设计
1.系统的结构图(总图)
系统用例图:
系统类图:
系统流程图:
2.函数模块说明
frmStart:
publicpartialclassfrmStart:
Form
{
frmGamegame;
frmAboutGameaboutGame;
publicfrmStart()
{
InitializeComponent();
}
privatevoidbtnGoToGame_Click(objectsender,EventArgse)
{
game=newfrmGame();
frmGame.start=true;
game.Show();
}
privatevoidbtnCancel_Click(objectsender,EventArgse)
{
Application.Exit();
}
privatevoidbtnAboutGame_Click(objectsender,EventArgse)
{
aboutGame=newfrmAboutGame();
aboutGame.Show();
}
}
frmGame:
publicpartialclassfrmGame:
Form
{
[DllImport("winmm.dll")]
publicstaticexternuintmciSendString(stringlpstrCommand,stringlpstrReturnString,uintuReturnLength,uinthWndCallback);
//用于播放音乐
frmMusicmusic;
frmAboutGameaboutGame;
frmSpeedgameSpeed;
frmFaceface;
frmScoresscores;
frmGameOvergameOver;
frmMessageshowMessage;
frmGameSuccessgameSuccess;
//定义窗口对象
Snakesnake=newSnake();
Foodfood=newFood();
//定义类对象
Graphicsg;
Graphicsg1;
//定义画布对象
Bitmapimg;
TextureBrushtb;
//定义画图要用的的对象
intmax=100;
intspeed=1;
inthurdles=1;
stringpictureName="真实风景1.bmp";
boolchangeSpeed=true;
boolpicture=false;
publicstaticboolstart=true;
publicboollive;//判断蛇是否活着
publicstaticintscore=0;
//定义变量
publicfrmGame()
{
InitializeComponent();
live=false;
timer1.Enabled=false;
timer1.Interval=100;
if(start==true)
{
Snake.snakeDirection=Snake.snakePreDirection=2;
}
}
privatevoidpalMid_Paint(objectsender,PaintEventArgse)
{
g=pnlOut.CreateGraphics();
g1=pnlIn.CreateGraphics();
img=newBitmap("红墙.bmp");
tb=newTextureBrush(img);
g1.FillRectangle(tb,0,0,544,443);
img=newBitmap(pictureName);
tb=newTextureBrush(img);
g.FillRectangle(tb,0,0,500,400);
food.makeFood(g);
snake.draw(g);
if(start==true)
{
mciSendString(@"closetemp_alias",null,0,0);
mciSendString(@"open""Remember.mp3""aliastemp_alias",null,0,0);//不能修改,否则无法播放
mciSendString("playtemp_aliasrepeat",null,0,0);
}
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
gameOver=newfrmGameOver();
gameSuccess=newfrmGameSuccess();
if(picture==false)//表示刚才没有调过界面,如果没有此判断,则调了界面后会自动开始游戏
{
if(timer1.Enabled==true)
{
live=snake.move(g);
if(changeSpeed==true)//如果是变速游戏
{
speed=snake.number/10+1;//速度
hurdles=snake.number/10+1;//级别
score=(snake.number-1)*10;//分数
timer1.Interval=1000-(hurdles-1)*100;
}
else//速度不变的情况
{
hurdles=snake.number/10+1;
score=(snake.number-1)*10;
timer1.Interval=1000-(speed-1)*100;
}
lblScore2.Text=((snake.number-1)*10).ToString();
lblHurdles2.Text=(snake.number/10+1).ToString();
lblSpeed2.Text=speed.ToString();
}
if(live==false)//蛇死了,撞了墙或是撞了自己的尾巴
{
Snake.snakeDirection=Snake.snakePreDirection=2;
timer1.Enabled=false;//时间停止
gameOver.ShowDialog();
this.Close();
}
elseif(snake.number==max)
{
Snake.snakeDirection=Snake.snakePreDirection=2;
timer1.Enabled=false;//时间停止
gameSuccess.ShowDialog();
this.Close();
}
else//蛇向前运动
{
palMid.Invalidate();
palMid.Update();
}
}
}
protectedoverrideboolProcessCmdKey(refMessagemsg,KeyskeyData)//重载基类方法ProcessCmdKey才能使用方向键
{
if(timer1.Enabled==true)
{
switch(keyData)
{
caseKeys.Up:
if(Snake.snakePreDirection!
=3)
{
Snake.snakeDirection=1;
}
break;
caseKeys.Right:
if(Snake.snakePreDirection!
=4)
{
Snake.snakeDirection=2;
}
break;
caseKeys.Down:
if(Snake.snakePreDirection!
=1)
{
Snake.snakeDirection=3;
}
break;
caseKeys.Left:
if(Snake.snakePreDirection!
=2)
{
Snake.snakeDirection=4;
}
break;
}
if(Snake.snakePreDirection!
=Snake.snakeDirection)
{
snake.move(g);
palMid.Invalidate();
palMid.Update();
Snake.snakePreDirection=Snake.snakeDirection;
}
}
switch(keyData)
{
caseKeys.F2:
if(开始ToolStripMenuItem.Enabled==true)
{
开始ToolStripMenuItem.PerformClick();
}
break;
caseKeys.F3:
暂停ToolStripMenuItem.PerformClick();
break;
caseKeys.F4:
退出ToolStripMenuItem.PerformClick();
break;
caseKeys.F5:
音乐ToolStripMenuItem.PerformClick();
break;
caseKeys.F6:
查看记录ToolStripMenuItem.PerformClick();
break;
caseKeys.F7:
游戏说明ToolStripMenuItem.PerformClick();
break;
}
returntrue;
}
privatevoid开始ToolStripMenuItem_Click(objectsender,EventArgse)
{
live=true;
start=false;
timer1.Enabled=true;
picture=false;//使能够调用Timer1_Tick
暂停ToolStripMenuItem.Enabled=true;
开始ToolStripMenuItem.Enabled=false;//点击开始按钮后,开始、速度、界面按钮为不可用
速度ToolStripMenuItem.Enabled=false;
界面ToolStripMenuItem.Enabled=false;
}
privatevoid暂停ToolStripMenuItem_Click(objectsender,EventArgse)
{
if(timer1.Enabled==true)
{
timer1.Enabled=false;
暂停ToolStripMenuItem.Text="继续";
}
else
{
timer1.Enabled=true;
暂停ToolStripMenuItem.Text="暂停";
}
}
privatevoid退出ToolStripMenuItem_Click(objectsender,EventArgse)
{
showMessage=newfrmMessage();
timer1.Enabled=false;
if(live==true)//游戏已经开始了
{
showMessage.ShowDialog();
showMessage.Close();
if(showMessage.getResult())
{
timer1.Enabled=true;
}
else
{
this.Close();
}
}
else
{
Snake.snakeDirection=Snake.snakePreDirection=2;
this.Close();
}
}
privatevoid速度ToolStripMenuItem_Click(objectsender,EventArgse)
{
gameSpeed=newfrmSpeed();
gameSpeed.ShowDialog();
speed=gameSpeed.speed;
changeSpeed=gameSpeed.changeSpeed;
palMid.Invalidate();
palMid.Update();
}
privatevoid音乐ToolStripMenuItem_Click(objectsender,EventArgse)
//根据玩家选择播放音乐
{
music=newfrmMusic();
stringpath="";
mciSendString(@"closetemp_alias",null,0,0);
music.ShowDialog();
stringmusicName=music.getMusicName();
if(musicName!
="")
{
musicName=music.getMusicName();
path="open"+musicName+"aliastemp_alias";
}
mciSendString(@path,null,0,0);//不能修改,否则无法播放
mciSendString("playtemp_aliasrepeat",null,0,0);
palMid.Invalidate();
palMid.Update();
}
privatevoid界面ToolStripMenuItem_Click(objectsender,EventArgse)
//玩家可以自己选择图片
{
face=newfrmFace();
face.ShowDialog();
pictureName=face.name;
timer1.Enabled=true;
picture=true;//保证不调用Timer1_Tick
palMid.Invalidate();
palMid.Update();
}
privatevoid查看记录ToolStripMenuItem_Click(objectsender,EventArgse)
{
scores=newfrmScores();
scores.ShowDialog();
palMid.Invalidate();
palMid.Update();
}
privatevoid游戏说明ToolStripMenuItem_Click(objectsender,EventArgse)