VC实现贪吃蛇的实验报告
2021年C语言贪吃蛇实验报告
C语言程序设计汇报题目: 贪吃蛇游戏程序设计院系: 西语学院英语教育6班姓名:学号:1.1题目:设计贪吃蛇小游戏1.2 题目要求:玩家经过键盘控制蛇在地图上寻求食物, 蛇吃下食物, 能够加分, 碰到四壁游戏结束。
1.3设计步骤:●分析设计题目要求, 即需求分析。
●总体设计, 确定所需模块及模块间调用关系, 定义系统中使用数据类型。
●具体设计, 确定每个模块功效, 绘制关键函数步骤图。
●编写程序代码, 调试程序使其能正确运行。
要求书写规范, 注意采取缩进格式。
函数名、变量名要见文晓意, 注释要简而不失、详而不缀。
设计完成软件要便于操作和使用。
●程序测试, 发觉程序中存在错误并更正。
●完成汇报。
2具体设计说明2.1课程设计要求:经过游戏程序设计, 提升编程爱好与编程思绪, 巩固C语言中所学知识, 合理利用资料, 实现理论与实际相结合。
●搜集资料, 分析课题, 分解问题, 形成总体设计思绪;●对于设计中用到关键函数, 要学会经过查资料, 弄懂其使用方法, 要联络问题进行具体介绍;●上机调试, 查错, 逐步分析不能正常运行原因, 确保所设计程序正确, 而且能正常运行;完成课程设计汇报。
2.2程序功效:贪吃蛇游戏是一个经典小游戏, 一条蛇在封闭围墙里, 围墙里出现一个食物, 经过按键盘四个光标键控制蛇向上下左右四个方向移动, 蛇头撞倒食物, 则食物被吃掉, 蛇身体长一节, 同时记10分, 接着又出现食物, 等候蛇来吃, 假如蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
2.3课程设计思想:程序关键在于表示蛇图形及蛇移动。
用一个小圆点来表示蛇一节身体, 身体每长一节, 增加一个圆点, 蛇头用四节来表示。
移动时必需从蛇头开始, 所以蛇不能向相反方向移动, 假如不按任意键, 蛇自行在目前方向上前移, 假如按与蛇运动方向相反方向键, 此游戏就会暂停, 再按想前方向键才能继续游戏, 但按下有效方向键后, 蛇头朝着该方向移动, 一步移动一节身体, 所以按下有效方向键后, 先确定蛇头位置, 以后蛇身体随蛇头移动, 图形实现是从蛇头新位置开始画出蛇, 这时, 因为未清屏原因, 原来蛇位置和新蛇位置差一个单位, 所以看起来蛇多一节身体, 所以将蛇最终一节用背景色覆盖。
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);}然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置的模块,让蛇见墙死的模块,让蛇吃苹果加长的模块……….并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。
C语言课程设计报告(贪吃蛇)
C语言课程设计报告(项目:贪吃蛇)学号:姓名:课程设计题目:贪吃蛇游戏专业班级:核工程与核技术4班报告人姓名:学号:同组组长:同组其他成员:课程教师:实验地点:95101实验室完成起止日期:2011年3月7日至2011年3 月15日一、课程设计概述(目的、任务、开发环境、参考资料)课程目的:1.熟悉二维数组的应用2.图形库文件中图形函数的使用3.通过游戏程序增加编程兴趣,提高编程水平课程任务:1.数组元素为结构体的数组应用2.全局变量应用3.按键处理4.数组元素与蛇食物对应关系5.图形方式开发环境:turbo C参考资料:《C语言课程设计案例精编》郭翠英等编著中国水利水电出版社二、项目的可行性研究项目流程图三、项目设计的基本原理和采用的主要方法与技术1.项目流程图2.graphics.h库函数中的矩形函数rectangle()等图形函数的应用3.二维数组的应用4.按键控制5.全局变量四、本人实现项目的过程与步骤1.画出项目流程图(如上图)2.写出主函数的整个运行过程3.整理函数运行过程中所需要的函数及定义如:(1).矩形图形函数rectangle()(2).定义蛇和实物的二维数组结构体struct Snake{int x[N]; int y[N]; int node; int direction;int life;}snake;(3).按键定义#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b4.定义各函数,分配功能void Init(void);图形驱动void Close(void);图形结束void DrawK(void);开始画面void GameOver(void);游戏结束void GamePlay(void);游戏过程void PrScore(void);输出成绩5.各函数的编辑开始画面函数(画围墙)游戏过程函数(蛇移动的算法蛇吃食物的算法按键算法等)游戏结束及成绩输出函数6.定义与各函数的整合嵌入7.编译调试8.对程序的扩展功能的调整9.完成实验报告五、个人遇到的困难与获得的主要成果(一)遇到的主要主要困难1.程序结构的理解由于长时间对C语言与数据结构没有接触,使我们对这些有一些相对陌生,主要是二维数组的引用以及循环的控制方面,如:(1) for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}(2)for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ {if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) {GameOver();/*显示失败*/snake.life=1;break;}}2.graphics.h图形库函数的陌生第一次接触graphics.h库函数,对其一无所知通过查阅资料找到graphics.h库函数中几个关键函数的功能及用法。
项目实践报告模板(贪吃蛇)
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课程设计报告贪食蛇
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题目要求
C#实验报告(贪吃蛇游戏)
《C#程序设计及应用教程》课程设计报告设计题目贪吃蛇游戏专业2011级软件工程班级2011级软件工程姓名学号*********完成日期2013-06-24目录1. 问题描述………………………………………………2. 系统设计………………………………………………3. 数据结构与算法描述…………………………………4. 测试结果与分析………………………………………5. 总结…………………………………………………6. 参考文献………………………………………………附录程序源代码…………………………………………(报告正文部分):课程设计题目1. 问题描述我设计的的游戏首先在主界面选择游戏难度,接着进行游戏,在游戏过程中贪吃蛇不停地吃掉随机产生的食物,蛇身增长,直到蛇触碰到自己的身躯或边框,游戏结束特色:1.游戏可以自选难度,且蛇身长每增加2游戏可以储存游戏分数,你可以查看最高分3游戏过程中蛇的颜色,食物的颜色,分数的颜色,可以不停变换,增加视觉效果2. 系统设计2.1 设计目标C#课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对C#的理解和掌握;提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质;培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新 2 月异的发展形势;本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,做出设计报告。
2.2 设计思想程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,所以蛇不可以向相反的方向移动,如果不按任意键,蛇自行在当前方向右前移,但按下有效方向键后,蛇头朝该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后节用背景色覆盖。
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语言学习的兴趣,玩家通过键盘控制蛇在地图上寻找食物,蛇吃蛇食物,可以加分,碰到四壁游戏结束。
关于贪吃蛇的实训报告
一、实训目的本次实训旨在通过C语言编程实现贪吃蛇游戏,巩固和加深对C语言程序设计的基本知识的理解和掌握,提高编程和程序调试的基本技能,并锻炼独立自主设计程序和编辑代码的能力。
通过设计贪吃蛇游戏,进一步理解和运用结构化程序设计的思想和方法,初步掌握开发一个小型实用系统的基本方法,学会调试一个较长程序的基本方法,以及掌握书写程序设计开发文档的能力。
二、实训内容1. 游戏规则贪吃蛇游戏的基本规则如下:- 蛇在游戏区域中上下左右移动,通过键盘方向键控制。
- 每次蛇头撞到食物,蛇身增长一节,同时计10分。
- 若蛇头撞到墙壁或自身,游戏结束。
- 游戏区域大小、蛇的初始长度、食物的生成方式等参数可调整。
2. 程序设计(1)数据结构- Food结构体:用于存储食物的位置信息,包括横坐标x、纵坐标y和是否生成食物的标志yes。
```cstruct Food {int x;int y;int yes;};```- Snake结构体:用于存储蛇的位置信息、长度、移动方向和生命状态。
```cstruct Snake {int x[N];int y[N];int node;int direction;int life;};```(2)功能模块- 初始化函数:初始化游戏区域、蛇的位置、长度、方向和生命状态,以及食物的位置信息。
- 键盘输入处理函数:获取键盘输入,控制蛇的移动方向。
- 食物生成函数:根据设定规则生成食物。
- 蛇移动函数:根据蛇的移动方向和速度,更新蛇的位置信息。
- 游戏判断函数:判断蛇是否吃到食物、撞到墙壁或自身,以及游戏是否结束。
- 界面绘制函数:绘制游戏区域、蛇和食物。
三、程序实现以下为部分关键代码示例:```c// 初始化函数void init() {// 初始化游戏区域、蛇的位置、长度、方向和生命状态,以及食物的位置信息}// 键盘输入处理函数void keyInput() {// 获取键盘输入,控制蛇的移动方向}// 食物生成函数void generateFood() {// 根据设定规则生成食物}// 蛇移动函数void moveSnake() {// 根据蛇的移动方向和速度,更新蛇的位置信息}// 游戏判断函数void judgeGame() {// 判断蛇是否吃到食物、撞到墙壁或自身,以及游戏是否结束}// 界面绘制函数void draw() {// 绘制游戏区域、蛇和食物}```四、实训心得与体会1. 编程能力提升:通过本次实训,我对C语言编程和程序设计有了更深入的理解,编程能力得到了显著提升。
贪吃蛇的实训报告
一、实训目的本次实训旨在通过设计并实现贪吃蛇游戏,巩固和加深学生对C语言程序设计的基本知识,提高学生的编程能力和实际动手操作能力。
通过实训,使学生能够熟练掌握C语言编程技巧,理解程序设计的基本思想和流程,同时培养学生的团队协作和问题解决能力。
二、实训内容1. 游戏规则贪吃蛇是一款经典的电脑游戏,玩家通过键盘控制蛇在游戏区域中移动,吃掉随机出现的食物。
蛇在吃掉食物后,长度会增加,得分增加。
如果蛇头撞到墙壁或自己的身体,游戏结束。
2. 游戏界面游戏界面由一个矩形区域组成,代表游戏区域。
蛇用一系列方块表示,食物用不同的颜色表示。
游戏开始时,蛇的长度为3,随机生成食物。
游戏过程中,蛇会根据玩家的输入移动。
3. 游戏逻辑(1)初始化:设置游戏区域大小、蛇的初始位置和方向、食物的初始位置等。
(2)游戏循环:不断检测玩家输入,更新蛇的位置,判断蛇是否吃到食物、撞到墙壁或自己的身体。
(3)游戏结束:当蛇撞到墙壁或自己的身体时,游戏结束。
4. 程序设计(1)数据结构:定义蛇、食物和游戏区域的数据结构。
(2)函数设计:设计初始化函数、移动函数、判断是否吃到食物函数、判断是否撞到墙壁或自己的身体函数等。
(3)主函数:调用相关函数,实现游戏循环。
三、实训过程1. 设计阶段首先,根据游戏规则和界面设计,确定游戏的数据结构和函数。
然后,编写程序代码,实现游戏的基本功能。
2. 编码阶段根据设计阶段的设计,使用C语言编写程序代码。
在编写过程中,注意代码的可读性和可维护性。
3. 调试阶段在编写代码过程中,不断调试程序,修复出现的错误。
调试过程中,注意观察程序运行情况,分析问题原因,并找出解决方案。
4. 测试阶段完成程序编写后,进行测试,确保程序能够正常运行。
测试过程中,注意观察游戏效果,确保游戏规则和界面设计符合预期。
四、实训成果通过本次实训,成功设计并实现了贪吃蛇游戏。
游戏运行稳定,功能完整,达到了实训目的。
五、实训心得1. 理解程序设计的基本思想和流程,掌握C语言编程技巧。
C语言贪吃蛇实验报告
C语言程序设计报告题目:贪吃蛇游戏的程序设计院系:西语学院英语教育6班姓名:学号:1.1题目设计贪吃蛇小游戏1.2题目的要求:玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。
1.3设计的步骤:分析设计题目的要求,即需求分析。
总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。
详细设计,确定每个模块的功能,绘制主要函数的流程图。
编写程序代码,调试程序使其能正确运行。
要求书写规范,注意采用缩进格式。
函数名、变量名要见文晓意,注释要简而不失、详而不缀。
设计完成的软件要便于操作和使用。
程序测试,发现程序中存在的错误并改正。
完成报告。
2详细设计说明2.1课程设计的要求:通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
收集资料,分析课题,分解问题,形成总体设计思路;对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;完成课程设计报告。
2.2 程序的功能:贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10 分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
2.3 课程设计的思想:程序关键在于表示蛇的图形及蛇的移动。
用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
C语言贪吃蛇实验报告
C语言贪吃蛇实验报告实验报告:C语言贪吃蛇游戏的实现一、引言贪吃蛇是一款非常经典的游戏,它的规则简单而有趣,对于初学者来说,实现一个贪吃蛇游戏是一个很好的练习项目。
本实验报告将介绍如何使用C语言实现一个简单的贪吃蛇游戏。
二、实验内容1.界面设计贪吃蛇游戏的界面包括游戏区域和游戏信息区。
游戏区域是以二维数组表示的地图,贪吃蛇和食物在地图上移动。
游戏信息区可以显示得分、游戏状态等信息。
2.贪吃蛇的移动贪吃蛇的移动是贪吃蛇游戏的核心部分。
贪吃蛇每次移动时,头部朝着移动的方向前进一格,身体部分跟随头部的移动。
如果吃到食物,贪吃蛇的长度会增加。
3.游戏结束判定游戏结束有两种情况:贪吃蛇撞到地图边界或者撞到自己的身体。
游戏结束后,可以显示得分信息。
三、实验过程1.设计游戏界面使用C语言的“#include <conio.h>”头文件中的一些函数,可以控制台下的光标位置,从而实现贪吃蛇游戏的界面设计。
2.实现贪吃蛇的移动首先定义了一个结构体Snake来表示贪吃蛇,结构体中包含了贪吃蛇的长度、坐标等信息。
使用动态数组保存贪吃蛇的身体坐标,每次移动时改变贪吃蛇头部的坐标,并更新贪吃蛇的位置。
3.生成食物使用rand函数生成一个随机数作为食物的坐标,在游戏区域内随机生成。
每次贪吃蛇吃到食物时,贪吃蛇的长度加1,并生成新的食物。
4.游戏结束判定在每次贪吃蛇移动时,判断贪吃蛇的头部是否撞到地图边界或者撞到自己的身体,如果是则游戏结束。
四、实验结果经过代码的实现和调试,成功完成了C语言贪吃蛇游戏的编写。
在控制台下可以看到一个游戏界面,贪吃蛇可以按照指定的方向移动,并且能够吃到食物,蛇的长度会随之增加。
当贪吃蛇撞到边界或者自己的身体时,游戏会结束,并显示得分信息。
五、实验总结通过本次实验,我深入了解了贪吃蛇游戏的实现原理,掌握了C语言的数组、结构体等基本知识,并通过实践加深了对这些知识的理解。
在实验过程中,我遇到了一些问题,比如如何设计游戏界面、如何控制贪吃蛇的移动、如何生成食物等等。
贪吃蛇程序设计报告(附C源码)
《计算机程序设计基础》课程设计题目用户管理系统学生姓名王孟学号 0909082920 指导教师郭克华学院信息科学与工程学院专业班级电气类 0829 完成时间 2009-7-1目录1.课程设计内容 (3)2.课程设计目的 (3)3.背景知识(可选项) (3)4.工具/准备工作(可选项) (4)5.设计步骤、方法等 (4)5.1. 步骤1:步骤名称(二级标题) (4)5.1.1. 步骤1.1:步骤名称(三级标题) ............................................ 错误!未定义书签。
5.2. 步骤2:步骤名称 (6)5.3. 步骤n:步骤名称 (8)6.设计结果及分析 (10)7.设计结论 (10)8.问题及心得体会 (10)9.对本设计过程及方法、手段的改进建议 (11)10.参考文献 (12)报告名称1. 课程设计内容产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域没有边界,所以蛇在区域内作循环运动;蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇的运动速度由游戏的难度来控制,难度越高,速度越快,游戏难度分为9个等级;蛇身体的长度从1开始每吃掉一份食物就增加一个长度;食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;每吃掉一份食物得分为10*游戏的难度,游戏结束后统计全部的得分;游戏结束的条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位;2. 课程设计目的(1)、通过c语言编程实现贪吃蛇游戏的运行。
(2)、对代码进行进一步的调试优化,以使游戏高效运行,操作化强,人性化强。
(3)、通过编程,使自己掌握C语言编程的基本方法,有独立编程的能力,并学到实战经验。
3. 背景知识(可选项)本程序主要是一个交互式的游戏程序,通过玩家的键盘上下左右键控制贪吃蛇的运动方向。
贪吃蛇小游戏实验报告[
- 0 -软件设计报告设计题目: 贪吃蛇 目录一. 需求分析 二. 概要设计 三. 详细设计四. 心得体会一. 需求分析1.1关于题目 1.1.1题目要求(1)利用MicrosoftVisualC++制作一个贪吃蛇的小游戏, 要求:(2)应用MFC 单文档制作(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 -1.3关于兼容性本程序经过调试, 可以在XP系统下编译运行, 也可以在Vista下运行, 界面稍有不同, 但不影响运行结果。
二. 概要设计2.1软件主要功能设计2.1.1程序结构根据分析, 贪吃蛇这个程序一共要实现如下几个功能, 包括游戏方面开始游戏、停止游戏, 设置游戏级别(速度), 设置图片等。
具体的程序结构如下面的图1-1所示。
- 2 -图2-1 贪吃蛇结构图2.1.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。
贪吃蛇游戏实习报告
实习报告:贪吃蛇游戏开发一、实习背景及目的随着科技的不断发展,计算机软件技术在人们的生活中扮演着越来越重要的角色。
为了提高自己的实际操作能力和对计算机软件技术的理解,我参加了贪吃蛇游戏开发实习项目。
本次实习旨在学习并掌握游戏开发的基本流程,培养自己的创新能力和团队协作精神。
二、实习内容与过程1. 需求分析在开始实习之前,我们首先对贪吃蛇游戏的需求进行了分析。
游戏需要实现基本的功能,如随机生成食物、控制蛇的移动、判断碰撞等。
此外,为了提高游戏的趣味性,我们还增加了如得分、游戏速度、游戏音乐等拓展元素。
2. 总体框架设计根据需求分析,我们制定了贪吃蛇游戏的总体框架。
游戏分为欢迎界面、游戏界面和游戏结束界面,同时设有开始键、暂停键和停止退出的选项。
为了实现双人模式,我们还在游戏中添加了得分和移动速度等拓展功能。
3. 算法学习与实现在实习过程中,我们学习了相关算法,如如何生成食物、蛇的移动、碰撞判断等。
为了实现双人模式,我们还研究了如何处理两个蛇的移动和碰撞。
通过对算法的深入理解,我们成功地将这些功能实现在游戏中。
4. 界面设计与实现为了提高游戏的用户体验,我们精心设计了游戏界面。
界面采用简洁明了的设计风格,方便玩家操作。
同时,我们还为游戏设置了丰富的音效和动画效果,增加了游戏的趣味性。
5. 拓展功能开发在完成基本功能的基础上,我们进一步开发了拓展功能。
如双人模式、得分系统、移动速度等。
这些功能的加入使得游戏更具挑战性和趣味性,让玩家在游戏中不断追求更高的分数。
三、实习收获与反思通过本次实习,我深刻体会到了游戏开发的乐趣和挑战。
在实习过程中,我学到了很多关于游戏开发的知识和技能,如算法实现、界面设计等。
同时,我还培养了团队协作精神和创新意识。
回顾实习过程,我认为自己在某些方面还有待提高。
如在开发过程中,我发现自己在代码组织和优化方面还有很大的提升空间。
此外,在团队协作方面,我也意识到沟通和交流的重要性。
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完成贪吃蛇的可视化显示:首先初始对话框,完成游戏的整体框架的显示。
然后游戏玩家在菜单栏里选择开始,暂停,结束等,控制游戏状态。
游戏开始后,玩家通过键盘上的消息控制蛇的运动。
C#贪吃蛇课程设计报告
基于VC#.NET的贪吃蛇游戏的开发与设计姓名:***学号:************班级:软件081班指导教师:***完成日期:2011-6-24目录1.实验目的 (2)2.实验任务与要求 (2)2.1实验内容 (2)2.2实验要求 (2)2.3实验环境 (2)3.设计方案 (2)3.1程序功能 (2)3.2设计思想 (2)3.3设计总体流程图 (2)3.4设计的具体实现 (3)4.程序测试 (7)4.1测试内容与结果 (7)4.2程序运行效果图 (7)5.实验总结 (9)参考文献 (10)附录 (10)附录A:主要源程序 (10)1.实验目的通过C#课程设计,使学生能将学到的面向对象的程序设计思想应用到具体的工作和学习中,加深对类与对象的理解,要求学生能够对现实生活中许多具体的事物抽象出类,并掌握继承与派生,基类、虚方法和抽象方法和多态性的概念。
通过这次课程设计掌握《C#语言程序设计》的编程思想,为后续课程打下基础。
2.实验任务与要求2.1实验内容编写一个C#GUI版小游戏程序2.2实验要求编写C#语言程序实现贪吃蛇游戏。
一条蛇在密闭的围墙内,在围墙内随机出现多个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,时蛇的身体长一节,同时计1分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
并实现多人一起玩。
2.3实验环境Windows XP, Microsoft Visual Studio 20103.设计方案3.1程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,时蛇的身体长一节,同时计1分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
C语言实现贪吃蛇游戏
C语言实现贪吃蛇游戏贪吃蛇游戏是一款经典的益智休闲游戏,通过控制一条贪吃蛇在游戏画面中不断吃食物,使其身体不断变长的同时避免碰壁或撞到自己以免游戏结束。
本文将使用C语言进行贪吃蛇游戏的实现,并介绍其基本原理和步骤。
首先,我们需要了解贪吃蛇游戏的基本规则。
在游戏开始时,屏幕上会出现一条初始长度为1的贪吃蛇和一个食物。
玩家可以通过按下方向键来控制贪吃蛇的移动方向,当贪吃蛇吃到食物时,其身体长度就会增加,并随机在屏幕上出现一个新的食物。
当贪吃蛇的头部撞到墙壁或撞到自己的身体时,游戏结束。
接下来,我们将介绍如何使用C语言来实现贪吃蛇游戏。
首先,我们需要定义贪吃蛇的数据结构。
我们可以将贪吃蛇的每个身体部分看作一个节点,每个节点包含一个坐标表示位置和一个指针指向下一个节点。
使用链表来表示贪吃蛇的身体可以方便地进行长度的增加和删除操作。
在游戏开始前,我们需要初始化游戏界面和贪吃蛇。
可以使用二维数组来表示游戏界面,其中每个元素代表一个格子。
将贪吃蛇的初始位置(通常位于游戏界面的中心)作为链表的头节点,并将其绘制在游戏界面上。
接下来,我们需要监听玩家的输入,并根据输入来改变贪吃蛇的移动方向。
可以使用C语言中的键盘事件处理函数来实现这一功能,并通过对按键的判断来确定贪吃蛇的新的移动方向。
一旦玩家改变了贪吃蛇的移动方向,我们需要更新贪吃蛇的位置。
贪吃蛇的身体每移动一步,就将链表中的每个节点的坐标改变为前一个节点的坐标。
我们还需要判断贪吃蛇是否吃到了食物。
如果贪吃蛇的头部和食物的坐标相同,就将贪吃蛇的长度增加,并在游戏界面中重新生成一个新的食物。
同时,我们还需要判断贪吃蛇是否碰到了墙壁或撞到了自己的身体。
如果贪吃蛇的头部的坐标超出了游戏界面的范围,或者与贪吃蛇的身体的节点坐标相同,就表示游戏结束。
在游戏进行的过程中,我们需要不断地更新游戏界面,并将贪吃蛇和食物绘制在屏幕上。
可以使用C语言中的绘图函数来实现这一功能。
同时,我们还可以添加一些音效和背景音乐来增强游戏的趣味性。
贪吃蛇实训报告
郑州轻工业学院实训报告实训名称:贪吃蛇指导教师:姓名:学号:班级:提交日期:一.实验目的通过开发一款贪吃蛇游戏程序,熟练掌握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)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
可行性分析:贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。
贪吃蛇实训报告
时间:二O二一年七月二十九日郑州轻产业学院之马矢奏春创作实训陈述实训名称:贪吃蛇指导教师:姓名:学号:班级:提交日期:一.实验目的经由过程开拓一款贪吃蛇游戏程序,闇练掌握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)吃到食物就变成新的蛇体,碰着壁或自身则游戏停止,不然正常运行.可行性阐发:贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的爱好,做一个简单的贪吃蛇小游戏.贪吃蛇的核心算法是若何实现蛇的移动和吃掉落食物后若何变成新的蛇体.没有碰着食物的时刻,把当前运动标的目的上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部布风光重绘出队的节点,这样就可以达到移动的效果.而在吃到食物的时刻,则只需把食物入队即可.实现贪吃蛇的底子的蛇身移动、吃到食物身体增加、和碰着墙壁或自身死亡,能够暂停和开始.玩家可以按照本身的程度选择不合的级别进行游戏寻衅.贪吃蛇游戏中定义如下:1)空白区域(Lawn):定义的区域是贪吃蛇游戏的场地.豆、石头和蛇只能消掉于空白区域的范围之内.按照集团快乐爱好还可以添加布景,修改区域的大小和颜色.2)蛇(Snake):在贪吃蛇游戏中,蛇由若干节组成,个中第一节是蛇头,在蛇头上面定义两个点,作为蛇的眼睛,其余是蛇身.在游戏过程中,有且仅有一条蛇,并且蛇在不断地移动.假如蛇吃了豆,则蛇成长一节.假如蛇头碰着蛇身,蛇去世亡,游戏停止.假如蛇头分隔所定义的区域,则蛇去世亡游戏停止.当蛇头撞到定义的石块上的时刻游戏停止.在定义蛇的时刻可以修改蛇的初始长度,也可以修改蛇的颜色和大小.3)豆(Bean):在贪吃蛇游戏中,豆是蛇的食物.在游戏过程中,有且仅有一颗豆.假如蛇吃了豆,则从新生成一颗豆.豆的消掉是随机性的.4)石块(stone):游戏中石块和豆是同时消掉的,不合的是,豆是随机产生的,而石块是固定的,它的坐标在写代码的时刻就定义好了,不克不及够修改.它的大小和颜色也可以随便的修改.5)菜单(MenuStrip):在贪吃蛇游戏中有游戏菜单,里面有开局、暂停、中断、加速、减速、帮忙等菜单.还有Label控件,显示速度、时间、日期和积分的.五.设计说明Snake的每一节都有地位和大小等属性.而Bean和stone也具有这两个属性.抽象出这三者的合营特色,抽象出一般类Block,用于描述一个块.Block派生出Bean和SnakeBlock两个类,个中SnakeBlock类用于描述蛇的一节.为了使游戏的运行更轻易于掌握,定义Game类用于启动、暂停和中断游戏.按照需求阐发可知,Lawn 仅包含大小和颜色两个属性.为了削减类的数量,可将其大小和颜色等属性添加到Game 类中.综上所述,在贪吃蛇游戏中,有Block (块)、Bean (豆)、SankeBlock (节)、Snake (蛇)、Game (游戏)和MainForm (用户接口)六个类.游戏逻辑构思图如下:游戏的设计如下:从新开局六.源代码using System; using System.Collections.Generic;using ponentModel;游戏菜单 石块速度显示成绩显示级别显示日期及时鲜明示游戏 的定 义区 域 蛇身using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1{publicpartialclassMainForm : Form{int a = 200;//定义初速度为200privateGame game;//DateTime c;public MainForm(){InitializeComponent();game = newGame(lawn.Width, lawn.Height);timer1.Enabled = true;timer1.Interval = a;timer1.Enabled = false;Velocity.Text = a.ToString();}Block是用来组成Bean(豆)和Snake(蛇)还有Stone(石块)的最底子的单位,是Bean和SnakeBlock的基类.Block类的参考代码如下.classBlock{protectedPoint origion; //Block的左上顶点publicconstint WIDTH = 10; //Block的宽度publicconstint HEIGHT = 10; //Block的高度protectedColor color; //Block的颜色public Block(){origion = newPoint(0, 0);color = newColor();}public Block(int x, int y, Color _color){origion = newPoint(x, y);color = _color;}publicPoint Origion{get{return origion;}}publicvoid Display(Graphics g){SolidBrush brush = newSolidBrush(color);g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT);Pen pen = newPen(Color.Black);g.DrawRectangle(pen,newRectangle(origion.X, origion.Y, WIDTH - 1, HEIGHT - 1)); }publicvoid Clear(Graphics g, Color backGroundColor){SolidBrush brush = newSolidBrush(backGroundColor);g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT);}}这是对豆的定义,是由Block派生而来的,在系统开始时,使豆产生,它的消掉地位为随机生成.其代码如下:classBean : Block{publicstaticint f = 0;//吃到豆子的个数public Bean(Color _color){origion = newPoint(0, 0);color = _color;}publicvoid Creat(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight, Snake snake){Clear(g, backGroundColor);bool bGetAPosition = false; //是否找到生成豆的地位Random random = newRandom();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);f++;}newpublicvoid Display(Graphics g){SolidBrush brush = newSolidBrush(color);g.FillRectangle(brush, origion.X, origion.Y, WIDTH, HEIGHT);Pen pen = newPen(Color.Black);g.DrawRectangle(pen, newRectangle(origion.X, origion.Y, WIDTH - 1, HEIGHT - 1));}//Display(g);}SnakeBlock暗示蛇的一节,是由Block派生而来的.它组成蛇身,其代码如下所示:classSnakeBlock : Block{privatebool isHead;publicbool IsHead{get{return isHead;}}public SnakeBlock(int x, int y, Color _color, bool _isHead) {origion = newPoint(x, y);color = _color;isHead = _isHead;}publicvoid ChangeHeadToBody(){if (isHead)isHead = false;}publicvoid Display(Graphics g, Direction direction){base.Display(g);if (isHead){//绘制蛇眼SolidBrush brush = newSolidBrush(Color.Black);switch (direction){caseDirection.Up:caseDirection.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;caseDirection.Left:caseDirection.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;}}}}掌握蛇头运动的标的目的publicenumDirection{Up,Down,Left,Right};对蛇的编码也是由Block派生而来的,在这里面可以定义蛇的颜色和长度.classSnake{publicstaticbool eatebean;privateint length;publicDirection direction;privateColor color;publicList<SnakeBlock> blocks;privateconstint INIT_LENGTH = 10;publicint Length{get{return length;}}public Snake(Color _color, Direction _direction){direction = _direction;color = _color;blocks = newList<SnakeBlock>();}publicvoid Creat(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight){Clear(g, backGroundColor);blocks.Clear();length = INIT_LENGTH;int x;int y;Random random = newRandom();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(newSnakeBlock(x, y, color, true));蛇运动的标的目的掌握switch (direction){caseDirection.Up:for (int i = 1; i < length; i++){blocks.Add(newSnakeBlock(x, y + Block.HEIGHT * i, color, false));}break;caseDirection.Down:for (int i = 1; i < length; i++){blocks.Add(newSnakeBlock(x, y - Block.HEIGHT * i, color, false));}break;caseDirection.Left:for (int i = 1; i < length; i++){blocks.Add(newSnakeBlock(x + Block.WIDTH * i, y, color, false));}break;caseDirection.Right:for (int i = 1; i < length; i++){blocks.Add(newSnakeBlock(x - Block.WIDTH * i, y, color, false));}break;}Display(g);}publicvoid 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, newSnakeBlock(x, y, color, false));length++;}publicvoid Move(){int x = 0;int y = 0;blocks[0].ChangeHeadToBody();switch (direction){caseDirection.Up:x = blocks[0].Origion.X;y = blocks[0].Origion.Y -Block.HEIGHT;break;caseDirection.Down:x = blocks[0].Origion.X;y = blocks[0].Origion.Y +Block.HEIGHT;break;caseDirection.Left:x = blocks[0].Origion.X -Block.WIDTH;y = blocks[0].Origion.Y;break;caseDirection.Right:x = blocks[0].Origion.X +Block.WIDTH;y = blocks[0].Origion.Y;break;}blocks.Insert(0, newSnakeBlock(x, y, color, true));blocks.RemoveAt(blocks.Count - 1);}publicvoid Display(Graphics g){for (int i = 0; i < length; i++){blocks[i].Display(g, direction);}}publicvoid Clear(Graphics g, Color backGroundColor){for (int i = 0; i < length; i++){blocks[i].Clear(g, backGroundColor); }}publicvoid 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;}}石块的定义定义如下,在空白区域中定义一个地位(坐标),使之固定不动,在蛇头撞到这个坐标的时刻,参数传到判断蛇去世活的函数,时蛇去世亡,游戏停止.publicbool MeetStone(Point origion){if ((blocks[0].Origion.X == (origion.X + 40) &&blocks[0].Origion.Y == (origion.Y + 40)) ||(blocks[0].Origion.X == (origion.X + 300) &&blocks[0].Origion.Y == (origion.Y + 80)) || (blocks[0].Origion.X == (origion.X + 150) &&blocks[0].Origion.Y == (origion.Y + 200))||(blocks[0].Origion.X == (origion.X + 100) && blocks[0].Origion.Y == (origion.Y + 400))) returntrue;elsereturnfalse;}当蛇碰着一个豆时,使豆成为蛇体的一部分,其颜色和大小跟蛇一样,蛇身增加.publicbool CanEatBean(Bean bean){if (blocks[0].Origion == bean.Origion)returntrue;elsereturnfalse;}publicint CanEatSnake(){for (int i = 3; i < blocks.Count; i++){if (blocks[0].Origion == blocks[i].Origion)return i;}return 0;}publicvoid EatBean(Bean bean, Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight){bean.Clear(g, backGroundColor);Grow();bean.Creat(g, backGroundColor, lawnWidth, lawnHeight, this);eatebean = true;}publicbool IsAlive(int lawnWidth, int lawnHeight){if (blocks[0].Origion.X < 0)returnfalse;if (blocks[0].Origion.Y < 0)returnfalse;if (blocks[0].Origion.X + Block.WIDTH > lawnWidth) returnfalse;if (blocks[0].Origion.Y + Block.HEIGHT > lawnHeight) returnfalse;elsereturntrue;}}Game掌握游戏的运行,担任在游戏开始时生成Bean、Stone和Snake,以及担任在游戏运行中Snake的移动、Snake的成长、Bean 的更生和石块的分娩.并随时检测Snake的去世活状态.Game类的参考代码如下:classGame{Point origion;publicSnake snake;publicBean bean;publicbool isSnakeAlive;publicint lawnWidth;publicint lawnHeight;public Game(int _lawnWidth, int _lawnHeight){Random random = newRandom();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 = newSnake(Color.Red, direction);bean = newBean(Color.Red);isSnakeAlive = false;lawnWidth = _lawnWidth;lawnHeight = _lawnHeight;}publicvoid 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);游戏中石块的填充,可以按照本身制定的坐标来固定石块,可以修改其颜色.SolidBrush brush = newSolidBrush(Color.DarkViolet); Pen pen = newPen(Color.DarkViolet);g.FillRectangle(brush, origion.X + 40, origion.Y + 40, 10, 10);g.DrawRectangle(pen,newRectangle(origion.X + 40, origion.Y + 40, 10, 10));g.FillRectangle(brush, origion.X + 300, origion.Y + 80, 10, 10);g.DrawRectangle(pen,newRectangle(origion.X + 300, origion.Y + 80, 10, 10)); g.FillRectangle(brush, origion.X + 150, origion.Y + 200, 10, 10);g.DrawRectangle(pen,newRectangle(origion.X + 150, origion.Y + 200, 10, 10));g.FillRectangle(brush, origion.X + 100, origion.Y + 400, 10, 10);g.DrawRectangle(pen,newRectangle(origion.X + 100, origion.Y + 400, 10, 10)); }publicvoid 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);isSnakeAlive = false;MessageBox.Show("就算再饿也不克不及咬本身啊,去世了吧!"); }if (!snake.IsAlive(lawnWidth,lawnHeight)||snake.MeetStone(origion))isSnakeAlive = false;}}}Timer组件用于在用户定义的时间距离激发事宜.在游戏的运行过程中,经由过程时间函数可以判断蛇的去世活,蛇吃豆子的若干.还有日期的显示,时间的显示.统计蛇吃豆子的若干.当吃够规定的豆的时刻,级别增加,游戏的速度增加,蛇运动速度增加.privatevoid timer1_Tick(object sender, EventArgs e) {Date.Text = DateTime.Today.ToLongDateString(); time.Text = DateTime.Now.ToLongTimeString(); Success.Text = (Bean.f *10).ToString();if (Bean.f == 5){jibie.Text = (1 + (Bean.f + 1) %5).ToString();timer1.Enabled = true;timer1.Interval = 100;Velocity.Text = (a + 100).ToString(); }if (Bean.f == 10 ){jibie.Text = (2 + (Bean.f + 1) % 10).ToString();timer1.Enabled = true;timer1.Interval = 80;Velocity.Text = (a + 150).ToString(); }if (Bean.f == 20){jibie.Text = (3 + (Bean.f + 1) % 20).ToString();timer1.Enabled = true;timer1.Interval = 70;Velocity.Text = (a + 200).ToString(); }if (Bean.f == 30){jibie.Text = (3 + (Bean.f + 1) %30).ToString();timer1.Enabled = true;timer1.Interval = 60;Velocity.Text = (a + 250).ToString(); }if (Bean.f == 40){jibie.Text = (3 + (Bean.f + 1) % 40).ToString();timer1.Enabled = true;timer1.Interval = 50;Velocity.Text = (a + 300).ToString(); }if (Bean.f == 50 ){MessageBox.Show("闯关成功!");}判断蛇的去世活if (game.isSnakeAlive){Graphics g;g = lawn.CreateGraphics();game.OnTime(g, lawn.BackColor, lawn.Width, lawn.Height);if (!game.isSnakeAlive){MessageBox.Show("去世翘翘!");jibie.Text = 1.ToString();}}}游戏的开始按钮,游戏开始,对的数据都初始化,个中有timer函数,以及级别,分数都初始化,蛇的运行速度也初始到本来的速度.豆的统计清零.privatevoid 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;Bean.f = 0;timer1.Interval = 200;Velocity.Text = a.ToString();c= DateTime.Now;}privatevoid ToolStripMenuItemPause_Click(object sender, EventArgs e){timer1.Enabled = false;ToolStripMenuItemPause.Enabled = false;ToolStripMenuItemContinue.Enabled = true;}privatevoid ToolStripMenuItemContinue_Click(object sender, EventArgs e){timer1.Enabled = true;ToolStripMenuItemPause.Enabled = true;ToolStripMenuItemContinue.Enabled = false;}KeyDown 事宜.在贪吃蛇游戏中,运用“↑”、“↓”、“←”和“→”四个标的目的键修改蛇的移动标的目的.KeyDown 事宜用于在用户按键时,供应修改蛇移动标的目的的成效.privatevoid MainForm_KeyDown(object sender, KeyEventArgs e) {if (game.snake.direction == Direction.Down|| game.snake.direction == Direction.Up){switch (e.KeyCode){caseKeys.Left:game.snake.direction = Direction.Left;break;caseKeys.Right:game.snake.direction = Direction.Right;break;}}else{switch (e.KeyCode){caseKeys.Up:game.snake.direction = Direction.Up;break;caseKeys.Down:game.snake.direction = Direction.Down;break;}}快捷键成效,在游戏过程中,可以经由过程Space键使游戏暂停.if (e.KeyCode == Keys.Space){this.timer1.Enabled = false;ToolStripMenuItemPause.Enabled = false; ToolStripMenuItemContinue.Enabled = true; }}游戏帮忙按钮,当单击“帮忙”时,系统会弹出一个窗口,显示游戏的弄法.privatevoid ToolStripMenuItemHelp_Click(object sender, EventArgs e){timer1.Enabled = false;ToolStripMenuItemPause.Enabled = false;ToolStripMenuItemContinue.Enabled = true; MessageBox.Show("凹凸旁边键掌握蛇移动的标的目的,引导蛇头去吃豆子,吃一个豆子可以增加蛇的长度,\n当蛇头撞到墙壁上时,或者蛇头咬到蛇尾时,游戏停止.");}游戏的减速,单击时,游戏的Interval会增加20,显示的速度会随之削减50,蛇运动速度减慢.privatevoid ToolStripMenuItemLow_Click(object sender, EventArgs e){timer1.Enabled = true;timer1.Interval += 20;Velocity.Text = (int.Parse(Velocity.Text) - 50).ToString();ToolStripMenuItemPause.Enabled = false;ToolStripMenuItemContinue.Enabled = true;}游戏的加速,单击时,游戏的Interval会削减20,显示的速度会随之增加50,蛇运动的速度加速privatevoid ToolStripMenuItemQuick_Click(object sender,EventArgs e){timer1.Enabled = true;timer1.Interval -= 20;Velocity.Text = (int.Parse(Velocity.Text) + 50).ToString();ToolStripMenuItemPause.Enabled = false;ToolStripMenuItemContinue.Enabled = true;七.测试陈述1)测试用例2)测试过程①、拟定测试筹划.按照游戏的总体情况,仔细阐发游戏各个步调的运行可能消掉的状态,对各类情况进行汇总,然后拟定出一份具体测试步调.②、初步测试.按照拟定好的筹划进行游戏调试,消掉不测情况时及时记录.测试完后对所记录的不测情况进行阐发,然后提出改进的筹划,再进行修改.③、深度测试.对游戏进行最后的修改确认没有马脚后再进行测试,从各个方面进行一次整体的排查,知道不再消掉猜想之外的情况.3)测试成果程序能够正常运行.八.心得体会经由过程此次课程设计,我对游戏编程有了初步熟习,对游戏算法有了必定理解.从游戏的需求阐发,系统设计,再到游戏代码实现每一步都对本身是一个寻衅,当然参考了网上的一些材料,但是真的感到传染到游戏编程的快乐,也进修到很多器械.不知不觉中C#已经伴我们走了半年的时间了,当然在进修的过程中感应很是的难学,都有保持的念头了,但是在此次的实验中我成功的完成了实验,感应有些自满感.也增加了我对C#的好感,我们的教材并没有学完,在大二还要中断进修,在往后的进修中,必定要努力进修这个课程.它可以编写一个小游戏,等学的多了,一些新的游戏本身照样可以编出来,一想到本身可以编程写游戏了,就感应很自满,所以我对未来充满了欲望.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 default switch(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; //初始化时状态变为0score=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++面向对象编程。