贪吃蛇游戏程序的设计说明_第1页
贪吃蛇游戏程序的设计说明_第2页
贪吃蛇游戏程序的设计说明_第3页
贪吃蛇游戏程序的设计说明_第4页
贪吃蛇游戏程序的设计说明_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、测控技术与仪器专业课程设计题单班级 0982011学生某某课程名称课题计算机课程设计贪吃蛇游戏程序设计设计要求1.学习游戏设计有关知识。2.设计贪吃蛇游戏程序。3.调试并修改程序。4.完成课程设计论文。课题发给日期2011年6月25日课程设计完成日期2011年7月09日指导教师余 某 某评语:贪吃蛇游戏学生:某某班级: 0882011指导老师 :余某某摘要 :编写 C 语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜爱的游戏, 一条蛇在密闭的围墙, 在围墙随机出现一个食物, 通过按键盘上的四个光标键控制蛇向上下左右四个方向移动, 蛇头撞到食物, 则表示食物被蛇吃掉,这时蛇的身体长一节,同时计

2、 10 分,接着又出现食物,等待被蛇吃掉, 如果蛇在移动过程中, 撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。作为一个完整的程序, 必须考虑人机交流与用户体验。 游戏的界面不能太丑,更不能连个简单的界面都没有。游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下, 游戏开发者必须最大限度的使游戏美观。游戏的美观是一方面,游戏的在素质是另一方面。一个游戏的优劣,最终由玩家决定。 在游戏与玩家见面之前, 游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。关键词:贪吃蛇流程图c 语言源程序目录1 前言12 课设容32.1课设目的32.2设计功能32.3结构设计73 结论1

3、1参考文献15附录 A161 前言C 语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点, 以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一, 同时被选作目前全世界广泛应用, 同时也是大学生必修的科目。作为一位当代的大学生更要很好的利用它, 学好一门设计语言,实现学以至用。制作 C程序报告,可以巩固和加深自己对 C语言课程的基本知识的理解和掌握,并且能够掌握 C语言编程和程序调试的基本技能。通过游戏程序的设计训练可以提高自己的基本技能, 更好地掌握字符串的表示方法和字符串函数的功能、 Tc 图

4、形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示, 提高自己编程兴趣与编程水平, 学会如何正确的书写程序设计说明文档,提高运用C 语言解决实际问题的能力,巩固 C 语言语法规则的理解和掌握, 学会通过源程序写出流程图,提高自学以及查阅资料的能力。C 语言课程应注重边学边练, 但由于课堂教学和实验的深度和广度有限,练习的深度也受到一定限制。 为了弥补这一点, 学校开设了本课程设计。它比教学实验复杂一些, 涉及的深度广些并更加接近实用。 目的是通过课程设计的综合训练, 培养我们实际分析问题、 编程和动手能力, 最终目标是想通过这种形式, 帮助我们系统地掌握程序设计的主要容, 更好地完成

5、学业。这次课程设计的主要特点如下:1函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2分析函数先从 main() 函数入手。Main() 函数是 C源程序编译时的开始,从 main() 函数开始读函数可将其他函数的功能理解得更透彻。3在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。4我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,起功能我都有所了解。5它独立于具体的 C 语言教科书,重

6、点放在 C 语言的基本特征上, 以不变 应 万变 ,涵盖 C 语言的重要基础知识,让我们熟练掌握 C语言的实际使用。6结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。激发学习兴趣,调动我们主动学习的积极性, 并会根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。7提供综合的课程设计理念,以期进一步锻炼学生的动手能力。同时让同学合作完成这些实验,以便锻炼互相合作精神,培养团队意识。8通过观察网络的实例,循序渐进地启发学生完成设计。课程设计将要求、算法和源程序分开, 为学生创造独立思考的条件。学生在充分理解要求和算法的前提下,设计自己的应用程序。同时我也

7、获得了许多宝贵的经验:1) 在设计程序之前 , 务必要对你所设计的题目和容有一个系统的了解 ,知道所设计的题目和容包含那些资源。2) 设计程序采用什么编程语言并不是非常重要, 关键要有一个清晰的思路和一个完整的软件流程图, 因而,要先把设计原理与思路搞清楚, 再把流程图画出来,这样设计起来就简单多了。3) 在设计程序时 , 不能妄想一次就将整个程序设计好 ,“ 反复修改 , 不断改进”是程序设计的必经之路,发现错误也是取得成绩的一种。4) 要养成注释程序的好习惯 , 一个程序的完美与否不仅仅是实现功能 , 而应该让人一看就能明白你的思路 , 这样也为资料的保存和交流提供了方便。2 课设容2.1

8、 设计目的通过课程设计的综合训练, 培养我们实际分析问题、 编程和动手能力,据课堂讲授容, 学生做相应的自主练习, 消化课堂所讲解的容; 通过调试典型例题或习题积累调试 C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、 用计算机解决实际问题的能力。 最终目标是想通过这种形式,帮助我们系统地掌握程序设计的主要容, 更好地完成学业。2.2 设计功能在这次课射中, 我选择的是贪吃蛇游戏的制作, 游戏是人们生活中不可或缺的 , 一个人从小到大 , 真正伴随他成长的东西 , 游戏占有着很重要的地位 . 不论是一个玩具 , 还是一个能和伙伴一起开心的小游戏 , 都是能给我们留下很多美好的

9、回忆 . 所以不论是什么样的游戏 , 只要它能迎合人们心的某种需求 , 它的市场总会是好的, 而贪吃蛇是一个深受人们喜爱的游戏,一条蛇在密闭的围墙, 在围墙随即出现一个食物, 通过按键上的四个光标键控制向上下左右四个方向移动, 蛇头撞到食物, 则表示食物被吃掉, 这时蛇身体长一节,同时计 10 分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体则游戏结束。本程序运行实现的主要技巧在二维数组的应用上, 程序运行时,游戏界面如下图所示,边框表示围墙,黑色单独方块表示食物:图 2.1 游戏界面2.3 结构设计程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表

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

11、食物的基本数据域 为它 所出 现 的位 置 , 用X 和y 坐 标 表 示, 则 矩 形 块用 函数rectangle(x,y,x+10,y+10)或 rectangle(x,y,x+10,y-10)可以画出。由于每次只出现一个食物, 而食物被吃掉后, 才出现下一个食物, 所以设定yes 表示是否要出现一个食物的变量。蛇的一节身体为一个矩形块,这样表示每个矩形块只需起点坐标x和 y。身体是不断增长的,所以用数组存放每一节的坐标,最大设定为N=200 , node 表示当 前节 数。 另外还 需要 保 存蛇移 动方向 的变 量direction和表示生命的变量life,一但 life为 1,则蛇

12、死,游戏结束。所以程序功能的实现就是数组的操作。#define N 200struct Foodint x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes food ;/*/*判断是否出现食物的变量食物的结构体 */*/struct snakeint xN;int yN;/*/*蛇的横坐标 */蛇的纵坐标 */int nodeint directionint lifesnake ;/*;/*蛇的节数 */*蛇移动方向 */蛇生命, 0 活着, 1 死亡*/2.3.2 main()主函数主函数是程序的主流程, 首先定义使用到的常数、 全局变量及函数原型说明,然后初始化图形系统

13、,调用函数 DrawK() 画出开始画面,调用函数 GamePlay(),即玩游戏的具体过程, 游戏结束后调用 Close() 关闭图形系统,结束程序void main(void)/*主函数 */Init();/*图形驱动 */DrawK();/*开始画面 */GamePlay();/*玩游戏具体过程 */Close();/*图形结束 */void Init(void)/*图形驱动*/int gd=DETECT,gm; initgraph(&gd,&gm,c:tc); /*第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式, 第三个参数指定驱动程序所在目录。 */cleardev

14、ice();2.3.3画界面函数 DrawK ()主界面就是一个密封的围墙, 用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10 个单位的矩形小方块,围成密闭图形 ,表 示围 墙, 为了 醒目 ,设 置淡 青颜 色, 用函 数setlinestyle( SOLD_LINE, 0, THICK_WIDTH 设)置线型宽度为3 个像素。设置 3 个像素的围墙线,蛇在贴墙走的时候,会擦掉部分围墙线,使线变细,图形变得不好看,如果不想这种情况出现,则将线型宽度设置为1 个像素。void DrawK(void)/*开始画面,左上角坐标为(50,40),右下角坐标为( 610,460)的围

15、墙 */setbkcolor(0);/*设置当前背景颜色 */setcolor(YELLOW);/*设置当前画线颜色 */setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型 */for(i=50;i=600;i+=10)/*画围墙 */rectangle(i,40,i+10,49); /*上边 */rectangle(i,451,i+10,460);/*下边 */for(i=40;i0;i-)/*蛇的每个环节往前移动, 贪吃蛇的关键算法 */snake.xi=snake.xi-1;snake.yi=snake.yi-1;switch(snake.dire

16、ction) /*定义 1,2,3,4表示右 , 左 , 上 , 下四个方向 ,通过这个判断来移动蛇头*/case 1:snake.x0+=10;break;case 2: snake.x0-=10;break;case 3: snake.y0-=10;break;case 4: snake.y0+=10;break;for(i=3;isnake.node;i+)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver();/*显示失败 */snake.life=1;break;

17、if(snake.x0595|snake.y0455)/* 蛇是否撞到墙壁 */GameOver();/*本次游戏结束*/snake.life=1; /*蛇死 */if(snake.life=1)/*以上两种判断以后 , 如果蛇死就跳出循环,重新开始 */break;if(snake.x0=food.x&snake.y0=food.y)/*吃到食物以后*/setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.xsnake.node=-20;snake.ysnake.node=-20; /*-2

18、0表示尾巴长一节*/*新的一节先放在看不见的位置, 下次循环就取前一节的位置*/snake.node+;/* food.yes=1;/*蛇的身体长一节 */画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/setcolor(4);for(i=0;isnake.node;i+)/*画出蛇 */rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.xsnake.node-1,snake.ysn

19、ake.node-1, snake.xsnake.node-1+10,snake.ysnake.node-1-10); /*endwhile(! kbhit)*/if(snake.life=1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键 */if(key=ESC)/*按 ESC键退出 */break;elseif(key=UP&snake.direction!=4)/* 判断是否往相反的方向移动*/snake.direction=3;elseif(key=RIGHT&snake.direction!=2)snake.direction=1;elseif(k

20、ey=LEFT&snake.direction!=1)snake.direction=2;elseif(key=DOWN&snake.direction!=3)snake.direction=4;/*endwhile(1)*/2.3.5游戏结束函数 GameOver ()游戏结束,清除屏幕,输出分数,显示游戏结束信息。void GameOver(void)/*游戏结束 */cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,guojian);getch();void PrScore(void)/

21、*输出成绩*/char str10;setfillstyle(SOLID_FILL, WHITE);bar(50,15,200,35);setcolor(6);settextstyle(0,0,2);sprintf(str,score:%d,score);outtextxy(55,20,str);void Close(void)/*图形结束 */getch();closegraph();2.3.6输出分数函数在指定的位置利用PrScore ()sprintf()将整数转换为字符串,用outtextxy()输出, bar ()函数的应用是为了覆盖原来的值。2.3.7图形结束函数 Close ()

22、在显示游戏结束信息的画面时,按任意键关闭图形系统,程序结束。2.3.8系统总体方案介绍贪吃蛇原理:游戏贪吃蛇就是在液晶屏幕上画出蛇,同时随机地给出食物。 游戏者通过键盘操作控制贪吃蛇的移动,去吃食物,吃到后食物消失, 然后再随机给出食物同时蛇的身体增长。 画蛇的原理就是利用人眼的视觉效应先将蛇头向前移动一格,然后所有蛇身依次向前移动一格,最后再擦除蛇尾。这样在人眼看来好像蛇在向前移动。食物的给出,首先需要产生一个随机数,然后通过这个随机数计算得到食物的横纵坐标,在液晶屏上显示出来。控制蛇的移动方向,需要扫描键盘,然后根据键值改变蛇的移动方向。2.3.9游戏流程图图 2.2 游戏流程图3 结论(

23、 1)设计知识点* 采用了数组元素为结构体的数组应用:查找速度快。缺点:大小固定,不适合动态存储,不方便动态添加。* 全局变量的应用:在所有的函数之外定义的变量称为外部变量 ( 或叫做全局变量 ). 其作用围是从变量定义的位置开始 , 直到本源文件的结束。* 按键的处理: 功能键的问题在于, 用户界面并非固定的, 用户功能键的选择将使屏幕画面处于不同的显示状态下。通过这种方式, WIN32有效的组织了不同的窗口,并处理不同窗口情况下的消息。* 图形方式:视频 BIOS(BasicI OSystem基本输入输出系统 ) 是与显示卡配套的一个重要组成部分。 用户通过调用它可以完成一些与显示有关的控

24、制功能。对于要用到显示系统的一般程序设计都可以通过调用视频BIOs 或视频函数库来完成。 但要想获得更高性能的显示程序,还需要在 C中对显示卡的寄存器和显示存直接进行编程。( 2)程序的特点* 设计中步奏鲜明,结构紧密,段落间衔接良好,语句简单易懂。* 游戏操作简单,并富有趣味性,有商业价值。* 个人感觉在增加 delay () 函数可以提高游戏速度增加趣味性 .通过游戏程序的设计训练可以提高自己的基本技能,更好地掌握字符串的表示方法和字符串函数的功能、Tc 图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高自己编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用

25、C 语言解决实际问题的能力,巩固 C 语言语法规则的理解和掌握, 学会通过源程序写出流程图,提高自学以及查阅资料的能力。回顾起此次课程设计,至今我仍感慨颇多,从理论到实践, 在整整两个星期的日子里, 我学到很多很多的东西, 不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的容。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的, 只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识, 才能提高自己的实际动手能力和独立思考的能力。在设计的过程遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,

26、掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识,并在网友和老师的指导下, 终将此程序设计出来。尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的, 在他人的基础上, 再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。总之,这次设计程序让我受益良多, 感悟很深,真心感老师给予的这次机会。参考文献1云鹤,董金祥计算机图形学原理、方法及应用M :高等教育, 20032家广 . 计算机图形学(第三版)M.:清华大学 ,20043元琰计算机图形学实用技术M :科学,

27、20004 和青芳计算机图形学原理及算法教程M :清华大学5陆润民 .C 语言绘图教程 M. :清华大学, 1996附录#define N 200#include #include #include #define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分 */int gamespeed=50000;/* 游戏速度自己调整 */ struct Food int x;/*食物的横坐标 */int y;/*食物的纵坐标

28、 */int yes;/*判断是否要出现食物的变量*/food;/*食物的结构体 */struct Snakeint xN;int yN;int node;/* int direction;/* int life;/*蛇的节数 */蛇移动方向 */蛇的生命 ,0 活着 ,1死亡 */snake;void Init(void);/*图形驱动 */void Close(void);/*图形结束 */void DrawK(void);/*开始画面 */void GameOver(void);/*结束游戏 */void GamePlay(void);/*玩游戏具体过程*/void PrScore(vo

29、id);/*输出成绩 */* 主函数 */void main(void)Init();/*图形驱动 */DrawK();/*开始画面 */GamePlay();/*玩游戏具体过程*/Close();/*图形结束 */* 图形驱动 */void Init(void)int gd=DETECT,gm;initgraph(&gd,&gm,c:tc);cleardevice();void DrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*for(i=50;i=600;i

30、+=10)/*画围墙 */设置线型 */rectangle(i,40,i+10,49); /*上边 */rectangle(i,451,i+10,460);/*下边 */for(i=40;i0;i-)/*是贪吃蛇的关键算法 */蛇的每个环节往前移动, 也就snake.xi=snake.xi-1;snake.yi=snake.yi-1;/*1,2,3,4表示右 , 左, 上, 下四个方向 , 通过这个判断来移动蛇头*/switch(snake.direction)case 1:snake.x0+=10;break;case 2: snake.x0-=10;break;case 3: snake.y0-=10;break;case 4: snake.y0+=10;break;for(i=3;isnake.node;i+)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver();/*显示失

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论