C语言实训小球碰撞游戏.docx
- 文档编号:14052653
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:26
- 大小:22.99KB
C语言实训小球碰撞游戏.docx
《C语言实训小球碰撞游戏.docx》由会员分享,可在线阅读,更多相关《C语言实训小球碰撞游戏.docx(26页珍藏版)》请在冰点文库上搜索。
C语言实训小球碰撞游戏
小球碰撞游戏程序的运行与调试
一、实训目的
通过本实例,主要目的是让学生掌握以下知识点:
1、在C语言中如何绘制常见图形,绘图函数的使用。
2、如何实现图形动画。
3、如何处理按键响应。
4、游戏算法的实现。
二、功能描述
本程序实现的游戏规则如下:
游戏者通过键盘上的LEFT键和RIGH键控制屏幕下方的一个黄色矩形框左右移动,拦截向下运动的小球,小球碰到矩形上边的不同部位,会以不同的角度反弹。
运动的小球碰到上边缘、左边缘、右边缘、和9个固定位置的小球都会发生碰撞反弹。
如果运动的小球将屏幕上9个固定位置的小球全部打掉,则玩家获胜;如果小球掉出下边缘,则玩家失败,游戏结束。
三、编程参考
1、程序中使用的库函数说明
(1)图形模式的初始化与退出
在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。
图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。
根据不同的图形适配器有不同的图形驱动程序。
例如对于EGA、VGA图形适配器就调用驱动程序EGAVGA.BGI,所以PATH对应的实参应为文件EGAVGA.BGI的实际路径名。
voidfarclosegraph(void);
该函数用于退出图形状态进入文本方式,并释放用于保存图形驱动程序和字体的系统存。
(2)屏幕颜色的设置和清屏函数
对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。
在TurboC中分别用下面两个函数。
设置背景色:
voidfarsetbkcolor(intcolor);
设置作图色:
voidfarsetcolor(intcolor);
其中color为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见下表所示。
有关屏幕颜色的符号常数表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义 符号常数 数值 含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BLACK 0 黑色 DARKGRAY 8 深灰
BLUE 1 兰色 LIGHTBLUE 9 深兰
GREEN 2 绿色 LIGHTGREEN 10 淡绿
CYAN 3 青色 LIGHTCYAN 11 淡青
RED 4 红色 LIGHTRED 12 淡红
MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红
BROWN 6 棕色 YELLOW 14 黄色
LIGHTGRAY 7 淡灰 WHITE 15 白色
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
清除图形屏幕容使用清屏函数,其调用格式如下:
voidefarcleardevice(void);
有关颜色设置请参照上表。
(3)基本图形函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
(a)画点函数
voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象元画一个按color所确定颜色的点。
x,y是指图形象元的坐标。
(b)画线函数
TURBOC提供了一系列画线&&函数,下面分别叙述
voidfarline(intx0,inty0,intx1,inty1);
画一条从点(x0,y0)到(x1,y1)的直线。
voidfarlineto(intx,inty);
画一作从现行游标到点(x,y)的直线。
voidfarlinerel(intdx,intdy);
画一条从现行游标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。
voidfarcircle(intx,inty,intradius);
以(x,y)为圆心,radius为半径,画一个圆。
voidfararc(intx,inty,intstangle,intendangle,intradius);
以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。
在TURBOC中规定x轴正向为0度,逆时针方向旋转一周, 依次为90,180,270和360度(其它有关&&函数也按此规定,不再重述)。
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);
以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。
voidfarrectangle(intx1,inty1,intx2,inty2);
以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。
voidfardrawpoly(intnumpoints,intfar*polypoints);
画一个顶点数为numpoints, 各顶点坐标由polypoints给出的多边形。
polypoints整型数组必须至少有2倍顶点数个无素。
每一个顶点的坐标都定义为x,y,并且x在前。
值得注意的是当画一个封闭的多边形时,numpoints的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。
(4)文本输出函数
下列用于在图形显示模式下的文本输出。
voidfarouttext(charfar*textstring);
该函数在现行位置输出字符串指针textstring所指的文本。
voidfarouttextxy(intx,inty,charfar*textstring);
该函数在规定的(x,y)位置输出字符串指针textstring所指的文本。
其中x和y为象元坐标。
(5)有关文本字体、字型和输出方式的设置
有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。
另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。
voidfarsettextstyle(intfont,intdirection,intcharsize);
该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。
TurboC2.0对&&函数中各个参数的规定见下列各表所示:
font的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
────────────────────────
DEFAULT_FONT 0 8*8点阵字(缺省值)
TRIPLEX_FONT 1 三倍笔划字体
SMALL_FONT 2 小号笔划字体
SANSSERIF_FONT 3 无衬线笔划字体
GOTHIC_FONT 4 黑体笔划字
━━━━━━━━━━━━━━━━━━━━━━━━
direction的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
────────────────────────
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 用户定义的字符大小
━━━━━━━━━━━━━━━━━━━━━━━━
voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy);
该函数用来设置笔划型字和放大系数,它只有在settextstyle()函数中的charsize为0(或USER_CHAR_SIZE)时才起作用,并且字体为函数settextstyle()规定的字体。
调用该函数后, 每个显示在屏幕上的字符都以其缺省大小乘以mulx/divx为输出字符宽,乘以muly/divy为输出字符高。
(6)其它函数
intbioskey(intcmd);
该函数用来执行各种键盘操作,由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未按下│
└──┴───────────┴───────────┘
int kbhit(void);
该函数检查当前按下的键。
voiddelay(unsignedmilliseconds);
该函数将程序的执行暂停一段时间(毫秒)。
unsigned sleep(unsigned seconds);
该函数将程序执行挂起一段时间(秒)。
2、源程序
#include"GRAPHICS.H"
#include"MATH.H"
#include"stdio.h"
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineESC0x011b
intx,y,x1,y1,key,t1,t2,keyx,keylong,keymove,over=0,i,tt=0,fast;
intballx[9]={53,183,263,120,86,390,40,350,600};
intbally[9]={158,139,160,113,30,213,120,263,281};
intballz[9]={0};
floatls;
win()
{
floatlx,ly,l1;
for(i=0;i<9;i++)
{
if(ballz[i]==1)
continue;
lx=(float)(ballx[i]-x);
ly=(float)(bally[i]-y);
l1=lx*lx+ly*ly;
ls=sqrt(l1);
if((int)ls<17)
{
tt++;
fast-=50;
if(i%2==0)
keymove+=5;
else
{
setcolor(0);
rectangle(keyx,460,key+keylong,470);
keylong-=10;
setcolor(YELLOW);
rectangle(keyx,460,keyx+keylong,470);
}
ballz[i]=1;
setcolor(0);
circle(ballx[i],bally[i],10);
if(y if(x { t1=-1; t2=-1; } else { t1=1; t2=-1; } else if(x { t1=1; t2=1; } else if(x { t1=-1; t2=1; } else { t1=1; t2=1; } } } } fungo() { x=100,y=50,keyx=200,keylong=100,keymove=15,fast=5000; for(i=0;i<9;i++) { setcolor(i+1); circle(ballx[i],bally[i],10); } sleep (1); t1=t2=1; while (1) { while(! kbhit()) { setcolor(YELLOW); rectangle(keyx,460,keyx+keylong,470); x1=x; y1=y; x+=t1; y+=t2; setcolor(4); circle(x,y,6); delay(fast); setcolor(0); circle(x,y,6); win(); if(tt==9) { cleardevice(); over=1; setcolor(RED); settextstyle(0,0,4); setusercharsize(3,1,3,1); outtextxy(200,200,"YOUWIN! "); break; } if(y>480) { cleardevice(); over=1; setcolor(RED); settextstyle(0,0,4); setusercharsize(3,1,3,1); outtextxy(200,200,"GAMEOVER"); break; } elseif(x==6&&y==6) { t1=1; t2=1; } elseif(x==633&&y==6) { t1=-1; t2=1; } elseif(x==6) { if(y { t1=1; t2=-1; } else { t1=1; t2=1; } } elseif(y==6) { if(x { t1=-1; t2=1; } else { t1=1; t2=1; } } elseif(x==633) { if(y1>y) { t1=-1; t2=-1; } else { t1=-1; t2=1; } } elseif(y==454) { if(x>=keyx&&x<=keyx+keylong) { if(x<(keyx+keylong/4)) { t1=-1; t2=-1; } elseif(x>=(keyx+keylong/4)&&x<(keyx+keylong/2)) { t1=-1; t2=-2; } elseif(x>=(keyx+keylong/2)&&x<(keyx+keylong/4*3)) { t1=1; t2=-2; } else { t1=1; t2=-1; } } } } if(over)break; key=bioskey(0); setcolor(0); rectangle(keyx,460,keyx+keylong,470); if(key==ESC) {cleardevice();break;} elseif(key==LEFT) keyx-=keymove; elseif(key==RIGHT) keyx+=keymove; } } main() { intgd=DETECT,gr; initgraph(&gd,&gr,"C: \\TC\\BGI"); 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 structnode { intcode; charname[20]; chartype; intage; intchinese; intenglish; intcomputer; intmath; inttotal; intaverage; }stud[100]; structnodetemp; voidmenu(void) { system("clear"); printf("\t\t**************************\n"); printf("\t\t* *\n"); printf("\t\t*[1]输入数据 *\n"); printf("\t\t*[2]查找数据 *\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 小球 碰撞 游戏