C语言实训小球碰撞游戏.doc_第1页
C语言实训小球碰撞游戏.doc_第2页
C语言实训小球碰撞游戏.doc_第3页
C语言实训小球碰撞游戏.doc_第4页
C语言实训小球碰撞游戏.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

小球碰撞游戏程序的运行与调试一、 实训目的通过本实例,主要目的是让学生掌握以下知识点:1、在C语言中如何绘制常见图形,绘图函数的使用。2、如何实现图形动画。3、如何处理按键响应。4、游戏算法的实现。二、 功能描述本程序实现的游戏规则如下:游戏者通过键盘上的LEFT键和RIGH键控制屏幕下方的一个黄色矩形框左右移动,拦截向下运动的小球,小球碰到矩形上边的不同部位,会以不同的角度反弹。运动的小球碰到上边缘、左边缘、右边缘、和9个固定位置的小球都会发生碰撞反弹。如果运动的小球将屏幕上9个固定位置的小球全部打掉,则玩家获胜;如果小球掉出下边缘,则玩家失败,游戏结束。三、 编程参考1、 程序中使用的库函数说明(1) 图形模式的初始化与退出在未设置图形模式之前, 微机系统默认屏幕为文本模式(80列, 25行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形模式, 可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode, char *path);其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所在的目录路径。图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI,所以 PATH对应的实参应为文件EGAVGA.BGI的实际路径名。void far closegraph(void);该函数用于退出图形状态进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。(2) 屏幕颜色的设置和清屏函数 对于图形模式的屏幕颜色设置, 同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数。 设置背景色: void far setbkcolor( int color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值, 对EGA, VGA显示器适配器, 有关颜色的符号常数及数值见下表所示。 有关屏幕颜色的符号常数表 符号常数 数值 含义 符号常数 数值 含义 BLACK 0 黑色 DARKGRAY 8 深灰 BLUE 1 兰色 LIGHTBLUE 9 深兰 GREEN 2 绿色 LIGHTGREEN 10淡绿 CYAN 3 青色 LIGHTCYAN 11 淡青 RED 4 红色 LIGHTRED 12 淡红 MAGENTA5 洋红 LIGHTMAGENTA 13 淡洋红 BROWN 6 棕色 YELLOW 14 黄色 LIGHTGRAY7淡灰 WHITE 15 白色清除图形屏幕内容使用清屏函数, 其调用格式如下: voide far cleardevice(void);有关颜色设置请参照上表。(3) 基本图形函数 基本图形函数包括画点, 线以及其它一些基本图形的函数。(a) 画点函数 void far putpixel(int x, int y, int color);该函数表示有指定的象元画一个按color所确定颜色的点。x, y是指图形象元的坐标。 (b) 画线函数TURBO C提供了一系列画线&函数, 下面分别叙述void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x, int y);画一作从现行游标到点(x, y)的直线。void far linerel(int dx, int dy);画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius);以(x, y)为圆心, radius为半径, 画一个圆。void far arc(int x, int y, int stangle, int endangle, int radius);以(x, y)为圆心, radius为半径, 从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0度, 逆时针方向旋转一周, 依次为90, 180, 270和360度(其它有关&函数也按此规定, 不再重述)。void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);以(x, y)为中心, xradius, yradius为x轴和y轴半径, 从角stangle 开始到endangle结束画一段椭圆线, 当stangle=0, endangle=360时, 画出一个完整的椭圆。 void far rectangle(int x1, int y1, int x2, inty2);以(x1, y1)为左上角, (x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints);画一个顶点数为numpoints, 各顶点坐标由polypoints 给出的多边形。polypoints整型数组必须至少有2倍顶点数个无素。每一个顶点的坐标都定义为x, y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际多边形的顶点数加一, 并且数组polypoints中第一个和最后一个点的坐标相同。(4)文本输出函数下列用于在图形显示模式下的文本输出。void far outtext(char far *textstring);该函数在现行位置输出字符串指针textstring所指的文本。void far outtextxy(int x, int y, char far *textstring);该函数在规定的(x, y)位置输出字符串指针textstring所指的文本。 其中x和y为象元坐标。(5)有关文本字体、字型和输出方式的设置 有关图形方式下的文本输出函数, 可以通过setcolor()函数设置输出文本的颜色。另外, 也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。void far settextstyle(int font, int direction, int charsize);该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。Turbo C2.0对&函数中各个参数的规定见下列各表所示: font的取值 符号常数 数值 含义 DEFAULT_FONT 0 8*8点阵字(缺省值) TRIPLEX_FONT 1 三倍笔划字体 SMALL_FONT 2 小号笔划字体 SANSSERIF_FONT 3 无衬线笔划字体 GOTHIC_FONT 4 黑体笔划字 direction的取值 符号常数 数值 含义BR HORIZ_DIR 0 从左到右 VERT_DIR 1 从底到顶 charsize的取值 符号常数或数值 含义 1 8*8点阵 2 16*16点阵 3 24*24点阵 4 32*32点阵 5 40*40点阵 6 48*48点阵 7 56*56点阵 8 64*64点阵 9 72*72点阵 10 80*80点阵 USER_CHAR_SIZE=0用户定义的字符大小void far setusercharsize(int mulx, int divx, int muly, int divy);该函数用来设置笔划型字和放大系数, 它只有在settextstyle( )函数中的charsize为0(或USER_CHAR_SIZE)时才起作用, 并且字体为函数settextstyle()规定的字体。调用该函数后, 每个显示在屏幕上的字符都以其缺省大小乘以mulx/divx为输出字符宽, 乘以muly/divy为输出字符高。(6)其它函数int bioskey(int cmd);该函数用来执行各种键盘操作,由cmd确定操作。 cmd可为以下值: 取值为0 :返回敲键盘上的下一个键。若低8位为非0,即为ASCII字符;若低8位为0,则返回扩充了的键盘代码。取值为1 :测试键盘是否可用于读。返回0表示没有键可用;否则返回下一次敲键之值。敲键本身一直保持由下次调用具的cmd值为0的bioskey所返回的值。 取值为2 :返回当前的键盘状态,由返回整数的每一个位表示,见下表: 位 为0时意义 为1时意义 7 插入状态 改写状态 6 大写状态 小写状态 5 数字状态,NumLock灯亮 光标状态,NumLock灯熄 4 ScrollLock灯亮 ScrollLock灯熄 3 Alt按下 Alt未按下 2 Ctrl按下 Ctrl未按下 1 左Shift按下 左Shift未按下 0 右Shift按下 右Shift未按下 intkbhit(void);该函数检查当前按下的键。void delay(unsigned milliseconds);该函数将程序的执行暂停一段时间(毫秒)。unsignedsleep(unsignedseconds);该函数将程序执行挂起一段时间(秒)。2、源程序#include GRAPHICS.H#include MATH.H#include stdio.h#define LEFT 0x4b00#define RIGHT 0x4d00#define ESC 0x011bint x,y,x1,y1,key,t1,t2,keyx,keylong,keymove,over=0,i,tt=0,fast;int ballx9=53,183,263,120,86,390,40,350,600;int bally9=158,139,160,113,30,213,120,263,281;int ballz9=0;float ls;win()float lx,ly,l1;for(i=0;i9;i+)if(ballzi=1)continue;lx=(float)(ballxi-x);ly=(float)(ballyi-y);l1=lx*lx+ly*ly;ls=sqrt(l1);if(int)ls17)tt+;fast-=50;if(i%2=0)keymove+=5;elsesetcolor(0);rectangle(keyx,460,key+keylong,470);keylong-=10;setcolor(YELLOW);rectangle(keyx,460,keyx+keylong,470);ballzi=1;setcolor(0);circle(ballxi,ballyi,10);if(yballyi)if(xballxi)t1=-1;t2=-1;elset1=1;t2=-1;elseif(xballxi)t1=1;t2=1;elseif(xballxi)t1=-1;t2=1;elset1=1;t2=1;fungo()x=100,y=50,keyx=200,keylong=100,keymove=15,fast=5000;for(i=0;i480)cleardevice();over=1;setcolor(RED);settextstyle(0,0,4);setusercharsize(3,1,3,1);outtextxy(200,200,GAME OVER);break;else if(x=6&y=6)t1=1;t2=1;else if(x=633&y=6)t1=-1;t2=1;else if(x=6)if(yy1)t1=1;t2=-1;elset1=1;t2=1;else if(y=6)if(xy)t1=-1;t2=-1;elset1=-1;t2=1;else if(y=454)if(x=keyx&x=keyx+keylong)if(x=(keyx+keylong/4)&x=(keyx+keylong/2)&x(keyx+keylong/4*3)t1=1;t2=-2;elset1=1;t2=-1;if (over) break;key=bioskey(0);setcolor(0);rectangle(keyx,460,keyx+keylong,470);if(key=ESC) cleardevice();break;else if(key=LEFT) keyx-=keymove;else if(key=RIGHT) keyx+=keymove;main()int gd=DETECT,gr;initgraph(&gd,&gr,C:TCBGI);setcolor(100);fungo();getch();sleep(1);closegraph();四、 实训习题1、 画出函数fungo()和win()的程序流程图。2、 改变固定小球的颜色、个数、位置和半径。3、 改变运动小球的速度和反弹的轨迹。4、 通过键盘输入运动小球的半径。实训项目二 学生成绩管理系统一、 实训目的通过本实例,主要目的是让学生掌握以下知识点:1、结构体数组的定义和使用。2、结构体数据的输入与输出方法。3、插入、排序、查找、删除算法的实现。4、初步了解一个简单管理系统的设计方法。完成下列功能:1、输入:函数input把10个学生的学号、姓名、性别、年龄、四科成绩以及平均成绩和总成绩放在一个结构体数组中,学生的学号、姓名、四科成绩由键盘输入,然后计算出平均成绩和总成绩放在结构体对应的域中。2、插入:insert 函数输入一个学生的记录,按学号的先后顺序插入该学生的全部内容。3、排序:sort函数对所有学生按要求排序(1.学号 2.总成绩 ),并输出。4、查找:find函数输入一个学生的学号或姓名,找到该学生并输出该学生的全部内容。要求能查询多次。5、删除:delete函数输入一个学生的学号或姓名,找到该学生并删除该学生的全部内容。6、输出:函数output 输出全部学生的记录。7、main调用所有函数,实现全部函数功能(注:除了定义结构外,不允许使用全局变量,函数之间的数据全部使用参数传递)。# include # include # include struct node int code; char name20; char type; int age; int chinese; int english; int computer; int math; int total; int average;stud100;struct node temp;void menu(void) system(clear); printf(tt*n); printf(tt* *n); printf(tt* 1 输 入 数 据 *n); printf(tt* 2 查 找 数 据 *n); printf(tt* 3 插 入 数 据 *n); printf(tt* 4 删 除 数 据 *n); printf(tt* 5 打 印 数 据 *n); printf(tt* 6 排 序 数 据 *n); printf(tt* 7 退 出 *n); printf(tt* *n); printf(tt* *n); printf(tt*n); printf(tt 请输入你的选项(1-7):);void input() int i; for (i=0;i10;i+) printf(请输入第%d个学生学号:,i); scanf(%d,&studi.code); printf(请输入第%d个学生姓名:,i); scanf(%s,); getchar(); printf(请输入第%d个学生性别:,i); scanf(%c,&studi.type); printf(请输入第%d个学生年龄:,i); scanf(%d,&studi.age); printf(请输入第%d个学生英文成绩:,i); scanf(%d,&studi.english); printf(请输入第%d个学生国文成绩:,i); scanf(%d,&studi.chinese); printf(请输入第%d个学生计算机成绩:,i); scanf(%d,&puter); printf(请输入第%d个学生数学成绩:,i); scanf(%d,&studi.math); studi.total=studi.english+studi.chinese+puter+studi.math; studi.average=studi.total/4; void find(int c) int n,m,i,j,l; char k20; system(clear); printf(按学号查找(按1):n); printf(按姓名查找(按2):n); printf(请选择:); scanf(%d,&n); if (n=1) printf(请输入学号:); scanf(%d,&m); for(i=0;ic;i+) if(studi.code=m) printf(*n); printf(学号:%dn,studi.code); printf(姓名:%sn,); printf(性别:%cn,studi.type); printf(年龄:%dn,studi.age); printf(英语成绩:%dn,studi.english); printf(国文成绩:%dn,studi.chinese); printf(计算机成绩:%dn,puter); printf(数学成绩:%dn,studi.math); printf(总分:%dn,studi.total); printf(平均分:%dn,studi.average); printf(*n); getchar(); else if (n=2) getchar(); printf(请输入姓名:); fgets(k,20,stdin); l=strlen(k); kl-1=0; for(j=0;jc;j+) if(strcmp(k,)=0) printf(*n); printf(学号:%dn,studj.code); printf(姓名:%sn,); printf(性别:%cn,studj.type); printf(年龄:%dn,studj.age); printf(英语成绩:%dn,studj.english); printf(国文成绩:%dn,studj.chinese); printf(计算机成绩:%dn,puter); printf(数学成绩:%dn,studj.math); printf(总分:%dn,studi.total); printf(平均分:%dn,studi.average); printf(*n); else getchar(); getchar(); void insert(int c) int i,j; system(clear); printf(请输入要插入学生的信息:n); printf(请输入学生学号:); scanf(%d,&temp.code); printf(请输入学生姓名:); scanf(%s,); getchar(); printf(请输入学生性别:); scanf(%c,&temp.type); printf(请输入学生年龄:); scanf(%d,&temp.age); printf(请输入学生英文成绩:); scanf(%d,&temp.english); printf(请输入学生国文成绩:); scanf(%d,&temp.chinese); printf(请输入学生计算机成绩:); scanf(%d,&puter); printf(请输入学生数学成绩:); scanf(%d,&temp.math); temp.total=temp.english+temp.chinese+puter+temp.math; temp.average=temp.total/4; for (i=0;ic;i+) if (temp.codei;j-) studj.code=studj-1.code; strcpy(,); studj.type=studj-1.type; studj.age=studj-1.age; studj.english=studj-1.english; studj.chinese=studj-1.chinese; puter=puter; studj.math=studj-1.math; studj.total=studj-1.total; studj.average=studj-1.average; studj.code=temp.code; strcpy(,); studj.type=temp.type; studj.age=temp.age; studj.english=temp.english; studj.chinese=temp.chinese; puter=puter; studj.math=temp.math; studj.total=temp.total; studj.average=temp.average; break; if(i=c) studi.code=temp.code; strcpy(,); studi.type=temp.type; studi.age=temp.age; studi.english=temp.english; puter=puter; studi.math=temp.math; studi.chinese=temp.chinese; studi.total=temp.total; studi.average=temp.average; void delete(int c) int i,j,l,n,k; char name20; printf(按学号删除(按1):n); printf(按姓名删除(按2):n); scanf(%d,&k); if(k=1) printf(请输入学号:n); scanf(%d,&n); for(i=0;ic;i+) if(studi.code=n) c=c-1; for(j=i;jc;j+) studj.code=studj+1.code; strcpy(,studj+1.name); studj.type=studj+1.type; studj.age=studj+1.age; studj.english=studj+1.english; studj.chinese=studj+1.chinese; puter=studj+1.computer; studj.math=studj+1.math; studj.total=studj+1.total; studj.average=studj+1.average; else if(k=2) getchar(); printf(请输入姓名:n); fgets(name,20,stdin); l=strlen(name); namel-1=0; for(i=0;ic;i+) if(strcmp(name,)=0) for(j=i;jc;j+) studj.code=studj+1.code; strcpy(,studj+1.name); stu

温馨提示

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

评论

0/150

提交评论