




免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机技术基础课程设计C语言设计报告题目:一个简单的游戏程序学院:工商管理学院专业:信息管理与信息系统班级:050507姓名:于金杰指导教师:张守伟 设计日期:2006年12月16日题目:一个简单的游戏程序一、 选题背景:1 编写一个有趣的稍微复杂的,能够用到许多所学知识的程序。2 是一个以战斗为题材的小程序。3 主要涉及了图形绘制函数的运用、各种变量的运用、各种语句的使用、指针的运用、内存的管理等。二、设计思路:由两部分来完成界面,以战斗场面为主要部分;飞机和坦克的一个是文本部分,显示解释文字。另一个是各个图形的绘制,即飞机、坦克和炸弹三个实体,一个是战斗的过程,包括飞机起飞、投弹、爆炸,其中坦克在此间一直运动。三:设计分析(一)涉及问题1利用c类库中的有关存储图像的方法,先将图形绘制到一个内存缓冲区,然后使用时,直接拿指针进行调用,把它当作一个对象来使用。这样就构置了整个程序过程。2用复杂的绘制方法把一个飞机(或者坦克和炸弹)分拆成简单的基本图形(像直线、曲线、椭圆和矩形等),利用c类库中的画线(line)、画曲线(arc)、画椭圆(ellipse)和画矩形(rectangle)的方法。其中尤其在绘制飞机的尾翼的过程中使用了旋转矩阵,通过旋转一定角度把尾翼的旋转状态绘画出来。使它成为一个形象的图形。3要使飞机投下来的炸弹能够正好炸到坦克,并且在飞机起飞和炸弹降落过程中坦克一直运动,就要保证飞机、坦克、炸弹的时间同步。思路是先定好飞机和坦克的初始位置(还要考虑飞机和坦克的大小),然后再定好飞机投弹位置,最后定好坦克爆炸的位置,将它们都当成点来看有利于使制作更为简单。利用这三个位置来考虑动态过程,定好每步移动的时间和距离,精确计算最终炸弹和坦克能够相撞。对于消除图形移动时的引线的解决方法是利用绘制空白页的方法,即每绘制完飞机和坦克的时候,再绘制一部分空白,就可以使这个问题得到很好的解决。(二)主要应用技术 1. 图形的绘画方法以及库函数的支持(关键通过旋转矩阵来实现飞机尾翼的画法)。2. 通过数学计算来实现飞机、坦克和炸弹的动态特征,并通过逻辑循环来实现。四程序流程图坦克绘制飞机绘制文字描述炸弹绘制炸弹爆炸飞机起飞坦克运动飞机投弹坦克运动图形绘制战斗部分五程序清单/*/*库函数头文件调用*/*/#include #include #include #include /*/*变量设置*/*/*设置声音频率(数字为频率)*/unsigned Freq110=659,784,784,659,784,784,659,784,880,880,659,587,587,523,587,587,523,587,587,523,587,659,784,784,587,659,587,659,784,784,659,784,784,659,784,880,880,659,587,587,523,587,587,523,587,587,523,587,523,440,523,523,523,393,440,494,523,587,523,494,440,392,494,587,494,393,659,784,392,440,494,523,587,523,494,440,392,659,784,784,659,784,784,659,784,880,880,659,587,587,523,587,587,523,587,587,523,587,659,784,784;/*设置图像延迟时间(数字多少毫秒)*/float Delay110=150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,160,160,160,160,170,170,170,170,175,170,170,170,170,170,170,170,170,170,160,160,170,170,140,140,140,170,140,140,170,140,140,140,140,140,140,140,140,150,150,170,150,150,150,150,150,150,300,150,150,150,150,155,150,150,150,150,150,150,150,155,150,150,150,160,160,160,160,170,170,170,170;double sin(),cos();double xmax=640.0;double ymax=480.0;double f33;double xx,yy;/*定位x坐标*/scx(xj)float xj; int x; x=(int)(xj+xmax/2);/*从屏幕中心开始向右*/ return(x);/*定位y坐标*/scy(yj)float yj; int y; y=ymax-(int)(yj+(ymax/2);/*从屏幕中心开始向上*/ return(y);/*设置旋转矩阵*/rotate(theta)double theta; double th; th=theta/180*3.1415926; f00=cos(th);f01=sin(th);f02=0.0; f10=-sin(th);f11=cos(th);f12=0.0; f20=0.0;f21=0.0;f22=1.0;/*设置大小的矩阵*/scale(s)double s; f00=s;f01=0.0;f02=0.0; f10=0.0;f11=s;f12=0.0; f20=0.0;f21=0.0;f22=1.0;/*根据矩阵列值(第一列)求x位置*/affine2x(x,y,d)double x,y,d; xx=x*f00+y*f10+d*f20; return(xx);/*根据矩阵列值(第二列)求y位置*/affine2y(x,y,d)double x,y,d; yy=x*f01+y*f11+d*f21; return(yy);/*/*程序过程*/*/*主函数程序开始*/main() /*设置显示的模式*/ int graphdriver=DETECT,graphmode; int freq,z=0; /*用来设置尾翼的点集*/ static double x1=0.0,(-4.0),(-28.0),(-28.0),(-8.0),0.0; static double y1=0.0,(-2.0),(-2.0),4.0,4.0,0.0; static double x2=0.0,4.0,28.0,28.0,8.0,0.0; static double y2=0.0,2.0,2.0,(-4.0),(-4.0),0.0; /*尾翼的点集*/ static double x36; static double y36; static double x46; static double y46; /*用来设置爆炸边界的点*/ static double x5=4.0,10.0,6.0,10.0,4.0,6.0,2.0,0.0,-2.0,-6.0,-4.0,-10.0, -6.0,-10.0,-4.0,4.0; static double y5=0.0,6.0,4.0,10.0,6.0,14.0,10.0,16.0,10.0,14.0,6.0,10.0,4.0, 6.0,0.0,0.0,; /*爆炸边界点*/ static double x616; static double y616; double s,r,xx,yy; /*一些界面位置的变量*/ int n=280,m=400,a=54,n1=20,m1=390,a1=268,b1=2,a2=-85,b2=130,i,j,k; /*画坦克的点集*/ int d1=0*2+20,390-2*8,0*2+20,390-2*14,49*2+20,390-2*14,60*2+20,390-2*10, 53*2+20,390-2*5,10*2+20,390-2*5,0*2+20,390-2*8; int d2=18*2+20,390-2*14,16*2+20,390-2*17,10*2+20,390-2*17,8*2+20,390-2*22, 20*2+20,390-2*22,20*2+20,390-2*23,35*2+20,390-2*23,43*2+20,390-2*16, 39*2+20,390-2*14,18*2+20,390-2*14; int d3=40*2+20,390-2*19,67*2+20,390-2*26,67.5*2+20,390-2*24,42*2+20,390-2*17, 40*2+20,390-2*19; /*图象下面文字范围点集*/ int d4=0,394,639,394,639,479,0,479,0,394; /*申请缓存(存放飞机)*/ void *buf1; unsigned s1; /*申请缓存(存放坦克)*/ void *buf2; unsigned s2; /*申请缓存(存放炸弹)*/ void *buf4; unsigned s4; /*申请缓存(存放空图像)*/ void *buf3; unsigned s3;/*图形初始化*/ initgraph(&graphdriver,&graphmode,);/*清空屏幕*/ cleardevice();/*激活当前页*/ setactivepage(0);/*当前页可见*/ setvisualpage(0);/*设置背景颜色*/ setbkcolor(9);/*设置当前颜色*/ setcolor(54);/* tank */*设置填充模式和颜色 */ setfillstyle(1,17);/*用当前色根据点画并且填充多边形*/ fillpoly(7,d1); fillpoly(10,d2); fillpoly(5,d3);/*给封闭图形填充颜色*/ floodfill(43*2+n1,m1-2*18,a); /*将当前点移到该点*/ moveto(0*2+n1,m1-2*10);/*和该点相连*/ lineto(60*2+n1,m1-2*10); moveto(20*2+n1,m1-2*22); lineto(18*2+n1,m1-2*14); moveto(10*2+n1,m1-2*0); lineto(48*2+n1,m1-2*0);/*画弧*/ arc(10*2+n1,m1-2*7,180,270,14); /*画椭圆弧*/ ellipse(48*2+n1,m1-2*9,270,360,22,18); setfillstyle(1,56); floodfill(10*2+n1,m1-2*3,a);/*返回图像的大小(字节数)*/ s2=imagesize(18,330,155,390);/*申请内存空间来存储图像*/ buf2=malloc(s2);/*将该图像(坦克)放到buf2中*/ getimage(18,330,155,390,buf2);/*该处图像为空*/ s3=imagesize(300,200,400,381); buf3=malloc(s3); getimage(300,200,400,381,buf3);/* 战斗 */for(i=0;i=10;i+=1) /*设置文字字体和范围*/ setfillstyle(11,54); fillpoly(5,d4); /*设置文字的属性(字的类型、大小) settextstyle(0,0,3); /*输出文字*/ outtextxy(100,420,TAKIGN OFF); /* 画机舱*/ /*将当前点移到该点*/ moveto(36*2+n,m-5*2); lineto(74*2+n,m-5*2); lineto(74*2+n,m-6*2); lineto(36*2+2,m-6*2); ellipse(36*2+n,m-7*2,180,720,2*2,1*2); ellipse(36*2+n,m-7*2,180,720,3*2,2*2); moveto(33*2+n,m-2*7); lineto(34*2+n,m-2*7); moveto(46*2+n,m-6*2); lineto(48*2+n,m-11*2); /*将当前点向右移2*2,向下移2*0 */ moverel(2*2,0*2); /*将当前点和距离左边2*2,距离下边5*2的点相连*/ linerel(-2)*2,5*2); moveto(66*2+n,m-6*2); lineto(68*2+n,m-11*2); moverel(2*2,0*2); linerel(-2)*2,5*2); arc(49*2+n,m-11*2,0,180,1*2); arc(69*2+n,m-11*2,0,180,1*2); moveto(28*2+n,m-12*2); lineto(29*2+n,m-11*2); lineto(48*2+n,m-11*2); moveto(50*2+n,m-11*2); lineto(68*2+n,m-11*2); moveto(70*2+n,m-11*2); lineto(80*2+n,m-11*2); lineto(90*2+n,m-12*2); lineto(144*2+n,m-20*2); moverel(7*2,(-4)*2); lineto(165*2+n,m-44*2); lineto(157*2+n,m-44*2); lineto(135*2+n,m-25*2); lineto(93*2+n,m-25*2); lineto(91*2+n,m-30*2); lineto(92*2+n,m-24*2); lineto(90*2+n,m-21*2); lineto(69*2+n,m-21*2); lineto(69*2+n,m-35*2); moveto(63*2+n,m-2*35); lineto(80*2+n,m-2*35); moveto(69*2+n,m-2*31); lineto(83*2+n,m-2*31); moveto(60*2+n,m-2*33.5); lineto(60*2+n,m-2*24); lineto(58*2+n,m-2*27); lineto(59*2+n,m-2*33); ellipse(63*2+n,m-2*33,90,180,4*2,2*2); ellipse(80*2+n,m-33*2,0,90,9*2,2*2); ellipse(144*2+n,m-24*2,270,360,7*2,4*2); /* 画四个矩形 */ rectangle(65*2+n,m-2*30,67*2+n,m-2*27); rectangle(89*2+n,m-2*33,91*2+n,m-2*30); rectangle(73*2+n,m-2*29,76*2+n,m-2*24); rectangle(80*2+n,m-2*29,83*2+n,m-2*24); moveto(57*2+n,m-2*32); lineto(57*2+n,m-2*40); lineto(68*2+n,m-2*40); lineto(79*2+n,m-2*35); moveto(58*2+n,m-2*32); lineto(53*2+n,m-2*32); lineto(52*2+n,m-2*34); lineto(34*2+n,m-2*33); moveto(25*2+n,m-2*29); lineto(19*2+n,m-2*24); lineto(22*2+n,m-2*20); lineto(47*2+n,m-2*25); lineto(52*2+n,m-2*29); lineto(53*2+n,m-2*32); moveto(19*2+n,m-2*24); lineto(13*2+n,m-2*21); lineto(13*2+n,m-2*17); lineto(21*2+n,m-2*14); lineto(22*2+n,m-2*13); lineto(28*2+n,m-2*13); lineto(22*2+n,m-2*15); lineto(22*2+n,m-2*20); moveto(28*2+n,m-2*13); lineto(28*2+n,m-2*9); lineto(35*2+n,m-2*9); lineto(42*2+n,m-2*11); moveto(22*2+n,m-2*13); lineto(22*2+n,m-2*11); moveto(24*2+n,m-2*9); lineto(28*2+n,m-2*9); moveto(30*2+n,m-2*32); lineto(37*2+n,m-2*23); moveto(1*2+n,m-2*0.5); linerel(-7)*2+n,m-2*9); rectangle(7*2+n,m-2*12.5,22*2+n,m-2*12); rectangle(7*2+n,m-2*11,22*2+n,m-2*10.5); rectangle(9*2+n,m-2*12.5,10*2+n,m-2*10.5); rectangle(18*2+n,m-2*12.5,19*2+n,m-2*10.5); arc(24*2+n,m-2*11,180,270,2*2); arc(35*2+n,m-2*18,90,130,15*2); arc(69*2+n,m-2*35,225,270,14*2); ellipse(13*2+n,m-2*19,90,270,3*2,2*2); ellipse(59*2+n,m-2*19.5,10,315,3.5*2,1.5*2); ellipse(63*2+n,m-2*19,90,220,2.5*2,1*2); ellipse(63*2+n,m-2*18,0,90,5*2,2*2); ellipse(57*2+n,m-2*34,90,180,5*2,6*2); rectangle(62*2+n,m-2*48,63*2+n,m-2*40); arc(62.5*2+n,m-2*48,0,180,0.5*2); moveto(138*2+n,m-2*24); lineto(148*2+n,m-2*24); moveto(61*2+n,m-2*18); lineto(68*2+n,m-2*18); moveto(140*2+n,m-2*24); lineto(142*2+n,m-2*26); lineto(151*2+n,m-2*37); /*画圆*/ circle(154*2+n,m-2*39,4); /*填充该区域*/ setfillstyle(1,4); floodfill(12*2+n,m-2*19,a); setfillstyle(1,7); floodfill(34*2+n,m-2*6,a); floodfill(48*2+n,m-2*9,a); floodfill(68*2+n,m-2*9,a); setfillstyle(1,56); floodfill(100*2+n,m-2*20,a); floodfill(60*2+n,m-2*38,a); setfillstyle(4,513); floodfill(30*2+n,m-2*25,a); floodfill(40*2+n,m-2*25,a); floodfill(59*2+n,m-2*28,a); setfillstyle(1,51); floodfill(70*2+n,m-2*25,a); setfillstyle(1,7); floodfill(25*2+n,m-2*10,a); floodfill(55*2+n,m-2*35,a); floodfill(50*2+n,m-2*5.5,a); floodfill(59*2+n,m-2*20,a); setfillstyle(1,28); floodfill(20*2+n,m-2*20,a); setfillstyle(1,37); floodfill(65*2+n,m-2*32,a); setfillstyle(1,62); floodfill(30*2+n,m-2*10,a); floodfill(154*2+n,m-2*39,a); settextstyle(2,0,4); outtextxy(340,364,AH-1J); /* 画螺旋桨 */ moveto(406,308); lineto(426-2*i,306); lineto(536-14*i,296); lineto(426-2*i,302); lineto(406,306); moveto(426-2*i,302); lineto(406-2*i,302); moveto(404,308); lineto(384+2*i,306); lineto(274+14*i,296); lineto(384+2*i,302); lineto(404,306); moveto(384+2*i,302); lineto(384+2*i,306); /*将buf2中的图用拷贝的方式输出*/ putimage(18,330+2,buf2,COPY_PUT); /* 画尾翼 */ /*旋转*/ rotate(18.0)*i);/*每次旋转18度*/ /*设置尾翼点*/ for(k=0;k=5;k+) x4k=affine2x(x2k,y2k,1.0); y4k=affine2y(x2k,y2k,1.0); x3k=affine2x(x1k,y1k,1.0); y3k=affine2y(x1k,y1k,1.0); /*连接形成尾翼*/ for(k=0;k=4;k+) /*在两点间画一条线*/ line(int)scx(x4k)+a1,(int)scx(y4k)+b1,(int)scx(x4k+1)+a1, (int)scx(y4k+1)+b1); line(int)scx(x3k)+a1,(int)scx(y3k)+b1,(int)scx(x3k+1)+a1, (int)scx(y3k+1)+b1); /*将程序暂停250-25*i毫秒*/ delay(250-25*i); /*给飞机申请空间*/ s1=imagesize(284,294,620,393); buf1=malloc(s1); getimage(284,294,620,393,buf1); /* 画炸弹 */ ellipse(3*2+n,m-2*63.5,90,270,3*2,1.5*2); ellipse(3*2+n,m-2*63.5,15,90,6*2,1.5*2); ellipse(3*2+n,m-2*63.5,270,345,6*2,1.5*2); ellipse(3*2+n,m-2*63.5,0,3,6*2,1.5*2); ellipse(3*2+n,m-2*63.5,357,360,6*2,1.5*2); moveto(7*2+n,m-2*62); linerel(3*2,0); linerel(-2),(-2); linerel(-6),0); linerel(2,2); moveto(7*2+n,m-2*65); linerel(3*2,0); linerel(-2),2); linerel(-6),0); linerel(2,(-2); setfillstyle(1,2); floodfill(3*2+n,m-2*63.5,a); setfillstyle(1,14); floodfill(8*2+n,m-2*64.5,a); floodfill(8*2+n,m-2*62.5,a); /*给炸弹申请空间*/ s4=imagesize(280,269,300,280); buf4=malloc(s4); getimage(280,269,300,280,buf4); /*清除屏幕图形*/ cleardevice(); /* 起飞画面 */ for(i=0,j=0;j=246;i+=1,j+=3) /*循环播放声音,如果有按键,则跳出不执行声音*/ for(freq=z;freq=110,!
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 唐宋建筑改造方案设计理念
- 建筑方案设计通过率
- 电动分割幕安装施工方案
- 住建部施工方案编制模板
- 咨询方案汇报表达
- 清明节茶叶营销方案主题
- 护理职业教育录播课大纲
- 团委外出活动策划方案
- 校园防性侵安全教育教案
- 自动喂食器营销策划方案
- JTS-165-6-2008滚装码头设计规范-PDF解密
- 铸造企业安全生产标准化管理体系方案资料汇编(2022-2023新标准实施模板)
- 设备维修与保养(课件)
- 浅谈国内外深基坑支护技术的现状及进展
- 网络舆情应对及处置
- 工业数据采集技术及应用 -配置能源采集仪表参数
- 《应急救援知识》课件
- 【一例重症肺炎的个案护理案例报告6000字(论文)】
- 电梯使用维护说明书
- 专业方向证明
- 范里安-微观经济学:现代观点
评论
0/150
提交评论