C语言程序课程设计实验报告.docx
《C语言程序课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序课程设计实验报告.docx(21页珍藏版)》请在冰点文库上搜索。
C语言程序课程设计实验报告
实训一贪吃蛇游戏
一、实训目的和要求
根据老师布置的任务,对项目进行需求分析;确定数据结构和算法;画流程图或N-S图并形成相关文档。
根据算法编写程序并且调试程序直到程序通过。
本程序实现的主要技巧在二维数组的应用上。
目的是通过游戏程序增加编程的兴趣,提高编程水平。
二、主要仪器设备
安装了Windows操作系统、TurboC或VisualC++的计算机。
三、实训内容和原理
贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
四、实训小结
1、功能描述
2、总体设计
(1)功能模块设计
图形驱动功能模块:
图形结束功能模块:
开始画面模块:
游戏过程模块:
(a)食物出现:
初始化界面及蛇的出现
非
是
(b)蛇的自增及死亡:
条件一:
撞到自己条件二:
撞到墙
是
非
非
输出成绩模块:
(2)数据结构设计
structFood
{
intx;
inty;
intyes;
}food;
x表示食物的横坐标;
y表示食物的纵坐标;
yes用来判断是否要出现食物。
structSnake
{
intx[N];
inty[N];
intnode;
intdirection;
intlife;
}snake;
node表示蛇的节数;direction表示蛇移动方向
life表示蛇的生命,其中0活着,1死亡
(3)函数功能描述
1)函数名称:
Init
函数原型:
voidInit(void);
函数实现的的功能:
图形驱动
2)函数名称:
Close
函数原型:
voidClose(void)
函数实现的的功能:
图形结束
3)函数名称:
DrawK
函数原型:
voidDrawK(void);
函数实现的的功能:
开始画面
4)函数名称:
Gameplay
函数原型:
voidGamePlay(void)
函数实现的的功能:
游戏的具体过程
5)函数名称:
Gameover
函数原型:
voidGameOver(void);
函数实现的的功能:
游戏结束
6)函数名称:
prScore
函数原型:
voidPrScore(void)
函数实现的的功能:
输出成绩
3、程序实现
(1)源码分析
#defineN200
#include
#include
#include//里面包含了很多BIOS和DOS调用函数
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000//
#defineUP0x4800
#defineESC0x011b
inti,key;
intscore=0;/*得分*/
intgamespeed=50000;/*游戏速度自己调整*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDrawK(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;/*initgraph(&gd,&gm,"c:
\\tc");*/
initgraph(&gd,&gm,"D:
\ProgramFiles\WINYES\TC20H");
//可以更换TC的位置,initgraph表示图形模式的初始化
DETECT系统自动检测图形适配器的最高分辩率模式,并装入相应的图形驱动程序
cleardevice();//清除图形屏幕
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
{
/*setbkcolor(LIGHTGREEN);*///设置背景色
setcolor(11);//设置前景色
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
*/voidfarsetlinestyle(intlinestyle,unsignedpattern,intwidth);
for(i=50;i<=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49);/*上边*///画矩形
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
voidGamePlay(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();/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
//kbhit()检查当前是否有键盘输入,若有,则输入一个非0的数;否则返回哦;
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
//构造函数Rectangle(intx,inty,intwidth,intheight)
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];//从最后一个往前移
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
for(i=3;i第三节不可能拐过来*/
{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;//死亡
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{GameOver();/*本次游戏结束*/
snake.life=1;/*蛇死*/}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(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;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}setcolor(4);/*画出蛇*/
for(i=0;irectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(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)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UP&&snake.direction!
=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!
=2)snake.direction=1;
else
if(key==LEFT&&snake.direction!
=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!
=3)
snake.direction=4;
}/*endwhile
(1)*/
}
/*游戏结束*/
voidGameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);//设置字符的显示风格
outtextxy(200,200,"GAMEOVER");//在当前位置输出一个文本字符串
getch();
}
/*输出成绩*/
voidPrScore(void)
{charstr[10];
setfillstyle(SOLID_FILL,YELLOW);//设置当前填充模式和填充颜色
bar(50,15,220,35);//画一个二为条形图
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:
%d",score);
outtextxy(55,20,str);
}
/*图形结束*/
voidClose(void)
{getch();
closegraph();}
(2)运行结果
实训二学生成绩管理系统
一、实训目的和要求
利用单链表结构实现学生成绩管理,了解数据库管理的基本功能,掌握C语言中的结构体、指针、函数、文件操作等知识,是一个C语言知识的综合应用。
注意其中的难点,指针变量作函数参数、函数值为指向结构体的指针及单链表机构的应用等知识。
二、主要仪器设备
安装了Windows操作系统、TurboC或VisualC++的计算机。
三、实训内容和原理
设计一个学生成绩管理系统,该系统使用单链表结构管理学生成绩,具有输入记录、查询记录、更新记录、统计记录及输出记录等功能。
四、实训小结
1、功能描述
2、总体设计
(1)功能模块设计
(2)数据结构设计
(3)函数功能描述
3、程序实现
(1)源码分析
(2)运行结果