c語言小游戲代碼-掃雷代碼_第1頁
c語言小游戲代碼-掃雷代碼_第2頁
c語言小游戲代碼-掃雷代碼_第3頁
c語言小游戲代碼-掃雷代碼_第4頁
c語言小游戲代碼-掃雷代碼_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PAGE#include<graphics.h>#include<stdlib.h>#include<dos.h>#defineLEFTPRESS0xff01#defineLEFTCLICK0xff10#defineLEFTDRAG0xff19#defineMOUSEMOVE0xff08struct{intnum;/*格子當前處于什么狀態(tài),1有雷,0已經(jīng)顯示過數(shù)字或者空白格子*/introundnum;/*統(tǒng)計格子周圍有多少雷*/intflag;/*右鍵按下顯示紅旗的標志,0沒有紅旗標志,1有紅旗標志*/}Mine[10][10];intgameAGAIN=0;/*是否重來的變量*/intgamePLAY=0;/*是否是第一次玩游戲的標志*/intmineNUM;/*統(tǒng)計處理過的格子數(shù)*/charrandmineNUM[3];/*顯示數(shù)字的字符串*/intKeystate;intMouseExist;intMouseButton;intMouseX;intMouseY;voidInit(void);/*圖形驅(qū)動*/voidMouseOn(void);/*鼠標光標顯示*/voidMouseOff(void);/*鼠標光標隱藏*/voidMouseSetXY(int,int);/*設(shè)置當前位置*/intLeftPress(void);/*左鍵按下*/intRightPress(void);/*鼠標右鍵按下*/voidMouseGetXY(void);/*得到當前位置*/voidControl(void);/*游戲開始,重新,關(guān)閉*/voidGameBegain(void);/*游戲開始畫面*/voidDrawSmile(void);/*畫笑臉*/voidDrawRedflag(int,int);/*顯示紅旗*/voidDrawEmpty(int,int,int,int);/*兩種空格子的顯示*/voidGameOver(void);/*游戲結(jié)束*/voidGameWin(void);/*顯示勝利*/intMineStatistics(int,int);/*統(tǒng)計每個格子周圍的雷數(shù)*/intShowWhite(int,int);/*顯示無雷區(qū)的空白部分*/voidGamePlay(void);/*游戲過程*/voidClose(void);/*圖形關(guān)閉*/voidmain(void){Init();Control();Close();}voidInit(void)/*圖形開始*/{intgd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");}voidClose(void)/*圖形關(guān)閉*/{closegraph();}voidMouseOn(void)/*鼠標光標顯示*/{_AX=0x01;geninterrupt(0x33);}voidMouseOff(void)/*鼠標光標隱藏*/{_AX=0x02;geninterrupt(0x33);}voidMouseSetXY(intx,inty)/*設(shè)置當前位置*/{_CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);}intLeftPress(void)/*鼠標左鍵按下*/{_AX=0x03;geninterrupt(0x33);return(_BX&1);}intRightPress(void)/*鼠標右鍵按下*/{_AX=0x03;geninterrupt(0x33);return(_BX&2);}voidMouseGetXY(void)/*得到當前位置*/{_AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;}voidControl(void)/*游戲開始,重新,關(guān)閉*/{intgameFLAG=1;/*游戲失敗后判斷是否重新開始的標志*/while(1){if(gameFLAG)/*游戲失敗后沒判斷出重新開始或者退出游戲的話就繼續(xù)判斷*/{GameBegain();/*游戲初始畫面*/GamePlay();/*具體游戲*/if(gameAGAIN==1)/*游戲中重新開始*/{gameAGAIN=0;continue;}}MouseOn();gameFLAG=0;if(LeftPress())/*判斷是否重新開始*/{MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){gameFLAG=1;continue;}}if(kbhit())/*判斷是否按鍵退出*/break;}MouseOff();}voidDrawSmile(void)/*畫笑臉*/{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);}voidDrawRedflag(inti,intj)/*顯示紅旗*/{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);}voidDrawEmpty(inti,intj,intmode,intcolor)/*兩種空格子的顯示*/{setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*沒有單擊過的大格子*/bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);elseif(mode==1)/*單擊過后顯示空白的小格子*/bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);}voidGameBegain(void)/*游戲開始畫面*/{inti,j;cleardevice();if(gamePLAY!=1){MouseSetXY(290,70);/*鼠標一開始的位置,并作為它的初始坐標*/MouseX=290;MouseY=70;}gamePLAY=1;/*下次按重新開始的話鼠標不重新初始化*/mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*畫格子*/for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*畫臉*/randomize();for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/for(j=0;j<10;j++){Mine[i][j].num=random(8);/*如果隨機數(shù)的結(jié)果是1表示這個格子有地雷*/if(Mine[i][j].num==1)mineNUM++;/*現(xiàn)有雷數(shù)加1*/elseMine[i][j].num=2;Mine[i][j].flag=0;/*表示沒紅旗標志*/}sprintf(randmineNUM,"%d",mineNUM);/*顯示這次總共有多少雷數(shù)*/setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*變量取空白格數(shù)量*/MouseOn();}voidGameOver(void)/*游戲結(jié)束畫面*/{inti,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);}}voidGameWin(void)/*顯示勝利*/{setcolor(11);settextstyle(0,0,2);outtextxy(230,30,"YOUWIN!");}intMineStatistics(inti,intj)/*統(tǒng)計每個格子周圍的雷數(shù)*/{intnNUM=0;if(i==0&&j==0)/*左上角格子的統(tǒng)計*/{if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;}elseif(i==0&&j==9)/*右上角格子的統(tǒng)計*/{if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;}elseif(i==9&&j==0)/*左下角格子的統(tǒng)計*/{if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;}elseif(i==9&&j==9)/*右下角格子的統(tǒng)計*/{if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;}elseif(j==0)/*左邊第一列格子的統(tǒng)計*/{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++;}elseif(j==9)/*右邊第一列格子的統(tǒng)計*/{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++;}elseif(i==0)/*第一行格子的統(tǒng)計*/{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++;}elseif(i==9)/*最后一行格子的統(tǒng)計*/{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)計*/{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)gnNUM++;if(Mine[i-1][j-1].num==1)nNUM++;}return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計結(jié)果返回*/}intShowWhite(inti,intj)/*顯示無雷區(qū)的空白部分*/{if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/{DrawEmpty(i,j,1,7);Mine[i][j].num=0;}elseif(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)用過這個格子*/return;}/*8個方向遞歸顯示所有的空白格子*/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);}voidGamePlay(void)/*游戲過程*/{inti,j,Num;/*Num用來接收統(tǒng)計函數(shù)返回一個格子周圍有多少地雷*/for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計每個格子周圍有多少地雷*/while(!kbhit()){if(LeftPress())/*鼠標左鍵盤按下*/{MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/{MouseOff();gameAGAIN=1;break;}if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前鼠標位置在格子范圍內(nèi)*/{j=(MouseX-190)/20;/*x坐標*/i=(MouseY-90)/20;/*y坐標*/if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/continue;if(Mine[i][j].num!=0)/*如果格子沒有處理過*/{if(Mine[i][j].num==1)/*鼠標按下的格子是地雷*/{MouseOff();GameOver();/*游戲失敗*/break;}else/*鼠標按下的格子不是地雷*/{MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周圍沒地雷就用遞歸算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論