VC++实现贪吃蛇的实验报告

合集下载

贪吃蛇游戏的开发报告

贪吃蛇游戏的开发报告

基于VC#.NET的贪吃蛇游戏的开发与设计目录1.实验目的 (3)2.实验任务与要求 (3)2.1实验内容 (3)2.2实验要求 (3)2.3实验环境 (3)3.设计方案 (3)3.1程序功能 (4)3.2设计思想 (4)3.3设计总体流程图 (4)3.4设计的具体实现 (4)4.程序测试 (15)4.1测试内容与结果 (15)4.2程序运行效果图 (17)5.实验总结 (17)参考文献 (17)附录 (18)附录A:主要源程序 (18)附录B:软件使用说明书 (23)一、实验目的(1)复习、巩固VC#.NET的基础知识,进一步加深对VC#.NET技术的理解和掌握;(2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

(3)培养学生在项目开发中团队合作精神、创新意识及能力二、实验任务与要求(1)实验内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。

贪吃蛇游戏开发的最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色),游戏结束时的积分。

(2)实验要求●对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;●系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;●说明书、流程图要清楚;●记录设计情况(备查,也为编写设计说明书作好准备);(3)实验环境WindowsXP操作系统,2005开发环境。

三、设计方案(1)程序功能一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键或A,D,W,S控制蛇向上下左右四个方向移动,蛇头撞到食物,则食物被吃掉,蛇身体长一节,同时记1分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或蛇头撞倒自己身体游戏结束。

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

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

C语言贪吃蛇课程设计报告摘要本报告介绍了一个基于C语言的贪吃蛇游戏的课程设计项目。

报告首先介绍了贪吃蛇游戏的背景和目标,然后详细说明了设计和实现过程中使用的数据结构、算法和关键技术。

最后,报告讨论了项目的测试结果和改进思路。

1. 引言贪吃蛇是一款经典的电子游戏,它的目标是控制一条蛇在有限空间内移动,吃掉食物并尽可能长大。

贪吃蛇游戏不仅有趣,而且对于初学者来说是一个很好的训练编程技巧的项目。

因此,在本课程设计中选择了贪吃蛇游戏作为项目的主题。

2. 设计目标本课程设计项目的主要目标是设计并实现一个使用C语言开发的贪吃蛇游戏。

具体目标包括: - 实现一个可用键盘控制的贪吃蛇游戏界面; - 设计合适的数据结构来表示贪吃蛇的状态; - 实现贪吃蛇的移动、吃食物、增长等基本功能; - 设计和实现合适的算法来检测和处理蛇与边界、蛇与自身以及蛇与食物的碰撞。

3. 设计与实现为了实现贪吃蛇游戏,我们使用了C语言作为开发语言,并采用了以下关键技术和数据结构:3.1 数据结构为了表示贪吃蛇的状态,我们设计了以下数据结构: - Point结构体用于表示二维坐标点,包括x和y坐标; - SnakeNode结构体用于表示贪吃蛇的每个节点,包括一个Point和指向下一个节点的指针; - Snake结构体用于表示整条贪吃蛇,包括一个指向头节点的指针和当前蛇的长度。

3.2 算法和关键技术为了实现贪吃蛇的移动、吃食物、碰撞等功能,我们采用了以下算法和关键技术: - 使用循环链表数据结构来表示贪吃蛇,使得贪吃蛇的移动和增长操作更高效;- 使用键盘输入来控制贪吃蛇的移动方向; - 使用随机数生成食物的位置; - 使用递归算法检测贪吃蛇与边界、自身以及食物之间的碰撞。

4. 测试与结果分析为了测试贪吃蛇游戏的功能和性能,我们设计了多个测试用例并进行了测试。

测试的结果表明我们的游戏实现了预期的功能,并且在性能方面表现良好。

然而,我们也发现了一些问题和改进的空间: - 贪吃蛇的移动速度过快,导致游戏难度较高; - 游戏界面设计简单,缺乏可玩性。

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

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

高级语言程序设计课程设计报告Experiment Designing reporter课程名称:高级语言程序设计英文名称 : C Program Experiment Designing专业:自动化 111学号: XXX姓名: XXX指导教师: XXX日期: 2012 年 6月 17日至 2011 年6 月 20 日山东工商学院信电学院山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“一:课程设计内容程序功能介绍贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。

设计思路我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”:第一步:寻找到一个真正可以运行的已用C编好的贪吃蛇。

因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。

所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。

第二步:运行游戏并了解游戏程序。

我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。

同样重要的是了解游戏程序。

因为只有看懂了程序,才能实现对他的改编,才能游刃有余。

第三步:寻找模块并分类,而后进行改编。

寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那第一页共十六页自动化 111么就应该找到void DrawK(void){setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);for(i=200;i<=500;i+=10)rectangle(i,200,i+10,209);}然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置的模块,让蛇见墙死的模块,让蛇吃苹果加长的模块……….并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。

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

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

南通大学计算机科学与技术学院操作系统试验报告书试验题目贪吃蛇游戏专业班级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,为什么不用数组,原因是数组的长度总是有限的,你不知道蛇体里面最终存放多少方格,而且数组比较繁琐。

项目实践报告模板(贪吃蛇)

项目实践报告模板(贪吃蛇)

1系统设计要求1.1需求分析本系统为一个用C#实现, 用类和GDI+完成一个贪吃蛇游戏软件,该系统的具体功能如下:(1).控制蛇的运动方向:用键盘上的↑.↓.←.→控制蛇的运动方向。

若在游戏中,蛇头碰墙或是自己的身体,则游戏结束。

(2).蛇吃食物:蛇每吃一个食物就增长一节,并且得分,加相应的分值,达到一定的分值游戏上升一个级别。

(3).游戏结束:如果在游戏过程中,蛇头碰墙或是碰到了自己的身体,则游戏结束。

速度:玩家可以自己选择游戏速度1.2界面要求+要求界面简洁美观,简单易用。

1.3设计环境本程序选择Visual Studio 2005作为实验环境。

2设计思路2.1系统分析(1). 明确贪吃蛇的游戏规则(2). 将panel控件设为游戏背景。

(3). 场地.贪吃蛇及食物都是在panel 控件的重绘中绘制。

绘制蛇身的好处是在贪吃蛇进行移动时,不需要重绘制背景。

(4).用Timer组件来实现贪吃蛇的移动,并且该组件的Interval属性来控制移动速度。

2.2概要设计2.根据设计思路,可以为系统设计,.四个类,一个豆类,一个块类,一个蛇类,和一个场地类。

豆(Bean)类的作用:是在特定的位置生成一个豆,豆要不断被吃掉,当豆被吃掉后,原豆消失,又在新的位置出现新的豆。

块(Block)类的作用:用来构成蛇,在蛇出现时,要把构成蛇的块一个个输出(显示),在蛇消失时,要把块消除掉。

蛇(Snack)类作用:组成蛇,如果蛇吃了豆就增长一块,蛇死亡后要消除块。

在蛇运行过程中,判断是否碰到自身,判断是否死亡。

场地(Floor)类作用:游戏的主场地,豆要在此范围出现,蛇要在此范围运行。

3系统功能模块图3.1功能模块图3.2程序流程图定义新块bb定义并实例化点P(vertex.X+25,vertex.Y+25)实例化blockList[count]定义i=0i<=count是否成立块添加到blockList中i=i+1HeadNumber=count3.3类的结构图4调试过程生成块和豆的调试过程:运行程序,在画布上随机生成块和豆,如果无法生成块和豆就应该检查其随机生成函数,调整其相关函数.运行程序,生成不同大小和颜色的豆和块.蛇类的调试过程:运行程序在画布上随机生成蛇,如果无法随机生成蛇应查看生成蛇的相关函数,如随机生成函数,如果蛇只增不减少应查看显示蛇的方法里的移出函数.更该相关的函数后运行函数,控制蛇的运行方向以及测试蛇类的各项功能.场地类的调试过程:运行程序,初始化场地,如果无法生成场地,检查显示场地的方法,然后运行程序,测试蛇类的各项功能.主游戏的调试过程:运行程序,如果"级别"菜单的级别无法生效,就应该检查属性的click事件,是否把级别控制添加到click事件中。

VC课程设计报告贪食蛇

VC课程设计报告贪食蛇
3.1.2变量声明.
3.1.3资源.
主要功能的实现.
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
游戏界面.初始化食物 开始游戏.英雄榜
游戏设置.
第四章
4.1
4.2
结果与讨论
程序运行.错误调试与分析来自- 3- 3- 3
- 3
- 3
- 3
- 4
- 4
- 4
- 4
- 6
- 6
- 6
- 6
- 7
- 7
- 7
图1-1所示。
2.1.2
根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括:
出现食物;按下ToolBar中的暂停按钮或Space键可以实现暂停功能;按下帮助键或ToolBar中的“?”
键可获得游戏帮助说明;可播放背景音乐和音效并可通过菜单以及
- 8
- 9
11
11
12
12
14
第一章引言
1.1
1.1.1
利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求:
(1)应用MFC单文档制作
第二章概要设计
2.1
2.1.1
根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及 停止游戏,音乐音效的添加与控制,游戏帮助提示与英雄榜的显示等等。具体的程序结构如下面的
VC
设计题目:
学 院:
专业班级:
学生姓名:
学生学号:
指导教师:
成 绩:
第一章
1.2
1.3
引言
关于题目.
1.1.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关于SNAKE3.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;3.3游戏界面设计3.3.1游戏初始化游戏初始蛇体长度为3,颜色为灰色,食物标志为1,因为此时没有显示出食物,需要随机生成后,才置为0;void CSNAKEView::OnInitialUpdate(){CView::OnInitialUpdate();Snake[0].x=10;Snake[0].y=10;Snake[1].x=11;Snake[1].y=10;Snake[2].x=12;Snake[2].y=10;Snake[0].direct=3;Snake[0].len=3;Food.isfood=1;//初始化贪吃蛇起初有3个节点,长度为3,起始坐标;食物默认为1无0有// TODO: Add your specialized code here and/or call the base class }void CSNAKEView::oninit(){CDC *pDC=GetDC();CBrush DrawBrush=(RGB(100,100,100));CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);for(int i=0;i<=Snake[0].len-1;i++)pDC->Rectangle(Snake[i].x*20,Snake[i].y*20,(Snake[i].x+1)*20,(Snake[i].y+1)*2 0);pDC->SelectObject(DrawBrush);}3.3.2游戏开始点击游戏开始菜单后,出现一个对话框,提示一秒后,将开始游戏。

c语言贪吃蛇实训报告

c语言贪吃蛇实训报告

c语言贪吃蛇实训报告C语言贪吃蛇实验报告C语言程序设计实训报告姓名专业班级指导教师二011年7 月14 日11.1 1.2目录实训目的和要求 (1)实训目的和任务........................................................... .................................. 1 实训要求........................................................... .. (1)22.1 2.2实训任务内容 (1)游戏规则........................................................... .................................................. 1 流程设计........................................................... .. (2)33.1 3.2 3.3软件使用说明 (3)编辑程序主要软件........................................................... ............................. 3 编辑程序辅助软件........................................................... ............................. 3 程序使用过程........................................................... ........................................ 3 3.3.1 3.3.2 3.3.3贪吃蛇进入........................................................... ............................. 3 贪吃蛇的玩法........................................................... ........................ 4 贪吃蛇的结束........................................................... (4)44.1 4.2实训心得和体会 (5)实训的心得........................................................... ............................................. 5 实训的体会........................................................... (5)参考文献.............................. 6 附录:部分程序清单. (7)1 实训目的和要求1.1 实训目的和任务1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C 语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 实训要求1. 分析实训题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用4. 设计完成后提交实训报告2 实训任务内容2.1 游戏规则通过一个学期对C语言程序设计的学习,经过实训,完善我们对C语言学习的漏洞和未学会的知识点,更加熟练的掌握C语言程序设计,锻炼我们独立自主设计程序编辑代码的能力,通过设计出来的程序,提高我们对C语言学习的兴趣,玩家通过键盘控制蛇在地图上寻找食物,蛇吃蛇食物,可以加分,碰到四壁游戏结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:利用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()(游戏暂停函数)OnGameExit()(游戏退出函数),OnPaint()(游戏界面的显示函数),AddSnake(Snake *snake)(增加蛇身长度函数),DrawFood(CDC *pDC, SnakeFood f)(画食物函数),DrawSnake(CDC *pDC,Snake snake)(画蛇函数),MoveSnake(Snake *snake)(蛇的移动函数),InitSnake(Snake *snake)(初始化蛇函数),UnDrawSnake(Snake snake)(更新蛇函数),GameOver()(游戏结束函数)三、实现过程:(1)流程图(2) 主要功能程序代码:typedef struct SnakeNode //定义蛇结点{int x; //蛇每个节点的横纵坐标int y;}SnakeNode;typedef struct Snake //定义蛇的身体{SnakeNode data[100]; //用数组来表示蛇身体的每一节int curr; //移动指向蛇的每一节并统计蛇的长度}Snake;typedef struct food //定义食物结构体{int x; //食物的横坐标int y; //食物的纵坐标}SnakeFood;Snake snake;SnakeFood food;int x, y; //定义横纵坐标int direct; //定义方向变量int nGameState; //定义游戏的状态int score; //定义分数变量int speed; //定义速度变量int d; //该变量用于控制蛇身不能后退void InitSnake(Snake *snake); //初始化蛇void MoveSnake(Snake *snake); //蛇的移动void AddSnake(Snake *snake); //增加蛇的身体长度void DrawSnake(CDC *pDC , Snake snake); //绘制蛇void UnDrawSnake(Snake snake); //绘制蛇的显示框void DrawFood(CDC *pDC, SnakeFood f); //绘制食物int GameOver(); //游戏结束//完成与对话框的数据交互void CSnakeDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSnakeDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSnakeDlg, CDialog)//{{AFX_MSG_MAP(CSnakeDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(IDM_HELP_ABOUT, OnHelpAbout)ON_WM_TIMER()ON_COMMAND(IDM_GAME_START, OnGameStart)ON_WM_KEYDOWN()ON_COMMAND(IDM_GAME_PAUSE_START, OnGamePauseStart)ON_COMMAND(IDM_GAME_EXIT, OnGameExit)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////// //////////////////// CSnakeDlg message handlersvoid CSnakeDlg::OnGameStart() //游戏开始函数{// TODO: Add your command handler code hereSetTimer(1,speed,NULL); //SetTimer一种API函数,定时器InitSnake(&snake);nGameState=1; //游戏开始时为1 }void CSnakeDlg::OnGamePauseStart() //游戏暂停函数{// TODO: Add your command handler code hereCDC *pDC =GetDC();if(nGameState==0){if(!GameOver()){SetTimer(1,speed,NULL);nGameState=1;}}else{if(!GameOver()){KillTimer(1);nGameState=0;}}pDC->TextOut(70,130,"Pause!!!");}void CSnakeDlg::OnGameExit() //游戏退出函数{// TODO: Add your command handler code hereAfxGetMainWnd()->SendMessage(WM_CLOSE);}//处理键盘按键消息void CSnakeDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){// TODO: Add your message handler code here and/or call defaultswitch(nChar){case 'D':if(direct!=2&&d!=2)direct=0;break;case 'S':if(direct!=3&&d!=3)direct=1;break;case 'A':if(direct!=0&&d!=0)direct=2;break;case 'W':if(direct!=1&&d!=1)direct=3;break;}if(nChar==VK_SPACE){if(nGameState==0){if(!GameOver()){SetTimer(1,speed,NULL);nGameState=1;}}else{if(!GameOver()){KillTimer(1);nGameState=0;}}}CDialog::OnKeyDown(nChar, nRepCnt, nFlags);}void CSnakeDlg::OnPaint() //游戏界面的显示函数{if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON); //获取系统分辨率int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect); //获取窗口客户区的大小int x = (rect.Width() - cxIcon + 1)/2 ;int y = (rect.Height() - cyIcon + 1)/2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}CDC *pDC = GetDC();pDC->SetBkColor(RGB(50,230,100)); //设置游戏提示字体背景颜色pDC->TextOut(220,30,"得分:0");pDC->TextOut(260,80,"上:W");pDC->TextOut(300,110,"下:S");pDC->TextOut(340,140,"左:A");pDC->TextOut(380,170,"右:D");pDC->TextOut(420,210,"空格暂停");//pDC->Rectangle(10,10,210,320);UnDrawSnake(pDC,snake);DrawSnake(pDC,snake);}void AddSnake(Snake *snake) //增加蛇身长度函数(在MoveSnake()函数中调用){int t=1,tx,ty,xx,yy;if(snake->curr<100)snake->curr++; //控制长度蛇身长度小于100xx=snake->data[0].x; //xx,yy记录蛇头坐标yy=snake->data[0].y;do{tx=snake->data[t].x; //tx,ty记录蛇身第一节坐标ty=snake->data[t].y;snake->data[t].x=xx; //蛇头坐标赋给蛇身第一节snake->data[t].y=yy;xx=tx; //将蛇身第一节坐标赋给新的蛇头yy=ty;t++; //蛇增加一节}while(t<snake->curr);}void DrawFood(CDC *pDC, SnakeFood f) //绘制食物函数{CString ss;pDC->SetBkColor(RGB(50,230,100));ss.Format("得分:%d",score);pDC->TextOut(220,30,ss);pDC->Rectangle(f.x*10+11,f.y*10+11,f.x*10+18,f.y*10+18); }void DrawSnake(CDC *pDC,Snake snake) //绘制蛇函数{int t;t=snake.curr-1;pDC->SelectStockObject(BLACK_BRUSH);pDC->SelectStockObject(BLACK_PEN);pDC->Rectangle(snake.data[t].x*10+11,snake.data[t].y*10+ 11,snake.data[t].x*10+18,snake.data[t].y*10+18);t--;pDC->SelectStockObject(HOLLOW_BRUSH);while(t>=0){pDC->Rectangle(snake.data[t].x*10+11,snake.data[t].y*10+11,snake.data[t].x*10+18,snake.data[t].y*10+18);t--;}}int GameOver() //游戏结束函数{int t;if(x<0||x>19||y<0||y>30)return 1;t = snake.curr-2;while(t){if(snake.data[t].x==x&&snake.data[t].y==y)return 1;t--;}return 0;}void InitSnake(Snake *snake) //初始化蛇函数{int t;direct=0; //初始方向置为0nGameState=0; //初始化时状态变为0 score=0;speed=200;//刷新运动的时间间隔(数值越大,移动速度越慢,数值越小,移动速度越快)d=0; //控制蛇身不能后退snake->curr=2; //初始蛇深长度(2节) x=4; //蛇的横坐标(初始值)y=4; //蛇的纵坐标snake->data[0].x=x; //蛇头横坐标snake->data[0].y=y; //蛇头纵坐标food.x=rand()%20; //随机产生食物food.y=rand()%30;switch(direct){case 0: x+=1;break; //右case 1: y+=1;break; //上case 2: x-=1;break; //左case 3: y-=1;break; //下}snake->data[1].x=x; //蛇身第一节坐标(上一步中x坐标加1了)snake->data[1].y=y; //蛇身第一节坐标(上一步中y坐标不变)t=snake->curr-1; //此时t=1while(t) //当蛇身长度不为0时{if(snake->data[t].x==food.x&&snake->data[t].y==food.y) {food.x=rand()%20;food.y=rand()%31;}t--; //从最后一节依次往前判断蛇身食物的关系}}void MoveSnake(Snake *snake) //移动蛇函数{int t, xx, yy;int tx, ty;switch(direct){case 0: x+=1;break; //右case 1: y+=1;break;case 2: x-=1;break;case 3: y-=1;break;}if(GameOver())return;xx=x;yy=y;if(xx==food.x&&yy==food.y){t=snake->curr-1;food.y=rand()%31; //随机生成数函数随机产生函数food.x=rand()%20;while(t){if(snake->data[t].x==food.x&&snake->data[t].y==food.y) {food.y=rand()%31;food.x=rand()%20;t=snake->curr-1;}t--;}score+=1;if((score%10)==0)speed-=20;AddSnake(snake);}t=snake->curr-1;do{tx=snake->data[t].x;ty=snake->data[t].y;snake->data[t].x=xx;snake->data[t].y=yy;xx=tx;yy=ty;t--;}while(t>=0);}void UnDrawSnake(CDC *pDC, Snake snake) //绘制蛇的显示框函数{pDC->Rectangle(10,10,210,320); //显示蛇移动的文本框}四、运行结果展示:五、总结与心得体会:通过对大一课程的学习,我已经了解了C语言和C++语言程序设计的一些基本方法,进入到大二的学习,开始接触VC++面向对象编程。

相关文档
最新文档