C的十个经典案例复习进程_第1页
C的十个经典案例复习进程_第2页
C的十个经典案例复习进程_第3页
C的十个经典案例复习进程_第4页
C的十个经典案例复习进程_第5页
已阅读5页,还剩300页未读 继续免费阅读

下载本文档

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

文档简介

1、Good is good, but better carries it.精益求精,善益求善。C的十个经典案例-案例一贪吃蛇游戏#defineN200#include#include#include#defineLEFT0 x4b00#defineRIGHT0 x4d00#defineDOWN0 x5000#defineUP0 x4800#defineESC0 x011binti,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();/*图形驱动*

3、/DrawK();/*开始画面*/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)/*画围墙*

4、/rectangle(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;bre

5、ak;for(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=fo

6、od.y)/*吃到食物以后*/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,

7、snake.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&snak

8、e.direction!=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(

9、0,0,4);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/*数学函数的定义*/#in

10、clude/*屏幕操作函数*/#include/*I/O函数*/#include/*库函数*/#include/*变量长度参数表*/#include/*图形函数*/#include/*字符串函数*/#include/*字符操作函数*/#defineUP0 x48/*光标上移键*/#defineDOWN0 x50/*光标下移键*/#defineLEFT0 x4b/*光标左移键*/#defineRIGHT0 x4d/*光标右移键*/#defineENTER0 x0d/*回车键*/void*rar;/*全局变量,保存光标图象*/structpalettetypepalette;/*使用调色板信息*/

11、intGraphDriver;/*图形设备驱动*/intGraphMode;/*图形模式值*/intErrorCode;/*错误代码*/intMaxColors;/*可用颜色的最大数值*/intMaxX,MaxY;/*屏幕的最大分辨率*/doubleAspectRatio;/*屏幕的像素比*/voiddrawboder(void);/*画边框函数*/voidinitialize(void);/*初始化函数*/voidcomputer(void);/*计算器计算函数*/voidchangetextstyle(intfont,intdirection,intcharsize);/*改变文本样式函数

12、*/voidmwindow(char*header);/*窗口函数*/intspecialkey(void);/*获取特殊键函数*/intarrow();/*设置箭头光标函数*/*主函数*/intmain()initialize();/*设置系统进入图形模式*/computer();/*运行计算器*/closegraph();/*系统关闭图形模式返回文本模式*/return(0);/*结束程序*/*设置系统进入图形模式*/voidinitialize(void)intxasp,yasp;/*用于读x和y方向纵横比*/GraphDriver=DETECT;/*自动检测显示器*/initgraph

13、(&GraphDriver,&GraphMode,);/*初始化图形系统*/ErrorCode=graphresult();/*读初始化结果*/if(ErrorCode!=grOk)/*如果初始化时出现错误*/printf(GraphicsSystemError:%sn,grapherrormsg(ErrorCode);/*显示错误代码*/exit(1);/*退出*/getpalette(&palette);/*读面板信息*/MaxColors=getmaxcolor()+1;/*读取颜色的最大值*/MaxX=getmaxx();/*读屏幕尺寸*/MaxY=getmaxy();/*读屏幕尺寸*

14、/getaspectratio(&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);/*画一个二维矩形条显示运算数和结果

16、*/setcolor(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

17、+width+width/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);/*在新的位置显示

18、光标箭头*/c=str1n*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*heigh

19、t/2);outtextxy(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为空,说明是负号,而不是减号*

20、/flag=-1;/*设置负数标志*/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/

22、2);outtextxy(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);/*将第二个操作数转

23、换为浮点数*/strcpy(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

24、:result=num1-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);/*覆盖结果区*/sp

25、rintf(temp,%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=

26、Q)exit(0);/*如果选择了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_WID

28、TH);/*设置画线方式*/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

29、=malloc(size);/*分配内存区域*/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&0 xff?key&0 xff:key8;/*只取特殊键的扫描值,其余为0*/return(key);/*返回键值*/案例三黑白棋游戏/*3.3.4源程序*/#includegraphics.h/*

30、图形系统头文件*/#defineLEFT0 x4b00/*光标左键值*/#defineRIGHT0 x4d00/*光标右键值*/#defineDOWN0 x5000/*光标下键值*/#defineUP0 x4800/*光标上键值*/#defineESC0 x011b/*ESC键值*/#defineENTER0 x1c0d/*回车键值*/inta88=0,key,score1,score2;/*具体分数以及按键与存放棋子的变量*/charplayone3,playtwo3;/*两个人的得分转换成字符串输出*/voidplaytoplay(void);/*人人对战函数*/voidDrawQp(vo

31、id);/*画棋盘函数*/voidSetPlayColor(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();/*画棋盘*/pla

32、ytoplay();/*人人对战*/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/*已经有棋子就继续按键*/continu

33、e;else/*四个方向按键的判断*/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,

34、15);SetPlayColor(t);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;/*一方走后,改变棋子颜色即轮对方走*/

35、cc=0;/*计数值恢复为0*/*endwhile*/voidSetPlayColor(intt)/*设置棋子颜色*/if(t%2=1)setfillstyle(SOLID_FILL,15);/*白色*/elsesetfillstyle(SOLID_FILL,8);/*灰色*/voidMoveColor(intx,inty)/*走了一步后恢复原来格子的状态*/if(y100)/*如果是从起点出发就恢复蓝色*/setfillstyle(SOLID_FILL,BLUE);else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/switch(a(x-120)/40(y-120)

36、/40)case1:setfillstyle(SOLID_FILL,15);break;/*白色*/case2:setfillstyle(SOLID_FILL,8);break;/*黑色*/default:setfillstyle(SOLID_FILL,BLUE);/*蓝色*/intQpChange(intx,inty,intt)/*判断棋盘的变化*/inti,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*计算数组元素的行下标*/j=(y-120)/40;/*计算数组元素的列下标*/SetPlayColor(t);/*设置棋子变化的颜色*/*开始往8个方向判断变化

37、*/if(j6)/*往右边*/for(k=j+1;k8;k+)if(aik=aij|aik=0)/*遇到自己的棋子或空格结束*/break;if(aik!=0&k8)for(kk=j+1;kkk&k1)/*判断左边*/for(k=j-1;k=0;k-)if(aik=aij|!aik)break;if(aik!=0&k=0)for(kk=j-1;kkk&k=0;kk-)aikk=aij;fillellipse(120+i*40,120+kk*40,15,15);if(kk!=j-1)yes=1;if(i6)/*判断下边*/for(k=i+1;k8;k+)if(akj=aij|!akj)break

38、;if(akj!=0&k8)for(kk=i+1;kkk&k1)/*判断上边*/for(k=i-1;k=0;k-)if(akj=aij|!akj)break;if(akj!=0&k=0)for(kk=i-1;kkk&k=0;kk-)akkj=aij;fillellipse(120+kk*40,120+j*40,15,15);if(kk!=i-1)yes=1;if(i1&j=0&kk=0&kkk&k=0;ii-,jj+)aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15);if(ii!=i-1)yes=1;if(i1)/*左下*/for(k=i+1,k

39、k=j-1;k=0;k+,kk-)if(akkk=aij|!akkk)break;if(akkk!=0&k=0)for(ii=i+1,jj=j-1;iik&k1&j1)/*左上*/for(k=i-1,kk=j-1;k=0&kk=0;k-,kk-)if(akkk=aij|!akkk)break;if(akkk!=0&k=0&kk=0)for(ii=i-1,jj=j-1;iik&k=0;ii-,jj-)aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15);if(ii!=i-1)yes=1;if(i6&j6)/*右下*/for(k=i+1,kk=j+1;k

40、k8&kk8;k+,kk+)if(akkk=aij|!akkk)break;if(akkk!=0&kk8&k8)for(ii=i+1,jj=j+1;iik&k8;ii+,jj+)aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15);if(ii!=i+1)yes=1;returnyes;/*返回是否改变过棋子颜色的标记*/voidDoScore()/*处理分数*/inti,j;score1=score2=0;/*重新开始计分数*/for(i=0;i8;i+)for(j=0;jscore1)/*开始判断最后的结果*/outtextxy(100,50,bl

41、ackwin!);elseif(score2score1)outtextxy(100,50,whitewin!);elseouttextxy(60,50,youallwin!);案例四迷宫问题/*4.3.3源程序*/#include#include#include#include#include#defineN20/*迷宫的大小,可改变*/intoldmapNN;/*递归用的数组,用全局变量节约时间*/intyes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/intway1002,wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/voidInit(void

42、);/*图形初始化*/voidClose(void);/*图形关闭*/voidDrawPeople(int*x,int*y,intn);/*画人工探索物图*/voidPeopleFind(int(*x)N);/*人工探索*/voidWayCopy(int(*x)N,int(*y)N);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/intFindWay(int(*x)N,inti,intj);/*自动探索函数*/voidMapRand(int(*x)N);/*随机生成迷宫函数*/voidPrMap(int(*x)N);/*输出迷宫图函数*/voidResult(void);/*输出结果处理*

43、/voidFind(void);/*成功处理*/voidNotFind(void);/*失败处理*/voidmain(void)/*主函数*/intmapNN;/*迷宫数组*/charch;clrscr();printf(nPleaseselecthand(1)elseauton);/*选择探索方式*/scanf(%c,&ch);Init();/*初始化*/MapRand(map);/*生成迷宫*/PrMap(map);/*显示迷宫图*/if(ch=1)PeopleFind(map);/*人工探索*/elseFindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/Resul

44、t();/*输出结果*/Close();voidInit(void)/*图形初始化*/intgd=DETECT,gm;initgraph(&gd,&gm,c:tc);voidDrawPeople(int*x,int*y,intn)/*画人工控制图*/*如果将以下两句注释掉,则显示人工走过的路径,*/setfillstyle(SOLID_FILL,WHITE);/*设置白色实体填充样式*/bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢复原通路*/switch(n)/*判断x,y的变化,8个方向的变化*/case1:(*

45、x)-;break;/*上*/case2:(*x)-;(*y)+;break;/*右上*/case3:(*y)+;break;/*右*/case4:(*x)+;(*y)+;break;/*右下*/case5:(*x)+;break;/*下*/case6:(*x)+;(*y)-;break;/*左下*/case7:(*y)-;break;/*左*/case8:(*x)-;(*y)-;break;/*左上*/setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15

46、+6);voidPeopleFind(int(*map)N)/*人工手动查找*/intx,y;charc=0;/*接收按键的变量*/x=y=1;/*人工查找的初始位置*/setcolor(11);line(500,200,550,200);outtextxy(570,197,d);line(500,200,450,200);outtextxy(430,197,a);line(500,200,500,150);outtextxy(497,130,w);line(500,200,500,250);outtextxy(497,270,x);line(500,200,450,150);outtextx

47、y(445,130,q);line(500,200,550,150);outtextxy(550,130,e);line(500,200,450,250);outtextxy(445,270,z);line(500,200,550,250);outtextxy(550,270,c);/*以上是画8个方向的控制介绍*/setcolor(YELLOW);outtextxy(420,290,PressEntertoend);/*压回车键结束*/setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入

48、口位置显示*/while(c!=13)/*如果按下的不是回车键*/c=getch();/*接收字符后开始各个方向的探索*/if(c=w&mapx-1y!=1)DrawPeople(&x,&y,1);/*上*/elseif(c=e&mapx-1y+1!=1)DrawPeople(&x,&y,2);/*右上*/elseif(c=d&mapxy+1!=1)DrawPeople(&x,&y,3);/*右*/elseif(c=c&mapx+1y+1!=1)DrawPeople(&x,&y,4);/*右下*/elseif(c=x&mapx+1y!=1)DrawPeople(&x,&y,5);/*下*/el

49、seif(c=z&mapx+1y-1!=1)DrawPeople(&x,&y,6);/*左下*/elseif(c=a&mapxy-1!=1)DrawPeople(&x,&y,7);/*左*/elseif(c=q&mapx-1y-1!=1)DrawPeople(&x,&y,8);/*左上*/setfillstyle(SOLID_FILL,WHITE);/*消去红色探索物,恢复原迷宫图*/bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x=N-2&y=N-2)/*人工控制找成功的话*/yes=1;/*如果成功标志为1*/voidWayCopy(i

50、nt(*oldmap)N,int(*map)N)/*拷贝迷宫数组*/inti,j;for(i=0;iN;i+)for(j=0;jN;j+)oldmapij=mapij;intFindWay(int(*map)N,inti,intj)/*递归找路*/if(i=N-2&j=N-2)/*走到出口*/yes=1;/*标志为1,表示成功*/return;mapij=1;/*走过的地方变为1*/WayCopy(oldmap,map);/*拷贝迷宫图*/if(oldmapi+1j+1=0&!yes)/*判断右下方是否可走*/FindWay(oldmap,i+1,j+1);if(yes)/*如果到达出口了,再

51、把值赋给显示路线的way数组,也正是这个原因,所以具体路线是从最后开始保存*/waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi+1j=0&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/FindWay(oldmap,i+1,j);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapij+1=0&!yes)/*判断右方是否可以走*/FindWay(oldmap,i,j+1);if(yes)waywayn0=i;waywa

52、yn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j=0&!yes)/*判断上方是否可以走*/FindWay(oldmap,i-1,j);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j+1=0&!yes)/*判断右上方是否可以走*/FindWay(oldmap,i-1,j+1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi+1j-1=0&!yes)/*判断左下方是否可以走

53、*/FindWay(oldmap,i+1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapij-1=0&!yes)/*判断左方是否可以走*/FindWay(oldmap,i,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j-1=0&!yes)/*判断左上方是否可以走*/FindWay(oldmap,i-1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;return

54、;voidMapRand(int(*map)N)/*开始的随机迷宫图*/inti,j;cleardevice();/*清屏*/randomize();/*随机数发生器*/for(i=0;iN;i+)for(j=0;jN;j+)if(i=0|i=N-1|j=0|j=N-1)/*最外面一圈为墙壁*/mapij=1;elseif(i=1&j=1|i=N-2&j=N-2)/*出发点与终点表示为可走的*/mapij=0;elsemapij=random(2);/*其它的随机生成0或1*/voidPrMap(int(*map)N)/*输出迷宫图*/inti,j;for(i=0;iN;i+)for(j=0;

55、j=0;i-)bar(100+wayi1*15-6,50+wayi0*15-6,100+wayi1*15+6,50+wayi0*15+6);sleep(1);/*控制显示时间*/bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/*在目标点标红色*/setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/outtextxy(130,400,Findaway!);voidNotFind(void)/*没找到通路*/setcolor(GREEN);settextstyle(0,0,2);

56、/*设置字体大小*/outtextxy(130,400,Notfindaway!);voidResult(void)/*结果处理*/if(yes)/*如果找到*/Find();else/*没找到路*/NotFind();getch();voidClose(void)/*图形关闭*/closegraph();案例五扫地雷游戏/*5.3.4源程序*/#include#include#include#defineLEFTPRESS0 xff01#defineLEFTCLICK0 xff10#defineLEFTDRAG0 xff19#defineMOUSEMOVE0 xff08structintnu

57、m;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/introundnum;/*统计格子周围有多少雷*/intflag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/Mine1010;intgameAGAIN=0;/*是否重来的变量*/intgamePLAY=0;/*是否是第一次玩游戏的标志*/intmineNUM;/*统计处理过的格子数*/charrandmineNUM3;/*显示数字的字符串*/intKeystate;intMouseExist;intMouseButton;intMouseX;intMouseY;voidInit(void);/*图形驱动*

58、/voidMouseOn(void);/*鼠标光标显示*/voidMouseOff(void);/*鼠标光标隐藏*/voidMouseSetXY(int,int);/*设置当前位置*/intLeftPress(void);/*左键按下*/intRightPress(void);/*鼠标右键按下*/voidMouseGetXY(void);/*得到当前位置*/voidControl(void);/*游戏开始,重新,关闭*/voidGameBegain(void);/*游戏开始画面*/voidDrawSmile(void);/*画笑脸*/voidDrawRedflag(int,int);/*显示红

59、旗*/voidDrawEmpty(int,int,int,int);/*两种空格子的显示*/voidGameOver(void);/*游戏结束*/voidGameWin(void);/*显示胜利*/intMineStatistics(int,int);/*统计每个格子周围的雷数*/intShowWhite(int,int);/*显示无雷区的空白部分*/voidGamePlay(void);/*游戏过程*/voidClose(void);/*图形关闭*/voidmain(void)Init();Control();Close();voidInit(void)/*图形开始*/intgd=DETEC

60、T,gm;initgraph(&gd,&gm,c:tc);voidClose(void)/*图形关闭*/closegraph();voidMouseOn(void)/*鼠标光标显示*/_AX=0 x01;geninterrupt(0 x33);voidMouseOff(void)/*鼠标光标隐藏*/_AX=0 x02;geninterrupt(0 x33);voidMouseSetXY(intx,inty)/*设置当前位置*/_CX=x;_DX=y;_AX=0 x04;geninterrupt(0 x33);intLeftPress(void)/*鼠标左键按下*/_AX=0 x03;genin

温馨提示

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

评论

0/150

提交评论