《C的十个经典案例复习进程.doc》由会员分享,可在线阅读,更多相关《C的十个经典案例复习进程.doc(305页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。C的十个经典案例-案例一贪吃蛇游戏#defineN200#include#include#include#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011binti,key;intscore=0;/*得分*/intgamespeed=50000;/*游戏速度自己调整*/structFoodintx;/*食物的横坐标*/inty;/*食物的纵坐标*/intyes;/*判断是否要出现食物的变量*
2、/food;/*食物的结构体*/structSnakeintxN;intyN;intnode;/*蛇的节数*/intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/snake;voidInit(void);/*图形驱动*/voidClose(void);/*图形结束*/voidDrawK(void);/*开始画面*/voidGameOver(void);/*结束游戏*/voidGamePlay(void);/*玩游戏具体过程*/voidPrScore(void);/*输出成绩*/*主函数*/voidmain(void)Init();/*图形驱动*/Draw
3、K();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/*图形驱动*/voidInit(void)intgd=DETECT,gm;initgraph(&gd,&gm,c:tc);cleardevice();/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/voidDrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i=600;i+=10)/*画围墙*/rect
4、angle(i,40,i+10,49);/*上边*/rectangle(i,451,i+10,460);/*下边*/for(i=40;i0;i-)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/snake.xi=snake.xi-1;snake.yi=snake.yi-1;/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction)case1:snake.x0+=10;break;case2:snake.x0-=10;break;case3:snake.y0-=10;break;case4:snake.y0+=10;break;fo
5、r(i=3;isnake.node;i+)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver();/*显示失败*/snake.life=1;break;if(snake.x0595|snake.y0455)/*蛇是否撞到墙壁*/GameOver();/*本次游戏结束*/snake.life=1;/*蛇死*/if(snake.life=1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if(snake.x0=food.x&snake.y0=food.y)
6、/*吃到食物以后*/setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.xsnake.node=-20;snake.ysnake.node=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node+;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/setcolor(4);/*画出蛇*/for(i=0;isnake.node;i+)rectangle(snake.xi,snake
7、.yi,snake.xi+10,snake.yi-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.xsnake.node-1,snake.ysnake.node-1,snake.xsnake.node-1+10,snake.ysnake.node-1-10);/*endwhile(!kbhit)*/if(snake.life=1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key=ESC)/*按ESC键退出*/break;elseif(key=UP&snake.dir
8、ection!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key=RIGHT&snake.direction!=2)snake.direction=1;elseif(key=LEFT&snake.direction!=1)snake.direction=2;elseif(key=DOWN&snake.direction!=3)snake.direction=4;/*endwhile(1)*/*游戏结束*/voidGameOver(void)cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4
9、);outtextxy(200,200,GAMEOVER);getch();/*输出成绩*/voidPrScore(void)charstr10;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();案例二计算器#include/*DOS接口函数*/#include/*数学函数的定义*/#include
10、/*屏幕操作函数*/#include/*I/O函数*/#include/*库函数*/#include/*变量长度参数表*/#include/*图形函数*/#include/*字符串函数*/#include/*字符操作函数*/#defineUP0x48/*光标上移键*/#defineDOWN0x50/*光标下移键*/#defineLEFT0x4b/*光标左移键*/#defineRIGHT0x4d/*光标右移键*/#defineENTER0x0d/*回车键*/void*rar;/*全局变量,保存光标图象*/structpalettetypepalette;/*使用调色板信息*/intGraphDr
11、iver;/*图形设备驱动*/intGraphMode;/*图形模式值*/intErrorCode;/*错误代码*/intMaxColors;/*可用颜色的最大数值*/intMaxX,MaxY;/*屏幕的最大分辨率*/doubleAspectRatio;/*屏幕的像素比*/voiddrawboder(void);/*画边框函数*/voidinitialize(void);/*初始化函数*/voidcomputer(void);/*计算器计算函数*/voidchangetextstyle(intfont,intdirection,intcharsize);/*改变文本样式函数*/voidmwin
12、dow(char*header);/*窗口函数*/intspecialkey(void);/*获取特殊键函数*/intarrow();/*设置箭头光标函数*/*主函数*/intmain()initialize();/*设置系统进入图形模式*/computer();/*运行计算器*/closegraph();/*系统关闭图形模式返回文本模式*/return(0);/*结束程序*/*设置系统进入图形模式*/voidinitialize(void)intxasp,yasp;/*用于读x和y方向纵横比*/GraphDriver=DETECT;/*自动检测显示器*/initgraph(&GraphDri
13、ver,&GraphMode,);/*初始化图形系统*/ErrorCode=graphresult();/*读初始化结果*/if(ErrorCode!=grOk)/*如果初始化时出现错误*/printf(GraphicsSystemError:%sn,grapherrormsg(ErrorCode);/*显示错误代码*/exit(1);/*退出*/getpalette(&palette);/*读面板信息*/MaxColors=getmaxcolor()+1;/*读取颜色的最大值*/MaxX=getmaxx();/*读屏幕尺寸*/MaxY=getmaxy();/*读屏幕尺寸*/getaspect
14、ratio(&xasp,&yasp);/*拷贝纵横比到变量中*/AspectRatio=(double)xasp/(double)yasp;/*计算纵横比值*/*计算器函数*/voidcomputer(void)structviewporttypevp;/*定义视口类型变量*/intcolor,height,width;intx,y,x0,y0,i,j,v,m,n,act,flag=1;floatnum1=0,num2=0,result;/*操作数和计算结果变量*/charcnum5,str220=,c,temp20=;charstr1=1230.456+-789*/Qc=%;/*定义字符串在
15、按钮图形上显示的符号*/mwindow(Calculator);/*显示主窗口*/color=7;/*设置灰颜色值*/getviewsettings(&vp);/*读取当前窗口的大小*/width=(vp.right+1)/10;/*设置按钮宽度*/height=(vp.bottom-10)/10;/*设置按钮高度*/x=width/2;/*设置x的坐标值*/y=height/2;/*设置y的坐标值*/setfillstyle(SOLID_FILL,color+3);bar(x+width*2,y,x+7*width,y+height);/*画一个二维矩形条显示运算数和结果*/setcolor
16、(color+3);/*设置淡绿颜色边框线*/rectangle(x+width*2,y,x+7*width,y+height);/*画一个矩形边框线*/setcolor(RED);/*设置颜色为红色*/outtextxy(x+3*width,y+height/2,0.);/*输出字符串0.*/x=2*width-width/2;/*设置x的坐标值*/y=2*height+height/2;/*设置y的坐标值*/for(j=0;j4;+j)/*画按钮*/for(i=0;i=x0+6*width)/*如果右移,移到尾,则移动到最左边字符位置*/x=x0;m=0;elsex=x+width+wid
17、th/2;m+;/*否则,右移到下一个字符位置*/if(v=LEFT)/*左移箭头时新位置计算*/if(x=x0)x=x0+6*width;m=4;/*如果移到头,再左移,则移动到最右边字符位置*/elsex=x-width-width/2;m-;/*否则,左移到前一个字符位置*/if(v=UP)/*上移箭头时新位置计算*/if(y=7*height)y=y0;n=0;/*如果移到尾,再下移,则移动到最上边字符位置*/elsey=y+height+height/2;n+;/*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT);/*在新的位置显示光标箭头*/c=st
18、r1n*5+m;/*将字符保存到变量c中*/if(isdigit(c)|c=.)/*判断是否是数字或小数点*/if(flag=-1)/*如果标志为-1,表明为负数*/strcpy(str2,-);/*将负号连接到字符串中*/flag=1;/*将标志值恢复为1*/sprintf(temp,%c,c);/*将字符保存到字符串变量temp中*/strcat(str2,temp);/*将temp中的字符串连接到str2中*/setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outte
19、xtxy(5*width,height,str2);/*显示字符串*/if(c=+)num1=atof(str2);/*将第一个操作数转换为浮点数*/strcpy(str2,);/*将str2清空*/act=1;/*做计算加法标志值*/setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,0.);/*显示字符串*/if(c=-)if(strcmp(str2,)=0)/*如果str2为空,说明是负号,而不是减号*/flag=-1;/
20、*设置负数标志*/elsenum1=atof(str2);/*将第二个操作数转换为浮点数*/strcpy(str2,);/*将str2清空*/act=2;/*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/outtextxy(5*width,height,0.);/*显示字符串*/if(c=*)num1=atof(str2);/*将第二个操作数转换为浮点数*/strcpy(str2,);/*将str2清空*/act=3;/*做计算乘法标志值
21、*/setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,0.);/*显示字符串*/if(c=/)num1=atof(str2);/*将第二个操作数转换为浮点数*/strcpy(str2,);/*将str2清空*/act=4;/*做计算除法标志值*/setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtext
22、xy(5*width,height,0.);/*显示字符串*/if(c=)num1=atof(str2);/*将第二个操作数转换为浮点数*/strcpy(str2,);/*将str2清空*/act=5;/*做计算乘方标志值*/setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/outtextxy(5*width,height,0.);/*显示字符串*/if(c=%)num1=atof(str2);/*将第二个操作数转换为浮点数*/str
23、cpy(str2,);/*将str2清空*/act=6;/*做计算模运算乘方标志值*/setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/outtextxy(5*width,height,0.);/*显示字符串*/if(c=)num2=atof(str2);/*将第二个操作数转换为浮点数*/switch(act)/*根据运算符号计算*/case1:result=num1+num2;break;/*做加法*/case2:result=nu
24、m1-num2;break;/*做减法*/case3:result=num1*num2;break;/*做乘法*/case4:result=num1/num2;break;/*做除法*/case5:result=pow(num1,num2);break;/*做x的y次方*/case6:result=fmod(num1,num2);break;/*做模运算*/setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/sprintf(temp
25、,%f,result);/*将结果保存到temp中*/outtextxy(5*width,height,temp);/*显示结果*/if(c=c)num1=0;/*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,);/*将str2清空*/setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/outtextxy(5*width,height,0.);/*显示字符串*/if(c=Q)exit(0);
26、/*如果选择了q回车,结束计算程序*/putimage(x,y,rar,XOR_PUT);/*在退出之前消去光标箭头*/return;/*返回*/*窗口函数*/voidmwindow(char*header)intheight;cleardevice();/*清除图形屏幕*/setcolor(MaxColors-1);/*设置当前颜色为白色*/setviewport(20,20,MaxX/2,MaxY/2,1);/*设置视口大小*/height=textheight(H);/*读取基本文本大小*/settextstyle(DEFAULT_FONT,HORIZ_DIR,1);/*设置文本样式*/
27、settextjustify(CENTER_TEXT,TOP_TEXT);/*设置字符排列方式*/outtextxy(MaxX/4,2,header);/*输出标题*/setviewport(20,20+height+4,MaxX/2+4,MaxY/2+20,1);/*设置视口大小*/drawboder();/*画边框*/voiddrawboder(void)/*画边框*/structviewporttypevp;/*定义视口类型变量*/setcolor(MaxColors-1);/*设置当前颜色为白色*/setlinestyle(SOLID_LINE,0,NORM_WIDTH);/*设置画线
28、方式*/getviewsettings(&vp);/*将当前视口信息装入vp所指的结构中*/rectangle(0,0,vp.right-vp.left,vp.bottom-vp.top);/*画矩形边框*/*设计鼠标图形函数*/intarrow()intsize;intraw=4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4;/*定义多边形坐标*/setfillstyle(SOLID_FILL,2);/*设置填充模式*/fillpoly(8,raw);/*画出一光标箭头*/size=imagesize(4,4,16,16);/*测试图象大小*/rar=malloc(si
29、ze);/*分配内存区域*/getimage(4,4,16,16,rar);/*存放光标箭头图象*/putimage(4,4,rar,XOR_PUT);/*消去光标箭头图象*/return0;/*按键函数*/intspecialkey(void)intkey;while(bioskey(1)=0);/*等待键盘输入*/key=bioskey(0);/*键盘输入*/key=key&0xff?key&0xff:key8;/*只取特殊键的扫描值,其余为0*/return(key);/*返回键值*/案例三黑白棋游戏/*3.3.4源程序*/#includegraphics.h/*图形系统头文件*/#de
30、fineLEFT0x4b00/*光标左键值*/#defineRIGHT0x4d00/*光标右键值*/#defineDOWN0x5000/*光标下键值*/#defineUP0x4800/*光标上键值*/#defineESC0x011b/*ESC键值*/#defineENTER0x1c0d/*回车键值*/inta88=0,key,score1,score2;/*具体分数以及按键与存放棋子的变量*/charplayone3,playtwo3;/*两个人的得分转换成字符串输出*/voidplaytoplay(void);/*人人对战函数*/voidDrawQp(void);/*画棋盘函数*/voidS
31、etPlayColor(intx);/*设置棋子第一次的颜色*/voidMoveColor(intx,inty);/*恢复原来棋盘状态*/intQpChange(intx,inty,intz);/*判断棋盘的变化*/voidDoScore(void);/*处理分数*/voidPrintScore(intn);/*输出成绩*/voidplayWin(void);/*输出胜利者信息*/*主函数*/voidmain(void)intgd=DETECT,gr;initgraph(&gd,&gr,c:tc);/*初始化图形系统*/DrawQp();/*画棋盘*/playtoplay();/*人人对战*/
32、getch();closegraph();/*关闭图形系统*/voidDrawQp()/*画棋盘*/inti,j;score1=score2=0;/*棋手一开始得分都为0*/setbkcolor(BLUE);for(i=100;i=64-score1-score2)/*如果尝试超过空格数则停步*/MoveColor(x,y);fillellipse(x,y,15,15);break;elsecontinue;/*如果按键无效*/DoScore();/*分数的改变*/break;/*棋盘变化了,则轮对方走棋*/else/*已经有棋子就继续按键*/continue;else/*四个方向按键的判断*
33、/if(key=LEFT&x120)/*左方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);elseif(key=RIGHT&x80)/*右方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);elseif(key=UP&y120)/*上方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t
34、);y-=40;fillellipse(x,y,15,15);elseif(key=DOWN&y400)/*下方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);if(key=ESC)/*结束游戏*/break;if(score1+score2)=64|score1=0|score2=0)/*格子已经占满或一方棋子为0判断胜负*/playWin();/*输出最后结果*/break;t=t%2+1;/*一方走后,改变棋子颜色即轮对方走*/cc=0;/*计数值恢复为0*/*endwhile*/voidSetPlayColor(intt)/*设置棋子颜色*/if(t%2=1)setfillstyle(SOLID_FILL,15);/*白色*/elsesetfillstyle(SOLID_FILL,