欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編

      時(shí)間:2019-05-12 17:18:19下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編》。

      第一篇:編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編

      編游戲 C語(yǔ)言程序設(shè)計(jì)案例精編.txt讓人想念而死,是謀殺的至高境界,就連法醫(yī)也鑒定不出死因。。。C語(yǔ)言 編游戲案例精編 案例一 貪吃蛇游戲 #define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key;int score=0;/*得分*/ int gamespeed=50000;/*游戲速度自己調(diào)整*/ struct Food { int x;/*食物的橫坐標(biāo)*/ int y;/*食物的縱坐標(biāo)*/ int yes;/*判斷是否要出現(xiàn)食物的變量*/ }food;/*食物的結(jié)構(gòu)體*/ struct Snake { int x[N];int y[N];int node;/*蛇的節(jié)數(shù)*/ int direction;/*蛇移動(dòng)方向*/ int life;/* 蛇的生命,0活著,1死亡*/ }snake;void Init(void);/*圖形驅(qū)動(dòng)*/ void Close(void);/*圖形結(jié)束*/ void DrawK(void);/*開(kāi)始畫(huà)面*/ void GameOver(void);/*結(jié)束游戲*/ void GamePlay(void);/*玩游戲具體過(guò)程*/ void PrScore(void);/*輸出成績(jī)*/ /*主函數(shù)*/ void main(void){ Init();/*圖形驅(qū)動(dòng)*/ DrawK();/*開(kāi)始畫(huà)面*/ GamePlay();/*玩游戲具體過(guò)程*/ Close();/*圖形結(jié)束*/ } /*圖形驅(qū)動(dòng)*/ void Init(void){ int gd=DETECT,gm;initgraph(&gd,&gm,“c: c”);cleardevice();} /*開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/ void DrawK(void){ /*setbkcolor(LIGHTGREEN);*/ setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/ for(i=50;i<=600;i+=10)/*畫(huà)圍墻*/ { rectangle(i,40,i+10,49);/*上邊*/ rectangle(i,451,i+10,460);/*下邊*/ } for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左邊*/ rectangle(601,i,610,i+10);/*右邊*/ } } /*玩游戲具體過(guò)程*/ void GamePlay(void){ randomize();/*隨機(jī)數(shù)發(fā)生器*/ food.yes=1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/ snake.life=0;/*活著*/ snake.direction=1;/*方向往右*/ snake.x[0]=100;snake.y[0]=100;/*蛇頭*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*節(jié)數(shù)*/ PrScore();/*輸出得分*/ while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/ { while(!kbhit())/*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/ { if(food.yes==1)/*需要出現(xiàn)新食物*/ { food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/

      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;i595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墻壁*/ { GameOver();/*本次游戲結(jié)束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把畫(huà)面上的食物東西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置*/ snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/ food.yes=1;/*畫(huà)面上需要出現(xiàn)新的食物*/ score+=10;PrScore();/*輸出新得分*/ } setcolor(4);/*畫(huà)出蛇*/ for(i=0;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 /*DOS接口函數(shù)*/ #include /*數(shù)學(xué)函數(shù)的定義*/ #include /*屏幕操作函數(shù)*/ #include /*I/O函數(shù)*/ #include /*庫(kù)函數(shù)*/ #include /*變量長(zhǎng)度參數(shù)表*/ #include /*圖形函數(shù)*/ #include /*字符串函數(shù)*/ #include /*字符操作函數(shù)*/ #define UP 0x48 /*光標(biāo)上移鍵*/ #define DOWN 0x50 /*光標(biāo)下移鍵*/ #define LEFT 0x4b /*光標(biāo)左移鍵*/ #define RIGHT 0x4d /*光標(biāo)右移鍵*/ #define ENTER 0x0d /*回車鍵*/ void *rar;/*全局變量,保存光標(biāo)圖象*/ struct palettetype palette;/*使用調(diào)色板信息*/ int GraphDriver;/* 圖形設(shè)備驅(qū)動(dòng)*/ int GraphMode;/* 圖形模式值*/ int ErrorCode;/* 錯(cuò)誤代碼*/ int MaxColors;/* 可用顏色的最大數(shù)值*/ int MaxX, MaxY;/* 屏幕的最大分辨率*/ double AspectRatio;/* 屏幕的像素比*/ void drawboder(void);/*畫(huà)邊框函數(shù)*/ void initialize(void);/*初始化函數(shù)*/ void computer(void);/*計(jì)算器計(jì)算函數(shù)*/ void changetextstyle(int font, int direction, int charsize);/*改變文本樣式函數(shù)*/ void mwindow(char *header);/*窗口函數(shù)*/ int specialkey(void);/*獲取特殊鍵函數(shù)*/ int arrow();/*設(shè)置箭頭光標(biāo)函數(shù)*/ /*主函數(shù)*/ int main(){ initialize();/* 設(shè)置系統(tǒng)進(jìn)入圖形模式 */ computer();/*運(yùn)行計(jì)算器 */ closegraph();/*系統(tǒng)關(guān)閉圖形模式返回文本模式*/ return(0);/*結(jié)束程序*/ } /* 設(shè)置系統(tǒng)進(jìn)入圖形模式 */ void initialize(void){ int xasp, yasp;/* 用于讀x和y方向縱橫比*/ GraphDriver = DETECT;/* 自動(dòng)檢測(cè)顯示器*/ initgraph(&GraphDriver, &GraphMode, “");/*初始化圖形系統(tǒng)*/ ErrorCode = graphresult();/*讀初始化結(jié)果*/ if(ErrorCode!= grOk)/*如果初始化時(shí)出現(xiàn)錯(cuò)誤*/ { printf(”Graphics System Error: %sn“, grapherrormsg(ErrorCode));/*顯示錯(cuò)誤代碼*/ exit(1);/*退出*/ } getpalette(&palette);/* 讀面板信息*/ MaxColors = getmaxcolor()+ 1;/* 讀取顏色的最大值*/ MaxX = getmaxx();/* 讀屏幕尺寸 */ MaxY = getmaxy();/* 讀屏幕尺寸 */ getaspectratio(&xasp, &yasp);/* 拷貝縱橫比到變量中*/ AspectRatio =(double)xasp/(double)yasp;/* 計(jì)算縱橫比值*/ } /*計(jì)算器函數(shù)*/ void computer(void){ struct viewporttype vp;/*定義視口類型變量*/ int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;float num1=0,num2=0,result;/*操作數(shù)和計(jì)算結(jié)果變量*/ char cnum[5],str2[20]={”“},c,temp[20]={”“};char str1[]=”1230.456+-789*/Qc=^%“;/* 定義字符串在按鈕圖形上顯示的符號(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);/*畫(huà)一個(gè)二維矩形條顯示運(yùn)算數(shù)和結(jié)果*/ setcolor(color+3);/*設(shè)置淡綠顏色邊框線*/ rectangle(x+width*2, y, x+7*width, y+height);/*畫(huà)一個(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;j<4;++j)/*畫(huà)按鈕*/ { for(i=0;i<5;++i){ setfillstyle(SOLID_FILL, color);setcolor(RED);bar(x, y, x+width, y+height);/*畫(huà)一個(gè)矩形條*/ rectangle(x, y, x+width, y+height);sprintf(str2,”%c“,str1[j*5+i]);/*將字符保存到str2中*/ outtextxy(x+(width/2), y+height/2, str2);x =x+width+(width / 2);/*移動(dòng)列坐標(biāo)*/ } y +=(height/2)*3;/* 移動(dòng)行坐標(biāo)*/ x =2*width-width/2;/*復(fù)位列坐標(biāo)*/ } x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y);/*移動(dòng)光標(biāo)到x,y位置*/ arrow();/*顯示光標(biāo)*/ putimage(x,y,rar,XOR_PUT);m=0;n=0;strcpy(str2,”“);/*設(shè)置str2為空串*/ while((v=specialkey())!=45)/*當(dāng)壓下Alt+x鍵結(jié)束程序,否則執(zhí)行下面的循環(huán)*/ { while((v=specialkey())!=ENTER)/*當(dāng)壓下鍵不是回車時(shí)*/ { putimage(x,y,rar,XOR_PUT);/*顯示光標(biāo)圖象*/ if(v==RIGHT)/*右移箭頭時(shí)新位置計(jì)算*/ if(x>=x0+6*width)/*如果右移,移到尾,則移動(dòng)到最左邊字符位置*/ {

      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;kk1)/*判斷左邊*/ { for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){ for(kk=j-1;kk>k&&k>=0;kk--){ a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);} if(kk!=j-1)yes=1;} } if(i<6)/*判斷下邊*/ { for(k=i+1;k<8;k++)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k<8){ for(kk=i+1;kk1)/*判斷上邊*/ { for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){ for(kk=i-1;kk>k&&k>=0;kk--){ a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);} if(kk!=i-1)yes=1;} } if(i>1&&j<6)/*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){ for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j>1)/*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){ for(ii=i+1,jj=j-1;ii1&&j>1)/*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){ for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j<6)/* 右下*/ { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){ for(ii=i+1,jj=j+1;iiscore1)/*開(kāi)始判斷最后的結(jié)果*/ outtextxy(100,50,”black win!“);else if(score2

      案例四 迷宮問(wèn)題

      #include #include #include #include #include #define N 20/*迷宮的大小,可改變*/ int oldmap[N][N];/*遞歸用的數(shù)組,用全局變量節(jié)約時(shí)間*/ int yes=0;/*yes是判斷是否找到路的標(biāo)志,1找到,0沒(méi)找到*/ int way[100][2],wayn=0;/*way數(shù)組是顯示路線用的,wayn是統(tǒng)計(jì)走了幾個(gè)格子*/ void Init(void);/*圖形初始化*/ void Close(void);/*圖形關(guān)閉*/ void DrawPeople(int *x,int *y,int n);/*畫(huà)人工探索物圖*/ void PeopleFind(int(*x)[N]);/*人工探索*/ void WayCopy(int(*x)[N],int(*y)[N]);/*為了8個(gè)方向的遞歸,把舊迷宮圖拷貝給新數(shù)組*/ int FindWay(int(*x)[N],int i,int j);/*自動(dòng)探索函數(shù)*/ void MapRand(int(*x)[N]);/*隨機(jī)生成迷宮函數(shù)*/ void PrMap(int(*x)[N]);/*輸出迷宮圖函數(shù)*/ void Result(void);/*輸出結(jié)果處理*/ void Find(void);/*成功處理*/ void NotFind(void);/*失敗處理*/ void main(void)/*主函數(shù)*/ { int map[N][N];/*迷宮數(shù)組*/ char ch;clrscr();printf(”n Please select hand(1)else auton“);/*選擇探索方式*/ scanf(”%c“,&ch);Init();/*初始化*/ MapRand(map);/*生成迷宮*/ PrMap(map);/*顯示迷宮圖*/ if(ch=='1')PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開(kāi)始探索*/ Result();/*輸出結(jié)果*/ Close();} void Init(void)/*圖形初始化*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void DrawPeople(int *x,int *y,int n)/*畫(huà)人工控制圖*/ {/*如果將以下兩句注釋掉,則顯示人工走過(guò)的路徑,*/ 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è)方向的變化*/ { case 1:(*x)--;break;/*上*/ case 2:(*x)--;(*y)++;break;/*右上*/ case 3:(*y)++;break;/*右*/ case 4:(*x)++;(*y)++;break;/*右下*/ case 5:(*x)++;break;/*下*/ case 6:(*x)++;(*y)--;break;/*左下*/ case 7:(*y)--;break;/*左*/ case 8:(*x)--;(*y)--;break;/*左上*/ } setfillstyle(SOLID_FILL,RED);/*新位置顯示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);} void PeopleFind(int(*map)[N])/*人工手動(dòng)查找*/ { int x,y;char c=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);outtextxy(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“);/*以上是畫(huà)8個(gè)方向的控制介紹*/ setcolor(YELLOW);outtextxy(420,290,”P(pán)ress 'Enter' to end“);/*壓回車鍵結(jié)束*/ setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置顯示*/ while(c!=13)/*如果按下的不是回車鍵*/ { c=getch();/*接收字符后開(kāi)始各個(gè)方向的探索*/ if(c=='w'&&map[x-1][y]!=1)DrawPeople(&x,&y,1);/*上*/ else if(c=='e'&&map[x-1][y+1]!=1)DrawPeople(&x,&y,2);/*右上*/ else if(c=='d'&&map[x][y+1]!=1)DrawPeople(&x,&y,3);/*右*/ else if(c=='c'&&map[x+1][y+1]!=1)

      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=0;i--){ bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+ way[i][1]*15+6,50+way[i][0]*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,”Find a way!“);} void NotFind(void)/*沒(méi)找到通路*/ { setcolor(GREEN);settextstyle(0,0,2);/*設(shè)置字體大小*/ outtextxy(130,400,”Not find a way!“);} void Result(void)/*結(jié)果處理*/ { if(yes)/*如果找到*/ Find();else/*沒(méi)找到路*/ NotFind();getch();} void Close(void)/*圖形關(guān)閉*/ { closegraph();}

      案例五 掃地雷游戲 #include #include #include #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define MOUSEMOVE 0xff08 struct { int num;/*格子當(dāng)前處于什么狀態(tài),1有雷,0已經(jīng)顯示過(guò)數(shù)字或者空白格子*/ int roundnum;/*統(tǒng)計(jì)格子周圍有多少雷*/ int flag;/*右鍵按下顯示紅旗的標(biāo)志,0沒(méi)有紅旗標(biāo)志,1有紅旗標(biāo)志*/ }Mine[10][10];int gameAGAIN=0;/*是否重來(lái)的變量*/ int gamePLAY=0;/*是否是第一次玩游戲的標(biāo)志*/ int mineNUM;/*統(tǒng)計(jì)處理過(guò)的格子數(shù)*/ char randmineNUM[3];/*顯示數(shù)字的字符串*/ int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;void Init(void);/*圖形驅(qū)動(dòng)*/ void MouseOn(void);/*鼠標(biāo)光標(biāo)顯示*/ void MouseOff(void);/*鼠標(biāo)光標(biāo)隱藏*/ void MouseSetXY(int,int);/*設(shè)置當(dāng)前位置*/ int LeftPress(void);/*左鍵按下*/ int RightPress(void);/*鼠標(biāo)右鍵按下*/ void MouseGetXY(void);/*得到當(dāng)前位置*/ void Control(void);/*游戲開(kāi)始,重新,關(guān)閉*/ void GameBegain(void);/*游戲開(kāi)始畫(huà)面*/ void DrawSmile(void);/*畫(huà)笑臉*/ void DrawRedflag(int,int);/*顯示紅旗*/ void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/ void GameOver(void);/*游戲結(jié)束*/ void GameWin(void);/*顯示勝利*/ int MineStatistics(int,int);/*統(tǒng)計(jì)每個(gè)格子周圍的雷數(shù)*/ int ShowWhite(int,int);/*顯示無(wú)雷區(qū)的空白部分*/ void GamePlay(void);/*游戲過(guò)程*/ void Close(void);/*圖形關(guān)閉*/ void main(void){ Init();Control();Close();} void Init(void)/*圖形開(kāi)始*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void Close(void)/*圖形關(guān)閉*/ { closegraph();} void MouseOn(void)/*鼠標(biāo)光標(biāo)顯示*/ { _AX=0x01;geninterrupt(0x33);} void MouseOff(void)/*鼠標(biāo)光標(biāo)隱藏*/ { _AX=0x02;geninterrupt(0x33);} void MouseSetXY(int x,int y)/*設(shè)置當(dāng)前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠標(biāo)左鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠標(biāo)右鍵按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} void MouseGetXY(void)/*得到當(dāng)前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} void Control(void)/*游戲開(kāi)始,重新,關(guān)閉*/ { int gameFLAG=1;/*游戲失敗后判斷是否重新開(kāi)始的標(biāo)志*/ while(1){ if(gameFLAG)/*游戲失敗后沒(méi)判斷出重新開(kāi)始或者退出游戲的話就繼續(xù)判斷*/ { GameBegain();/*游戲初始畫(huà)面*/ GamePlay();/*具體游戲*/ if(gameAGAIN==1)/*游戲中重新開(kāi)始*/ { gameAGAIN=0;continue;} } MouseOn();gameFLAG=0;if(LeftPress())/*判斷是否重新開(kāi)始*/ { MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判斷是否按鍵退出*/ break;} MouseOff();} void DrawSmile(void)/*畫(huà)笑臉*/ { setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);} void DrawRedflag(int i,int j)/*顯示紅旗*/ { setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);} void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/ { setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*沒(méi)有單擊過(guò)的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*單擊過(guò)后顯示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);} void GameBegain(void)/*游戲開(kāi)始畫(huà)面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠標(biāo)一開(kāi)始的位置,并作為它的初始坐標(biāo)*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新開(kāi)始的話鼠標(biāo)不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*畫(huà)格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*畫(huà)臉*/ randomize();for(i=0;i<10;i++)/*100個(gè)格子隨機(jī)賦值有沒(méi)有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果隨機(jī)數(shù)的結(jié)果是1表示這個(gè)格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*現(xiàn)有雷數(shù)加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示沒(méi)紅旗標(biāo)志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*顯示這次總共有多少雷數(shù)*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*變量取空白格數(shù)量*/ MouseOn();} void GameOver(void)/*游戲結(jié)束畫(huà)面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*顯示所有的地雷*/ { DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);fillellipse(200+j*20,100+i*20,7,7);} } void GameWin(void)/*顯示勝利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*統(tǒng)計(jì)每個(gè)格子周圍的雷數(shù)*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的統(tǒng)計(jì)*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的統(tǒng)計(jì)*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的統(tǒng)計(jì)*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else

      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]!='