急需设计蛇的实验报告。
标题:贪吃蛇游戏编程指南
学生姓名:学号:200910801001。
学校(系):计算机学院
专业:计算机科学与技术
班级级别:2009级1班
指导教师:何职称:讲师
六月2010
目录
摘要6
1,设计要求。
2.使用的仪器和设备
3.具体设计流程8。
3.1,程序功能。
3.2设计理念
3.3.设计的具体实现8。
3.4总体流程图.......................................14
3.5.编程和注释......................................................................................................................................................................
3.6调试问题及解决方案21
3.7调试结果22。
4.设计经验..........................................................................................................................................................................
5.参考............................26
摘要
写一个C语言程序实现吃蛇游戏。吃蛇游戏是一种受欢迎的游戏。一条蛇随机出现在一堵封闭的墙上。通过按下键盘上的四个光标键,控制蛇上下左右移动。蛇头碰到食物,说明食物被蛇吃了。这时候蛇的身体长了,算起来10分。然后食物出现了,等着被蛇吃掉。作为一个完整的程序,尤其是一个完整的游戏,人机交流和用户体验是必须要考虑的。游戏的界面不应该太难看,更不用说没有简单的界面。游戏应该有一个漂亮的界面。有了必要的硬件支持和软件支持,游戏开发者必须把游戏做得尽可能漂亮。游戏的美好是一方面,游戏的内在品质是另一方面。一款游戏的好坏,最终还是由玩家决定的。在游戏与玩家见面之前,游戏开发者要设计一个允许玩家参与的游戏模式,并在一定的游戏规则下进行。
蛇流程图;C语言源程序turbo C
贪吃蛇游戏的编程
1,设计要求
通过游戏编程,可以提高自己的编程兴趣和思维,巩固C语言所学知识,合理利用材料,实现理论与实践的结合。
(1).收集数据,分析题目,分解问题,形成整体设计思路;
(2)透彻分析各种小问题,列出提纲,写出各部分的程序模块;
(3).对于设计中用到的关键功能,要学会通过查资料了解其用法,结合问题详细介绍;
(4).在电脑上调试,检查错误,逐步分析不能正常运行的原因,确保设计的程序正确,能够正常运行;
(5).完成课程设计报告并答辩。
c语言是一种易学易懂的通用编程语言。由于其强大的功能性、简单的应用性、灵活性以及兼有高级和低级语言的优点,以及“目标程序效率高”、可移植性和在各种系统上通用实现的特点,它已成为当今世界主流编程语言之一,并被选为大学生广泛使用的必修科目。作为当代大学生,要好好利用,学好一门设计语言,实现学以致用。
做一份C程序报告,可以巩固和加深你对C语言课程基础知识的理解和掌握,掌握C语言编程和程序调试的基本技能。
通过游戏程序设计的训练,可以提高自己的基本功,更好地掌握字符串的表示方法和字符串函数的作用,Tc图形操作的基础知识,键盘上特殊键的获取和图形模式下光标的显示,提高自己的编程兴趣和水平,学会如何正确编写编程指令,提高自己运用C语言解决实际问题的能力, 巩固对C语言语法规则的理解和掌握,学会通过源程序编写流程图,提高自学和参考资料的能力。
2、使用的仪器设备
1,能正常工作的电脑;2、WindowsXP
3.TC计划;4、微软Word2003
3、具体的设计过程
3.1,程序功能
贪吃蛇游戏是一款经典的小游戏。一条蛇在封闭的墙壁里,一种食物随机出现在墙壁里。通过按键盘上的四个光标键,控制蛇上下左右移动。如果蛇头击倒食物,食物就会被吃掉,蛇的身体会增长10点,然后食物就会出现,等着蛇来吃。如果蛇在运动过程中撞到墙壁或穿过身体,游戏就结束了。
3.2设计理念
程序的关键在于代表蛇的图形和蛇的运动。一个小矩形用来快速表示蛇身体的一部分。对于身体的每个部分,添加一个矩形块,蛇头用两个部分表示。移动的时候一定要从蛇头开始,这样蛇就不能反方向移动了。如果不按任何键,蛇会自己朝当前方向前进,但按下有效方向键后,蛇的头部会朝这个方向移动,一次移动一个身体。所以按下有效方向键后,会先确定蛇头的位置,然后蛇身会随着蛇头移动。图形的实现是从蛇头的新位置开始画蛇。此时由于屏幕不清晰,原。食物的出现和消失也是画矩形块,覆盖矩形块。为了便于理解,定义了两个结构:食物和蛇。
3.3.设计的具体实现
(1)函数定义
函数定义是每个基本函数的定义,设置了方便调用需要用到的信息。
#定义N 200
# include & ltgraphics.h & gt/*图形头文件*/
# include & ltstdlib.h & gt/*包含rand */等函数
# include & ltdos.h & gt/*包含bios函数*/
# define Left 0x4b 00/*左光标值*/
# define Right 0x4d 00/*右光标值*/
#定义光标下的向下0x5000/*键值*/
#在游标上定义UP 0x4800/*键值*/
#定义ESC 0x 011b/* ESC的ASCII码*/
int i,key/*图形坐标变量和关键变量*/
int得分= 0;/*分数*/
int gamespeed = 10000;/*自己调整游戏速度*/
结构食品
{
int x;/*食物横坐标*/
int y;/*食物的纵坐标*/
int yes/*判断食物的变量是否会出现*/
}食物;/*食物的结构*/
结构蛇
{
int x[];/*蛇的横坐标*/
int y[];/*蛇的纵坐标*/
int节点;/*蛇的结数*/
int方向;/*蛇的移动方向*/
int life/*蛇的命,0是活的,1是死的*/
}蛇;
void Init(void);/*图形驱动程序*/
void Close(无效);/*图表结束*/
void DrawK(无效);/*绘制接口函数*/
void game over(void);/*结束游戏*/
void玩法(void);/*玩游戏的具体流程*/
void PrScore(void);/*输出结果*/
Void main(void)/* main函数*/
(2)主函数main()
主函数是程序的主流程。首先定义使用的常量、全局变量和函数原型描述,然后初始化图形系统,调用函数DrawK()绘制开始屏幕,调用函数GamePlay(),也就是玩游戏的具体过程。游戏结束后,调用Close()关闭图形系统,结束程序。
Void main(void)/* main函数*/
{
init();/*图形驱动程序*/
DrawK();/*开始屏幕*/
游戏性();/*玩游戏的具体流程*/
close();/*图表结束*/
}
Void Init(void)/*图形驱动程序*/
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");/*第一个参数表示图形适配器的类型,第二个是该类型下图形的显示方式,第三个参数指定驱动所在的目录。*/
clear device();
}
(3)绘制接口函数DrawK()
主界面是一个封闭的栅栏,使用两个loop语句输出水平和垂直方向宽度和高度一致的连续矩形方块,表示栅栏,设置为白色以便醒目。
Void draw (void)/*开始屏幕,左上角坐标为(50,40),右下角坐标为(610,460 */
{
setbkcolor(0);/*设置当前背景颜色*/
setcolor(黄色);/*设置当前画线颜色*/
setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*设置线型*/
for(I = 50;我& lt=600;I+=10)/*画一个栅栏*/
{
矩形(I,40,i+10,49);/*高于*/
矩形(I,451,i+10,460);/*低于*/
}
for(I = 40;我& lt=450;i+=10)
{
矩形(50,I,59,I+10);/*左*/
矩形(601,I,610,I+10);/*右*/
}
}
(4)游戏具体流程功能玩法()
这是游戏的主要部分。他将前一部分的坐标分配给后一部分,并删除最后一部分的背景色。当蛇头的坐标和食物的坐标相等时,说明食物已经被吃掉了。
Void游戏玩法(void)/*玩游戏的具体流程*/
{
randomize();/*随机数生成器*/
food . yes = 1;/*1表示新的食物需要出现,0表示食物已经存在*/
snake . life = 0;/*活着*/
snake . direction = 1;/*向右方向*/
snake . x[0]= 100;snake . y[0]= 100;/*蛇头*/
snake . x[1]= 110;snake . y[1]= 100;/*第二节蛇*/
snake . node = 2;/*节数*/
PrScore();/*输出分数*/
而(1)/*可以反复玩游戏,按ESC结束*/
{
而(!Khit ())/*蛇在不按键的情况下自行移动*/
{
If(food.yes==1)/*需要新的食物*/
{
food . x = rand()% 400+60;
food . y = rand()% 350+60;
而(food.x%10!=0)/*食物随机出现后,食物必须在整个格子里,蛇才能吃*/
food . x++;
而(food.y%10!=0)
food . y++;
food . yes = 0;/*屏幕上有食物*/
}
If(food.yes==0)/*如果屏幕上有食物,就会显示出来*/
{
setcolor(绿色);/*食物的颜色*/
矩形(food.x,food.y,food.x+10,food . y-10);
}
for(I = snake . node-1;我& gt0;I-)/*蛇的每一个环节向前推进,蛇的关键算法*/
{
snake . x[I]= snake . x[I-1];
snake . y[I]= snake . y[I-1];
}
Switch(snake.direction) /*定义1,2,3,4为左右上下方向,通过这个判断移动蛇头*/
{
case 1:snake . x[0]+= 10;打破;
案例二:snake . x[0]-= 10;打破;
案例三:snake . y[0]-= 10;打破;
案例四:snake . y[0]+= 10;打破;
}
for(I = 3;我& ltsnake .节点;I++)/*从蛇的第四节判断自己是不是打中了自己,因为蛇头有两节,第三节是不可能转身的*/
{
if(snake . x[I]= = snake . x[0]& amp;& ampsnake.y[i]==snake.y[0])
{
game over();/*显示失败*/
snake . life = 1;
打破;
}
}
if(snake . x[0]& lt;55 | | snake . x[0]& gt;595 | | snake . y[0]& lt;55 | | snake . y[0]& gt;455)/*蛇有没有撞到墙上*/
{
game over();/*这个游戏结束了*/
snake . life = 1;/*蛇死*/
}
If(snake.life==1)/*以上两个判断后,如果蛇死了,跳出内循环重新开始*/
打破;
if(snake . x[0]= = food . x & amp;& ampSnake.y[0]==food.y)/*吃完食物*/
{
set color(0);/*从图片中移除食物*/
矩形(food.x,food.y,food.x+10,food . y-10);
snake . x[snake . node]=-20;snake . y[snake . node]=-20;/*-20表示尾巴长*/
/*先把新段放到看不见的地方,在下一个循环中取前一段的位置*/
snake . node++;/*蛇的身体有很长的一段*/
food . yes = 1;/*新食物需要出现在屏幕上*/
得分+= 10;
PrScore();/*输出新分数*/
}
set color(4);
for(I = 0;我& ltsnake .节点;I++)/*画一条蛇*/
矩形(snake.x[i],snake.y[i],snake.x[i]+10,
snake . y[I]-10);
延迟(gamespeed);
set color(0);/*用黑色去掉蛇的最后一段*/
矩形(snake.x[snake.node-1],snake.y[snake.node-1],
snake . x[snake . node-1]+10,snake . y[snake . node-1]-10);
} /*endwhile(!kbhit)*/
If(snake.life==1)/*如果蛇死了,跳出循环*/
打破;
key = BIOS key(0);/*接收按钮*/
If(key==ESC)/*按ESC退出*/
打破;
其他
if(key = = UP & amp;& amp蛇,方向!=4)
/*判断是否向相反方向移动*/
snake . direction = 3;
其他
if(key = = RIGHT & amp;& amp蛇,方向!=2)
snake . direction = 1;
其他
if(key = = LEFT & amp;& amp蛇,方向!=1)
snake . direction = 2;
其他
if(key = = DOWN & amp;& amp蛇,方向!=3)
snake . direction = 4;
}/*endwhile(1)*/
}
(5) GameOver函数()
游戏结束后,清空屏幕,输出比分,显示游戏结束信息。
Void GameOver(void)/* Game over */
{
clear device();
PrScore();
setcolor(红色);
settextstyle(0,0,4);
outtextxy(200,200,“郭健”);
getch();
}
Void PrScore(void)/*输出分数*/
{
char str[10];
setfillstyle(SOLID_FILL,白色);
吧(50,15,200,35);
set color(6);
settextstyle(0,0,2);
sprintf(str," score:%d ",score);
outtextxy(55,20,str);
}
Void Close(void)/*图形结束*/
{
getch();
closegraph();
}
3.4总体流程图
}
3.5、程序代码编写和注释
#定义N 200
# include & ltgraphics.h & gt
# include & ltstdlib.h & gt
# include & ltdos.h & gt
#定义左0x4b00
#定义右0x4d00
#向下定义0x5000
#定义高达0x4800
#定义ESC 0x011b
int i,key
int得分= 0;/*分数*/
int gamespeed = 50000/*自己调整游戏速度*/
结构食品
{
int x;/*食物横坐标*/
int y;/*食物的纵坐标*/
int yes/*判断食物的变量是否会出现*/
}食物;/*食物的结构*/
结构蛇
{
int x[N];
int y[N];
int节点;/*蛇的结数*/
int方向;/*蛇的移动方向*/
int life/*蛇的命,0是活的,1是死的*/
}蛇;
void Init(void);/*图形驱动程序*/
void Close(无效);/*图表结束*/
void DrawK(无效);/*开始屏幕*/
void game over(void);/*结束游戏*/
void玩法(void);/*玩游戏的具体流程*/
void PrScore(void);/*输出结果*/
/*主函数*/
无效总管(无效)
{
init();/*图形驱动程序*/
DrawK();/*开始屏幕*/
游戏性();/*玩游戏的具体流程*/
close();/*图表结束*/
}
/*图形驱动程序*/
void初始化(void)
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");
clear device();
}
/*开始屏幕,左上角坐标为(50,40),右下角坐标为(610,460 */
void DrawK(无效)
{
/*setbkcolor(浅绿色);*/
set color(11);
setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*设置线型*/
for(I = 50;我& lt=600;I+=10)/*画一个栅栏*/
{
矩形(I,40,i+10,49);/*高于*/
矩形(I,451,i+10,460);/*低于*/
}
for(I = 40;我& lt=450;i+=10)
{
矩形(50,I,59,I+10);/*左*/
矩形(601,I,610,I+10);/*右*/
}
}
/*玩游戏的具体流程*/
无效游戏(void)
{
randomize();/*随机数生成器*/
food . yes = 1;/*1表示新的食物需要出现,0表示食物已经存在*/
snake . life = 0;/*活着*/
snake . direction = 1;/*向右方向*/
snake . x[0]= 100;snake . y[0]= 100;/*蛇头*/
snake . x[1]= 110;snake . y[1]= 100;
snake . node = 2;/*节数*/
PrScore();/*输出分数*/
而(1)/*可以反复玩游戏,按ESC结束*/
{
而(!Khit ())/*蛇在不按键的情况下自行移动*/
{
If(food.yes==1)/*需要新的食物*/
{
food . x = rand()% 400+60;
food . y = rand()% 350+60;
而(food.x%10!=0)/*食物随机出现后,食物必须在整个格子里,蛇才能吃*/
food . x++;
而(food.y%10!=0)
food . y++;
food . yes = 0;/*屏幕上有食物*/
}
If(food.yes==0)/*如果屏幕上有食物,就会显示出来*/
{
setcolor(绿色);
矩形(food.x,food.y,food.x+10,food . y-10);
}
for(I = snake . node-1;我& gt0;I-)/*蛇的每一个环节都向前移动,这是蛇的关键算法*/
{
snake . x[I]= snake . x[I-1];
snake . y[I]= snake . y[I-1];
}
/*1,2,3,4表示右,左,上,下,这个判断可以移动蛇头*/
开关(蛇形方向)
{
case 1:snake . x[0]+= 10;打破;
案例二:snake . x[0]-= 10;打破;
案例三:snake . y[0]-= 10;打破;
案例四:snake . y[0]+= 10;打破;
}
for(I = 3;我& ltsnake .节点;I++)/*从蛇的第四节判断自己是不是打中了自己,因为蛇头有两节,第三节是不可能转身的*/
{
if(snake . x[I]= = snake . x[0]& amp;& ampsnake.y[i]==snake.y[0])
{
game over();/*显示失败*/
snake . life = 1;
打破;
}
}
if(snake . x[0]& lt;55 | | snake . x[0]& gt;595 | | snake . y[0]& lt;55||
snake . y[0]& gt;455)/*蛇有没有撞到墙上*/
{
game over();/*这个游戏结束了*/
snake . life = 1;/*蛇死*/
}
If(snake.life==1)/*以上两个判断后,如果蛇死了,跳出内循环重新开始*/
打破;
if(snake . x[0]= = food . x & amp;& ampSnake.y[0]==food.y)/*吃完食物*/
{
set color(0);/*从图片中移除食物*/
矩形(food.x,food.y,food.x+10,food . y-10);
snake . x[snake . node]=-20;snake . y[snake . node]=-20;
/*先把新段放到看不见的地方,在下一个循环中取前一段的位置*/
snake . node++;/*蛇的身体有很长的一段*/
food . yes = 1;/*新食物需要出现在屏幕上*/
得分+= 10;
PrScore();/*输出新分数*/
}
set color(4);/*画一条蛇*/
for(I = 0;我& ltsnake .节点;i++)
矩形(snake.x[i],snake.y[i],snake.x[i]+10,
snake . y[I]-10);
延迟(gamespeed);
set color(0);/*用黑色去掉蛇的最后一段*/
矩形(snake.x[snake.node-1],snake.y[snake.node-1],
snake . x[snake . node-1]+10,snake . y[snake . node-1]-10);
} /*endwhile(!kbhit)*/
If(snake.life==1)/*如果蛇死了,跳出循环*/
打破;
key = BIOS key(0);/*接收按钮*/
If(key==ESC)/*按ESC退出*/
打破;
其他
if(key = = UP & amp;& amp蛇,方向!=4)
/*判断是否向相反方向移动*/
snake . direction = 3;
其他
if(key = = RIGHT & amp;& amp蛇,方向!=2)
snake . direction = 1;
其他
if(key = = LEFT & amp;& amp蛇,方向!=1)
snake . direction = 2;
其他
if(key = = DOWN & amp;& amp蛇,方向!=3)
snake . direction = 4;
}/*endwhile(1)*/
}
/*游戏结束*/
3.6调试问题及解决方案
将修改后的程序复制到Turbo C时,软件会因为内容太多而向右移动,使得大部分内容无法复制到Turbo C的界面,最终软件无法运行。解决方法:改程序的时候要设置好格式,注意左对齐,同时一行语句尽量短,最好一个语句占一行。
程序输入到TC中,编译运行源程序,发现程序中有很多错误,如下图所示:
你可以根据程序运行的错误提示修改原程序,有时候在调试过程中会遇到你不懂的问题。我去图书馆或者上网查阅了一些资料或者找老师解决了一个个修改源程序的问题,直到运行成功。
3.7调试结果
1.下图显示了程序调试和编译的结果:
下图是程序的调试结果(也就是贪吃蛇游戏界面)。
4设计经验
经过短短两周的计算机软件技术实践,我对C程序有了更深的理解。以前觉得C语言很无聊,觉得我们设计的程序没用,但是现在通过设计贪吃蛇游戏,我知道了如何把学到的东西运用到生活中。虽然刚开始设计这个程序的时候不太懂怎么设计,但是看了《C语言课程设计案例集》,用C语言做了这个贪吃蛇程序之后,深深感受到了C程序的神奇。
在设计这个程序时,我主要学习了如何使用以下关于C语言的知识。
1)顾名思义,定义函数非常重要。它有助于读者正确理解节目。
很重要的一点,在修改这个程序的过程中,我们可以快速找到程序各个模块的功能,大大增加。
增加了程序的可读性。
2)分析函数从main()函数开始。Main()函数是编译C源程序的开始。
从main()函数开始,可以更透彻地理解其他函数的作用。
3)做程序时,先列出框架,分析这个程序要达到的目的(功能)。
以后选择正确的数据结构,然后模块化程序,按模块写函数,就更简单合理了。
4)我也学到了很多关于库函数的作用,比如很多对字符串执行的字符串函数。
我知道所有的功能和作用。
同时,我也获得了许多宝贵的经验:
1)在设计一个程序之前,你必须对你所设计的题目和内容有一个系统的了解。
知道设计的题目和内容包括哪些资源。
2)用什么编程语言设计程序并不是很重要。关键是要有一个清晰的思路。
而一个完整的软件流程图,因此,先明确设计原则和思路,再画流程图,设计起来就容易多了。
3)设计程序的时候,不能指望一下子就把整个程序设计好,“反复修改,不断变化。”
进步是程序设计的必经之路,发现错误也是一种成就。
4)养成注释程序的好习惯,程序的完善不仅仅是实现功能,更重要的是
人们应该一眼就能明白你的想法,这也为信息的保存和交流提供了便利。
5.参考
1.郭,C语言课程设计案例精选,中国水利水电出版社,2004年3月。
2徐金吾、杨德彬等。,TURBO C实用百科,机械工程出版社,1996.5。
3李丽娟《C语言程序设计教程》人民邮电出版社
4林华聪《C语言程序设计的思想与实践》冶金工业出版社
5张基温《C语言程序设计教程》高等教育出版社
6潘云鹤,董金祥,等.计算机图形学-原理,方法与应用。北京:高等教育出版社,2003+02。
7孙等,计算机图形学(第3版),清华大学出版社,2004。
陈。计算机图形学实用技术。北京科学出版社2000。
9何著。计算机图形学原理与算法课程。北京:清华大学出版社。
10卢润民。c语言绘图课程。北京:清华大学出版社,1996。