




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Good is good, but better carries it.精益求精,善益求善。C的十個(gè)經(jīng)典案例-案例一貪吃蛇游戲#defineN200#include#include#include#defineLEFT0 x4b00#defineRIGHT0 x4d00#defineDOWN0 x5000#defineUP0 x4800#defineESC0 x011binti,key;intscore=0;/*得分*/intgamespeed=50000;/*游戲速度自己調(diào)整*/structFoodintx;/*食物的橫坐標(biāo)*/inty;/*食物的縱坐標(biāo)*/intyes;/*判斷是否要出現(xiàn)食
2、物的變量*/food;/*食物的結(jié)構(gòu)體*/structSnakeintxN;intyN;intnode;/*蛇的節(jié)數(shù)*/intdirection;/*蛇移動(dòng)方向*/intlife;/*蛇的生命,0活著,1死亡*/snake;voidInit(void);/*圖形驅(qū)動(dòng)*/voidClose(void);/*圖形結(jié)束*/voidDrawK(void);/*開始畫面*/voidGameOver(void);/*結(jié)束游戲*/voidGamePlay(void);/*玩游戲具體過程*/voidPrScore(void);/*輸出成績(jī)*/*主函數(shù)*/voidmain(void)Init();/*圖形驅(qū)動(dòng)*
3、/DrawK();/*開始畫面*/GamePlay();/*玩游戲具體過程*/Close();/*圖形結(jié)束*/*圖形驅(qū)動(dòng)*/voidInit(void)intgd=DETECT,gm;initgraph(&gd,&gm,c:tc);cleardevice();/*開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/voidDrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/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-)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/snake.xi=snake.xi-1;snake.yi=snake.yi-1;/*1,2,3,4表示右,左,上,下四個(gè)方向,通過這個(gè)判斷來移動(dòng)蛇頭*/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+)/*從蛇的第四節(jié)開始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過來*/if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver();/*顯示失敗*/snake.life=1;break;if(snake.x0595|snake.y0455)/*蛇是否撞到墻壁*/GameOver();/*本次游戲結(jié)束*/snake.life=1;/*蛇死*/if(snake.life=1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始*/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;/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/snake.node+;/*蛇的身體長(zhǎng)一節(jié)*/food.yes=1;/*畫面上需要出現(xiàn)新的食物*/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);/*用黑色去除蛇的的最后一節(jié)*/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)/*如果蛇死就跳出循環(huán)*/break;key=bioskey(0);/*接收按鍵*/if(key=ESC)/*按ESC鍵退出*/break;elseif(key=UP&snak
8、e.direction!=4)/*判斷是否往相反的方向移動(dòng)*/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)*/*游戲結(jié)束*/voidGameOver(void)cleardevice();PrScore();setcolor(RED);settextstyle(
9、0,0,4);outtextxy(200,200,GAMEOVER);getch();/*輸出成績(jī)*/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);/*圖形結(jié)束*/voidClose(void)getch();closegraph();案例二計(jì)算器#include/*DOS接口函數(shù)*/#include/*數(shù)學(xué)函數(shù)的定義*/#in
10、clude/*屏幕操作函數(shù)*/#include/*I/O函數(shù)*/#include/*庫(kù)函數(shù)*/#include/*變量長(zhǎng)度參數(shù)表*/#include/*圖形函數(shù)*/#include/*字符串函數(shù)*/#include/*字符操作函數(shù)*/#defineUP0 x48/*光標(biāo)上移鍵*/#defineDOWN0 x50/*光標(biāo)下移鍵*/#defineLEFT0 x4b/*光標(biāo)左移鍵*/#defineRIGHT0 x4d/*光標(biāo)右移鍵*/#defineENTER0 x0d/*回車鍵*/void*rar;/*全局變量,保存光標(biāo)圖象*/structpalettetypepalette;/*使用調(diào)色板信息*/
11、intGraphDriver;/*圖形設(shè)備驅(qū)動(dòng)*/intGraphMode;/*圖形模式值*/intErrorCode;/*錯(cuò)誤代碼*/intMaxColors;/*可用顏色的最大數(shù)值*/intMaxX,MaxY;/*屏幕的最大分辨率*/doubleAspectRatio;/*屏幕的像素比*/voiddrawboder(void);/*畫邊框函數(shù)*/voidinitialize(void);/*初始化函數(shù)*/voidcomputer(void);/*計(jì)算器計(jì)算函數(shù)*/voidchangetextstyle(intfont,intdirection,intcharsize);/*改變文本樣式函數(shù)
12、*/voidmwindow(char*header);/*窗口函數(shù)*/intspecialkey(void);/*獲取特殊鍵函數(shù)*/intarrow();/*設(shè)置箭頭光標(biāo)函數(shù)*/*主函數(shù)*/intmain()initialize();/*設(shè)置系統(tǒng)進(jìn)入圖形模式*/computer();/*運(yùn)行計(jì)算器*/closegraph();/*系統(tǒng)關(guān)閉圖形模式返回文本模式*/return(0);/*結(jié)束程序*/*設(shè)置系統(tǒng)進(jìn)入圖形模式*/voidinitialize(void)intxasp,yasp;/*用于讀x和y方向縱橫比*/GraphDriver=DETECT;/*自動(dòng)檢測(cè)顯示器*/initgraph
13、(&GraphDriver,&GraphMode,);/*初始化圖形系統(tǒng)*/ErrorCode=graphresult();/*讀初始化結(jié)果*/if(ErrorCode!=grOk)/*如果初始化時(shí)出現(xiàn)錯(cuò)誤*/printf(GraphicsSystemError:%sn,grapherrormsg(ErrorCode);/*顯示錯(cuò)誤代碼*/exit(1);/*退出*/getpalette(&palette);/*讀面板信息*/MaxColors=getmaxcolor()+1;/*讀取顏色的最大值*/MaxX=getmaxx();/*讀屏幕尺寸*/MaxY=getmaxy();/*讀屏幕尺寸*
14、/getaspectratio(&xasp,&yasp);/*拷貝縱橫比到變量中*/AspectRatio=(double)xasp/(double)yasp;/*計(jì)算縱橫比值*/*計(jì)算器函數(shù)*/voidcomputer(void)structviewporttypevp;/*定義視口類型變量*/intcolor,height,width;intx,y,x0,y0,i,j,v,m,n,act,flag=1;floatnum1=0,num2=0,result;/*操作數(shù)和計(jì)算結(jié)果變量*/charcnum5,str220=,c,temp20=;charstr1=1230.456+-789*/Qc=
15、%;/*定義字符串在按鈕圖形上顯示的符號(hào)*/mwindow(Calculator);/*顯示主窗口*/color=7;/*設(shè)置灰顏色值*/getviewsettings(&vp);/*讀取當(dāng)前窗口的大小*/width=(vp.right+1)/10;/*設(shè)置按鈕寬度*/height=(vp.bottom-10)/10;/*設(shè)置按鈕高度*/x=width/2;/*設(shè)置x的坐標(biāo)值*/y=height/2;/*設(shè)置y的坐標(biāo)值*/setfillstyle(SOLID_FILL,color+3);bar(x+width*2,y,x+7*width,y+height);/*畫一個(gè)二維矩形條顯示運(yùn)算數(shù)和結(jié)果
16、*/setcolor(color+3);/*設(shè)置淡綠顏色邊框線*/rectangle(x+width*2,y,x+7*width,y+height);/*畫一個(gè)矩形邊框線*/setcolor(RED);/*設(shè)置顏色為紅色*/outtextxy(x+3*width,y+height/2,0.);/*輸出字符串0.*/x=2*width-width/2;/*設(shè)置x的坐標(biāo)值*/y=2*height+height/2;/*設(shè)置y的坐標(biāo)值*/for(j=0;j4;+j)/*畫按鈕*/for(i=0;i=x0+6*width)/*如果右移,移到尾,則移動(dòng)到最左邊字符位置*/x=x0;m=0;elsex=x
17、+width+width/2;m+;/*否則,右移到下一個(gè)字符位置*/if(v=LEFT)/*左移箭頭時(shí)新位置計(jì)算*/if(x=x0)x=x0+6*width;m=4;/*如果移到頭,再左移,則移動(dòng)到最右邊字符位置*/elsex=x-width-width/2;m-;/*否則,左移到前一個(gè)字符位置*/if(v=UP)/*上移箭頭時(shí)新位置計(jì)算*/if(y=7*height)y=y0;n=0;/*如果移到尾,再下移,則移動(dòng)到最上邊字符位置*/elsey=y+height+height/2;n+;/*否則,移到下邊一個(gè)字符位置*/putimage(x,y,rar,XOR_PUT);/*在新的位置顯示
18、光標(biāo)箭頭*/c=str1n*5+m;/*將字符保存到變量c中*/if(isdigit(c)|c=.)/*判斷是否是數(shù)字或小數(shù)點(diǎn)*/if(flag=-1)/*如果標(biāo)志為-1,表明為負(fù)數(shù)*/strcpy(str2,-);/*將負(fù)號(hào)連接到字符串中*/flag=1;/*將標(biāo)志值恢復(fù)為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);/*將第一個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=1;/*做計(jì)算加法標(biāo)志值*/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為空,說明是負(fù)號(hào),而不是減號(hào)*
20、/flag=-1;/*設(shè)置負(fù)數(shù)標(biāo)志*/elsenum1=atof(str2);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=2;/*做計(jì)算減法標(biāo)志值*/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);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=3;
21、/*做計(jì)算乘法標(biāo)志值*/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);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=4;/*做計(jì)算除法標(biāo)志值*/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);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=5;/*做計(jì)算乘方標(biāo)志值*/setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實(shí)體填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/outtextxy(5*width,height,0.);/*顯示字符串*/if(c=%)num1=atof(str2);/*將第二個(gè)操作數(shù)轉(zhuǎn)
23、換為浮點(diǎn)數(shù)*/strcpy(str2,);/*將str2清空*/act=6;/*做計(jì)算模運(yùn)算乘方標(biāo)志值*/setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實(shí)體填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/outtextxy(5*width,height,0.);/*顯示字符串*/if(c=)num2=atof(str2);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/switch(act)/*根據(jù)運(yùn)算符號(hào)計(jì)算*/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;/*做模運(yùn)算*/setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實(shí)體填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/sp
25、rintf(temp,%f,result);/*將結(jié)果保存到temp中*/outtextxy(5*width,height,temp);/*顯示結(jié)果*/if(c=c)num1=0;/*將兩個(gè)操作數(shù)復(fù)位0,符號(hào)標(biāo)志為1*/num2=0;flag=1;strcpy(str2,);/*將str2清空*/setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實(shí)體填充*/bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/outtextxy(5*width,height,0.);/*顯示字符串*/if(c=
26、Q)exit(0);/*如果選擇了q回車,結(jié)束計(jì)算程序*/putimage(x,y,rar,XOR_PUT);/*在退出之前消去光標(biāo)箭頭*/return;/*返回*/*窗口函數(shù)*/voidmwindow(char*header)intheight;cleardevice();/*清除圖形屏幕*/setcolor(MaxColors-1);/*設(shè)置當(dāng)前顏色為白色*/setviewport(20,20,MaxX/2,MaxY/2,1);/*設(shè)置視口大小*/height=textheight(H);/*讀取基本文本大小*/settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
27、/*設(shè)置文本樣式*/settextjustify(CENTER_TEXT,TOP_TEXT);/*設(shè)置字符排列方式*/outtextxy(MaxX/4,2,header);/*輸出標(biāo)題*/setviewport(20,20+height+4,MaxX/2+4,MaxY/2+20,1);/*設(shè)置視口大小*/drawboder();/*畫邊框*/voiddrawboder(void)/*畫邊框*/structviewporttypevp;/*定義視口類型變量*/setcolor(MaxColors-1);/*設(shè)置當(dāng)前顏色為白色*/setlinestyle(SOLID_LINE,0,NORM_WID
28、TH);/*設(shè)置畫線方式*/getviewsettings(&vp);/*將當(dāng)前視口信息裝入vp所指的結(jié)構(gòu)中*/rectangle(0,0,vp.right-vp.left,vp.bottom-vp.top);/*畫矩形邊框*/*設(shè)計(jì)鼠標(biāo)圖形函數(shù)*/intarrow()intsize;intraw=4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4;/*定義多邊形坐標(biāo)*/setfillstyle(SOLID_FILL,2);/*設(shè)置填充模式*/fillpoly(8,raw);/*畫出一光標(biāo)箭頭*/size=imagesize(4,4,16,16);/*測(cè)試圖象大小*/rar
29、=malloc(size);/*分配內(nèi)存區(qū)域*/getimage(4,4,16,16,rar);/*存放光標(biāo)箭頭圖象*/putimage(4,4,rar,XOR_PUT);/*消去光標(biāo)箭頭圖象*/return0;/*按鍵函數(shù)*/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、圖形系統(tǒng)頭文件*/#defineLEFT0 x4b00/*光標(biāo)左鍵值*/#defineRIGHT0 x4d00/*光標(biāo)右鍵值*/#defineDOWN0 x5000/*光標(biāo)下鍵值*/#defineUP0 x4800/*光標(biāo)上鍵值*/#defineESC0 x011b/*ESC鍵值*/#defineENTER0 x1c0d/*回車鍵值*/inta88=0,key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/charplayone3,playtwo3;/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/voidplaytoplay(void);/*人人對(duì)戰(zhàn)函數(shù)*/voidDrawQp(vo
31、id);/*畫棋盤函數(shù)*/voidSetPlayColor(intx);/*設(shè)置棋子第一次的顏色*/voidMoveColor(intx,inty);/*恢復(fù)原來棋盤狀態(tài)*/intQpChange(intx,inty,intz);/*判斷棋盤的變化*/voidDoScore(void);/*處理分?jǐn)?shù)*/voidPrintScore(intn);/*輸出成績(jī)*/voidplayWin(void);/*輸出勝利者信息*/*主函數(shù)*/voidmain(void)intgd=DETECT,gr;initgraph(&gd,&gr,c:tc);/*初始化圖形系統(tǒng)*/DrawQp();/*畫棋盤*/pla
32、ytoplay();/*人人對(duì)戰(zhàn)*/getch();closegraph();/*關(guān)閉圖形系統(tǒng)*/voidDrawQp()/*畫棋盤*/inti,j;score1=score2=0;/*棋手一開始得分都為0*/setbkcolor(BLUE);for(i=100;i=64-score1-score2)/*如果嘗試超過空格數(shù)則停步*/MoveColor(x,y);fillellipse(x,y,15,15);break;elsecontinue;/*如果按鍵無效*/DoScore();/*分?jǐn)?shù)的改變*/break;/*棋盤變化了,則輪對(duì)方走棋*/else/*已經(jīng)有棋子就繼續(xù)按鍵*/continu
33、e;else/*四個(gè)方向按鍵的判斷*/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)/*結(jié)束游戲*/break;if(score1+score2)=64|score1=0|score2=0)/*格子已經(jīng)占滿或一方棋子為0判斷勝負(fù)*/playWin();/*輸出最后結(jié)果*/break;t=t%2+1;/*一方走后,改變棋子顏色即輪對(duì)方走*/
35、cc=0;/*計(jì)數(shù)值恢復(fù)為0*/*endwhile*/voidSetPlayColor(intt)/*設(shè)置棋子顏色*/if(t%2=1)setfillstyle(SOLID_FILL,15);/*白色*/elsesetfillstyle(SOLID_FILL,8);/*灰色*/voidMoveColor(intx,inty)/*走了一步后恢復(fù)原來格子的狀態(tài)*/if(y100)/*如果是從起點(diǎn)出發(fā)就恢復(fù)藍(lán)色*/setfillstyle(SOLID_FILL,BLUE);else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍(lán)色棋盤*/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);/*藍(lán)色*/intQpChange(intx,inty,intt)/*判斷棋盤的變化*/inti,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*計(jì)算數(shù)組元素的行下標(biāo)*/j=(y-120)/40;/*計(jì)算數(shù)組元素的列下標(biāo)*/SetPlayColor(t);/*設(shè)置棋子變化的顏色*/*開始往8個(gè)方向判斷變化
37、*/if(j6)/*往右邊*/for(k=j+1;k8;k+)if(aik=aij|aik=0)/*遇到自己的棋子或空格結(jié)束*/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;/*返回是否改變過棋子顏色的標(biāo)記*/voidDoScore()/*處理分?jǐn)?shù)*/inti,j;score1=score2=0;/*重新開始計(jì)分?jǐn)?shù)*/for(i=0;i8;i+)for(j=0;jscore1)/*開始判斷最后的結(jié)果*/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;/*遞歸用的數(shù)組,用全局變量節(jié)約時(shí)間*/intyes=0;/*yes是判斷是否找到路的標(biāo)志,1找到,0沒找到*/intway1002,wayn=0;/*way數(shù)組是顯示路線用的,wayn是統(tǒng)計(jì)走了幾個(gè)格子*/voidInit(void
42、);/*圖形初始化*/voidClose(void);/*圖形關(guān)閉*/voidDrawPeople(int*x,int*y,intn);/*畫人工探索物圖*/voidPeopleFind(int(*x)N);/*人工探索*/voidWayCopy(int(*x)N,int(*y)N);/*為了8個(gè)方向的遞歸,把舊迷宮圖拷貝給新數(shù)組*/intFindWay(int(*x)N,inti,intj);/*自動(dòng)探索函數(shù)*/voidMapRand(int(*x)N);/*隨機(jī)生成迷宮函數(shù)*/voidPrMap(int(*x)N);/*輸出迷宮圖函數(shù)*/voidResult(void);/*輸出結(jié)果處理*
43、/voidFind(void);/*成功處理*/voidNotFind(void);/*失敗處理*/voidmain(void)/*主函數(shù)*/intmapNN;/*迷宮數(shù)組*/charch;clrscr();printf(nPleaseselecthand(1)elseauton);/*選擇探索方式*/scanf(%c,&ch);Init();/*初始化*/MapRand(map);/*生成迷宮*/PrMap(map);/*顯示迷宮圖*/if(ch=1)PeopleFind(map);/*人工探索*/elseFindWay(map,1,1);/*系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開始探索*/Resul
44、t();/*輸出結(jié)果*/Close();voidInit(void)/*圖形初始化*/intgd=DETECT,gm;initgraph(&gd,&gm,c:tc);voidDrawPeople(int*x,int*y,intn)/*畫人工控制圖*/*如果將以下兩句注釋掉,則顯示人工走過的路徑,*/setfillstyle(SOLID_FILL,WHITE);/*設(shè)置白色實(shí)體填充樣式*/bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢復(fù)原通路*/switch(n)/*判斷x,y的變化,8個(gè)方向的變化*/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)/*人工手動(dòng)查找*/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個(gè)方向的控制介紹*/setcolor(YELLOW);outtextxy(420,290,PressEntertoend);/*壓回車鍵結(jié)束*/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();/*接收字符后開始各個(gè)方向的探索*/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);/*消去紅色探索物,恢復(fù)原迷宮圖*/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;/*如果成功標(biāo)志為1*/voidWayCopy(i
50、nt(*oldmap)N,int(*map)N)/*拷貝迷宮數(shù)組*/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;/*標(biāo)志為1,表示成功*/return;mapij=1;/*走過的地方變?yōu)?*/WayCopy(oldmap,map);/*拷貝迷宮圖*/if(oldmapi+1j+1=0&!yes)/*判斷右下方是否可走*/FindWay(oldmap,i+1,j+1);if(yes)/*如果到達(dá)出口了,再
51、把值賦給顯示路線的way數(shù)組,也正是這個(gè)原因,所以具體路線是從最后開始保存*/waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi+1j=0&!yes)/*判斷下方是否可以走,如果標(biāo)志yes已經(jīng)是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)/*開始的隨機(jī)迷宮圖*/inti,j;cleardevice();/*清屏*/randomize();/*隨機(jī)數(shù)發(fā)生器*/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)/*出發(fā)點(diǎn)與終點(diǎn)表示為可走的*/mapij=0;elsemapij=random(2);/*其它的隨機(jī)生成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);/*控制顯示時(shí)間*/bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/*在目標(biāo)點(diǎn)標(biāo)紅色*/setcolor(GREEN);settextstyle(0,0,2);/*設(shè)置字體大小*/outtextxy(130,400,Findaway!);voidNotFind(void)/*沒找到通路*/setcolor(GREEN);settextstyle(0,0,2);
56、/*設(shè)置字體大小*/outtextxy(130,400,Notfindaway!);voidResult(void)/*結(jié)果處理*/if(yes)/*如果找到*/Find();else/*沒找到路*/NotFind();getch();voidClose(void)/*圖形關(guān)閉*/closegraph();案例五掃地雷游戲/*5.3.4源程序*/#include#include#include#defineLEFTPRESS0 xff01#defineLEFTCLICK0 xff10#defineLEFTDRAG0 xff19#defineMOUSEMOVE0 xff08structintnu
57、m;/*格子當(dāng)前處于什么狀態(tài),1有雷,0已經(jīng)顯示過數(shù)字或者空白格子*/introundnum;/*統(tǒng)計(jì)格子周圍有多少雷*/intflag;/*右鍵按下顯示紅旗的標(biāo)志,0沒有紅旗標(biāo)志,1有紅旗標(biāo)志*/Mine1010;intgameAGAIN=0;/*是否重來的變量*/intgamePLAY=0;/*是否是第一次玩游戲的標(biāo)志*/intmineNUM;/*統(tǒng)計(jì)處理過的格子數(shù)*/charrandmineNUM3;/*顯示數(shù)字的字符串*/intKeystate;intMouseExist;intMouseButton;intMouseX;intMouseY;voidInit(void);/*圖形驅(qū)動(dòng)*
58、/voidMouseOn(void);/*鼠標(biāo)光標(biāo)顯示*/voidMouseOff(void);/*鼠標(biāo)光標(biāo)隱藏*/voidMouseSetXY(int,int);/*設(shè)置當(dāng)前位置*/intLeftPress(void);/*左鍵按下*/intRightPress(void);/*鼠標(biāo)右鍵按下*/voidMouseGetXY(void);/*得到當(dāng)前位置*/voidControl(void);/*游戲開始,重新,關(guān)閉*/voidGameBegain(void);/*游戲開始畫面*/voidDrawSmile(void);/*畫笑臉*/voidDrawRedflag(int,int);/*顯示紅
59、旗*/voidDrawEmpty(int,int,int,int);/*兩種空格子的顯示*/voidGameOver(void);/*游戲結(jié)束*/voidGameWin(void);/*顯示勝利*/intMineStatistics(int,int);/*統(tǒng)計(jì)每個(gè)格子周圍的雷數(shù)*/intShowWhite(int,int);/*顯示無雷區(qū)的空白部分*/voidGamePlay(void);/*游戲過程*/voidClose(void);/*圖形關(guān)閉*/voidmain(void)Init();Control();Close();voidInit(void)/*圖形開始*/intgd=DETEC
60、T,gm;initgraph(&gd,&gm,c:tc);voidClose(void)/*圖形關(guān)閉*/closegraph();voidMouseOn(void)/*鼠標(biāo)光標(biāo)顯示*/_AX=0 x01;geninterrupt(0 x33);voidMouseOff(void)/*鼠標(biāo)光標(biāo)隱藏*/_AX=0 x02;geninterrupt(0 x33);voidMouseSetXY(intx,inty)/*設(shè)置當(dāng)前位置*/_CX=x;_DX=y;_AX=0 x04;geninterrupt(0 x33);intLeftPress(void)/*鼠標(biāo)左鍵按下*/_AX=0 x03;genin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省臨沂市河?xùn)|區(qū)、費(fèi)縣2024-2025學(xué)年高二下學(xué)期期中聯(lián)考?xì)v史試題(含答案)
- 關(guān)于農(nóng)作物種子繁育的常識(shí)及試題及答案
- 2024年裁判員考試交流平臺(tái)試題及答案
- 模具設(shè)計(jì)師資格認(rèn)證之復(fù)習(xí)計(jì)劃與試題答案
- 2024年籃球裁判員考試流程介紹試題及答案
- 預(yù)算管理相關(guān)內(nèi)容試題及答案
- 2025年天津市公務(wù)員考試省考行測(cè)B類歷年真題試卷試題答案解析
- 農(nóng)業(yè)植保員在社會(huì)服務(wù)中的角色與貢獻(xiàn)試題及答案
- 條理分明游泳救生員職業(yè)試題及答案
- 模具設(shè)計(jì)項(xiàng)目中的溝通技巧試題及答案
- 新工人進(jìn)場(chǎng)三級(jí)教育表格
- 全過程工程咨詢服務(wù)投標(biāo)方案(技術(shù)方案)
- 2024年新人教版七年級(jí)上冊(cè)歷史教學(xué)課件 第10課 秦末農(nóng)民大起義
- 寫字樓保潔人員培訓(xùn)方案(技術(shù)方案)
- (附著式升降腳手架)設(shè)備設(shè)施風(fēng)險(xiǎn)分級(jí)管控清單
- 扶濟(jì)復(fù)新獲獎(jiǎng)?wù)n件
- 外協(xié)救援服務(wù)協(xié)議
- 工業(yè)機(jī)器人的發(fā)展歷史
- DL∕T 2547-2022 交流斷面失電監(jiān)測(cè)裝置技術(shù)規(guī)范
- 高齡患者的麻醉管理策略
- 小小科學(xué)家《物理》模擬試卷A(附答案)
評(píng)論
0/150
提交評(píng)論