第一篇:編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編
編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編.txt讓人想念而死,是謀殺的至高境界,就連法醫(yī)也鑒定不出死因。。。C語(yǔ)言 編游戲案例精編 案例一 貪吃蛇游戲 #define N 200 #include
food.x++;while(food.y%10!=0)
food.y++;
food.yes=0;/*畫(huà)面上有食物了*/ } if(food.yes==0)/*畫(huà)面上有食物了就要顯示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i snake.direction=2;else if(key==DOWN&&snake.direction!=3) snake.direction=4;}/*endwhile(1)*/ } /*游戲結(jié)束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*輸出成績(jī)*/ void PrScore(void){ char str[10];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é)束*/ void Close(void){ getch();closegraph();} 案例二 計(jì)算器 #include x=x0; m=0;} else { x=x+width+width/2; m++;} /*否則,右移到下一個(gè)字符位置*/ if(v==LEFT)/*左移箭頭時(shí)新位置計(jì)算*/ if(x<=x0){ x=x0+6*width; m=4;} /*如果移到頭,再左移,則移動(dòng)到最右邊字符位置*/ else { x=x-width-width/2; m--;} /*否則,左移到前一個(gè)字符位置*/ if(v==UP)/*上移箭頭時(shí)新位置計(jì)算*/ if(y<=y0){ y=y0+4*height+height/2; n=3;} /*如果移到頭,再上移,則移動(dòng)到最下邊字符位置*/ else { y=y-height-height/2;n--;} /*否則,移到上邊一個(gè)字符位置*/ if(v==DOWN)/*下移箭頭時(shí)新位置計(jì)算*/ if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,則移動(dòng)到最上邊字符位置*/ else { y=y+height+height/2; n++;} /*否則,移到下邊一個(gè)字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置顯示光標(biāo)箭頭*/ } c=str1[n*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*height/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為空,說(shuō)明是負(fù)號(hào),而不是減號(hào)*/ flag=-1;/*設(shè)置負(fù)數(shù)標(biāo)志*/ else { num1=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);/*畫(huà)矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } } if(c=='*'){ num1=atof(str2);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=3;/*做計(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/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);/*畫(huà)矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='%'){ num1=atof(str2);/*將第二個(gè)操作數(shù)轉(zhuǎn)換為浮點(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);/*畫(huà)矩形*/ 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ì)算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做減法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6: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ū)*/ sprintf(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=='Q')exit(0);/*如果選擇了q回車,結(jié)束計(jì)算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光標(biāo)箭頭*/ return;/*返回*/ } /*窗口函數(shù)*/ void mwindow(char *header){ int height;cleardevice(); /* 清除圖形屏幕 */ setcolor(MaxColors1);/*設(shè)置當(dāng)前顏色為白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*設(shè)置畫(huà)線方式*/ getviewsettings(&vp);/*將當(dāng)前視口信息裝入vp所指的結(jié)構(gòu)中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*畫(huà)矩形邊框*/ } /*設(shè)計(jì)鼠標(biāo)圖形函數(shù)*/ int arrow(){ int size;int raw[]={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);/*畫(huà)出一光標(biāo)箭頭*/ size=imagesize(4,4,16,16);/*測(cè)試圖象大小*/ rar=malloc(size);/*分配內(nèi)存區(qū)域*/ getimage(4,4,16,16,rar);/*存放光標(biāo)箭頭圖象*/ putimage(4,4,rar,XOR_PUT);/*消去光標(biāo)箭頭圖象*/ return 0;} /*按鍵函數(shù)*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待鍵盤(pán)輸入*/ key=bioskey(0);/*鍵盤(pán)輸入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊鍵的掃描值,其余為0*/ return(key);/*返回鍵值*/ } 案例三 黑白棋游戲 #include ”graphics.h“ /*圖形系統(tǒng)頭文件*/ #define LEFT 0x4b00 /*光標(biāo)左鍵值*/ #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/ #define DOWN 0x5000 /*光標(biāo)下鍵值*/ #define UP 0x4800 /*光標(biāo)上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/ void playtoplay(void);/*人人對(duì)戰(zhàn)函數(shù)*/ void DrawQp(void);/*畫(huà)棋盤(pán)函數(shù)*/ void SetPlayColor(int x);/*設(shè)置棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復(fù)原來(lái)棋盤(pán)狀態(tài)*/ int QpChange(int x,int y,int z);/*判斷棋盤(pán)的變化*/ void DoScore(void);/*處理分?jǐn)?shù)*/ void PrintScore(int n);/*輸出成績(jī)*/ void playWin(void);/*輸出勝利者信息*/ /******主函數(shù)*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化圖形系統(tǒng)*/ DrawQp();/*畫(huà)棋盤(pán)*/ playtoplay();/*人人對(duì)戰(zhàn)*/ getch();closegraph();/*關(guān)閉圖形系統(tǒng)*/ } void DrawQp()/*畫(huà)棋盤(pán)*/ { int i,j;score1=score2=0;/*棋手一開(kāi)始得分都為0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*畫(huà)水平線*/ line(i,100,i,420);/*畫(huà)垂直線*/ } setcolor(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實(shí)體填充模式*/ fillellipse(500,200,15,15);/*在顯示得分的位置畫(huà)棋*/ setfillstyle(SOLID_FILL,8);/*黑色實(shí)體填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始兩個(gè)黑棋*/ a[3][4]=a[4][3]=2;/*初始兩個(gè)白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改變分?jǐn)?shù)*/ DoScore();/*輸出開(kāi)始分?jǐn)?shù)*/ } void playtoplay()/*人人對(duì)戰(zhàn)*/ { int x,y,t=1,i,j,cc=0;while(1)/*換棋手走棋*/ { x=120,y=80;/*每次棋子一開(kāi)始出來(lái)的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/ while(1)/*具體一個(gè)棋手走棋的過(guò)程*/ { PrintScore(1);/*輸出棋手1的成績(jī)*/ PrintScore(2);/*輸出棋手2的成績(jī)*/ SetPlayColor(t);/*t變量是用來(lái)判斷棋手所執(zhí)棋子的顏色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*跳出游戲*/ break;else if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒(méi)有棋子*/ { if(t%2==1)/*如果是棋手1移動(dòng)*/ a[(x-120)/40][(y-120)/40]=1;else/*否則棋手2移動(dòng)*/ a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判斷棋盤(pán)的變化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢復(fù)空格狀態(tài)*/ cc++;/*開(kāi)始統(tǒng)計(jì)嘗試次數(shù)*/ if(cc>=64-score1-score2)/*如果嘗試超過(guò)空格數(shù)則停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break;} else continue;/*如果按鍵無(wú)效*/ } DoScore();/*分?jǐn)?shù)的改變*/ break;/*棋盤(pán)變化了,則輪對(duì)方走棋*/ } else/*已經(jīng)有棋子就繼續(xù)按鍵*/ continue;} else /*四個(gè)方向按鍵的判斷*/ if(key==LEFT&&x>120)/*左方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向鍵*/ { 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ì)方走*/ cc=0;/*計(jì)數(shù)值恢復(fù)為0*/ } /*endwhile*/ } void SetPlayColor(int t)/*設(shè)置棋子顏色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢復(fù)原來(lái)格子的狀態(tài)*/ { if(y<100)/*如果是從起點(diǎn)出發(fā)就恢復(fù)藍(lán)色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍(lán)色棋盤(pán)*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*藍(lán)色*/ } } int QpChange(int x,int y,int t)/*判斷棋盤(pán)的變化*/ { int i,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è)置棋子變化的顏色*/ /*開(kāi)始往8個(gè)方向判斷變化*/ if(j<6)/*往右邊*/ { for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結(jié)束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk 案例四 迷宮問(wèn)題 #include DrawPeople(&x,&y,4);/*右下*/ else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5);/*下*/ else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6);/*左下*/ else if(c=='a'&&map[x][y-1]!=1) DrawPeople(&x,&y,7);/*左*/ else if(c=='q'&&map[x-1][y-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*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷貝迷宮數(shù)組 */ { int i,j;for(i=0;i 案例五 掃地雷游戲 #include if(i==9&&j==9)/*右下角格子的統(tǒng)計(jì)*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左邊第一列格子的統(tǒng)計(jì)*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右邊第一列格子的統(tǒng)計(jì)*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的統(tǒng)計(jì)*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;} else if(i==9)/*最后一行格子的統(tǒng)計(jì)*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;} else/*普通格子的統(tǒng)計(jì)*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;if(Mine[i+1][j].num==1) nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;} return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計(jì)結(jié)果返回*/ } int ShowWhite(int i,int j)/*顯示無(wú)雷區(qū)的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過(guò)就不對(duì)該格進(jìn)行任何判斷*/ return;mineNUM--;/*顯示過(guò)數(shù)字或者空格的格子就表示多處理了一個(gè)格子,當(dāng)所有格子都處理過(guò)了表示勝利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*輸出雷數(shù)*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已經(jīng)輸出雷數(shù)的格子用0表示已經(jīng)用過(guò)這個(gè)格子*/ return;} /*8個(gè)方向遞歸顯示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戲過(guò)程*/ { int i,j,Num;/*Num用來(lái)接收統(tǒng)計(jì)函數(shù)返回一個(gè)格子周圍有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計(jì)每個(gè)格子周圍有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠標(biāo)左鍵盤(pán)按下*/ { */ */ MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來(lái)*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi) { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無(wú)效*/ continue;if(Mine[i][j].num!=0)/*如果格子沒(méi)有處理過(guò)*/ { if(Mine[i][j].num==1)/*鼠標(biāo)按下的格子是地雷*/ { MouseOff();GameOver();/*游戲失敗*/ break;} else/*鼠標(biāo)按下的格子不是地雷*/ { MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周圍沒(méi)地雷就用遞歸算法來(lái)顯示空白格子*/ ShowWhite(i,j);else/*按下格子周圍有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*輸出當(dāng)前格子周圍的雷數(shù)*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;} MouseOn();Mine[i][j].num=0;/*點(diǎn)過(guò)的格子周圍雷數(shù)的數(shù)字變?yōu)?表示這個(gè)格子已經(jīng)用過(guò) if(mineNUM<1)/*勝利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠標(biāo)右鍵鍵盤(pán)按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來(lái)沒(méi)紅旗現(xiàn)在顯示紅旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有紅旗標(biāo)志再按右鍵就紅旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn();sleep(1);} } } 案例六 速算24 #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系統(tǒng)時(shí)間函數(shù)*/ #include ”graphics.h“ /*圖形函數(shù)*/ #include ”alloc.h“/*動(dòng)態(tài)地址分配函數(shù)*/ #include ”stdlib.h“ /*庫(kù)函數(shù)*/ #include ”string.h“ /*字符串函數(shù)*/ #include ”ctype.h“ /*字符操作函數(shù)*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*撲克牌,10用0來(lái)表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*棧1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*棧2*/ void init(void);/*圖形驅(qū)動(dòng)*/ void close(void);/*圖形關(guān)閉*/ void play(void);/*發(fā)牌的具體過(guò)程*/ void rand1(int j);/*隨機(jī)發(fā)牌函數(shù)*/ void change(char *e,char *a);/*中綴變后綴函數(shù)*/ int computer(char *s);/*后綴表達(dá)式計(jì)算函數(shù)*/ STACK1 *initstack1(STACK1 *top);/*棧1初始化*/ STACK1 *push(STACK1 *top,int x);/*棧1入棧運(yùn)算*/ STACK1 *pop(STACK1 *top);/*棧1刪除棧頂元素*/ int topx(STACK1 *top);/*棧1讀棧頂元素*/ STACK1 *ptop(STACK1 *top,int *x);/*棧1讀出棧頂元素值并刪除棧頂元素*/ int empty(STACK1 *top);/*判棧1是否為空函數(shù)*/ STACK2 *initstack2(STACK2 *top);/*棧2初始化*/ STACK2 *push2(STACK2 *top,char x);/*棧2入棧運(yùn)算*/ STACK2 *pop2(STACK2 *top);/*棧2刪除棧頂元素*/ char topx2(STACK2 *top);/*棧2讀棧頂元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*棧2讀出棧頂元素值并刪除棧頂元素*/ int empty2(STACK2 *top);/*判棧2是否為空函數(shù)* int text1(char *s);/*顯示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函數(shù)*/ while(1){ setbkcolor(BLACK);/*設(shè)置背景顏色*/ cleardevice();/*清屏*/ play();/*發(fā)牌*/ gotoxy(1,15);/*移動(dòng)光標(biāo)*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示輸入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*輸入字符串壓回車鍵*/ change(s1,s);/*調(diào)用change函數(shù)將中綴表達(dá)式s1轉(zhuǎn)換為后綴表達(dá)式s*/ result=computer(s);/*計(jì)算后綴表達(dá)式的值,返回結(jié)果result */ if(result==24)/*如果結(jié)果等于24*/ text1(”very good“);/*調(diào)用函數(shù)text1顯示字符串”very good“*/ else text1(”wrong!!“);/*否則函數(shù)text1顯示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否繼續(xù)*/ scanf(”%c“,&ch);/*輸入一字符*/ if(ch=='n'||ch=='N')/*如果該字符等于n或N*/ break;/*跳出循環(huán),程序結(jié)束*/ } /*否則,開(kāi)始下一輪循環(huán)*/ close();return;/*返回*/ } void rand1(int j)/*隨機(jī)發(fā)牌函數(shù)*/ { int kind,num;char str[3],n;randomize();while(1)/*循環(huán)直到有牌發(fā)*/ { kind=random(4);/*花色隨機(jī)數(shù)*/ num=random(13);/*大小隨機(jī)數(shù)*/ if(p[kind][num]!=-1)/*該數(shù)未取過(guò)*/ { n=p[kind][num];/*取相應(yīng)位置的撲克牌數(shù)*/ p[kind][num]=-1;/*牌發(fā)好以后相應(yīng)位置的元素置-1*/ break;} } switch(kind)/*花式的判斷*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*紅桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*顯示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*顯示右下角花色*/ if(n!='0')/*輸出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*顯示牌的大小*/ } else/*輸出10的時(shí)候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*發(fā)牌的具體過(guò)程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*畫(huà)空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*畫(huà)矩形框*/ rand1(j);/*隨機(jī)取牌*/ delay(10000);/*延時(shí)顯示*/ } } void init(void)/*圖形驅(qū)動(dòng)*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*圖形關(guān)閉*/ { closegraph();} void change(char *e,char *a)/*中綴字符串e轉(zhuǎn)后綴字符串a(chǎn)函數(shù)*/ { STACK2 *top=NULL;/* 定義棧頂指針*/ int i,j;char w;i=0;j=0;while(e[i]!='