C語言編寫的掃雷游戲源代碼11_第1頁
C語言編寫的掃雷游戲源代碼11_第2頁
C語言編寫的掃雷游戲源代碼11_第3頁
C語言編寫的掃雷游戲源代碼11_第4頁
C語言編寫的掃雷游戲源代碼11_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第頁C語言編寫的掃雷游戲源代碼/*源程序*/#include<graphics.h>#include<stdlib.h>#include<dos.h>#defineLE0xff01#defineLEFTCLICK0xff10#defineLEFTDRAG0xff19#defineMOUSEMOVE0xff08structintnum;/*格子當(dāng)前處于什么狀態(tài),1有雷,0已經(jīng)顯示過數(shù)字或者空白格子*/introundnum;/*統(tǒng)計格子周圍有多少雷*/intflag;/*右鍵按下顯示紅旗的標(biāo)志,0沒有紅旗標(biāo)志,1有紅旗標(biāo)志*/}Mine[10][10];intgameAGAIN=0;/*是否重來的變量*/intgamePLAY=0;/*是否是第一次玩游戲的標(biāo)志*/intmineNUM;/*統(tǒng)計處理過的格子數(shù)*/charrandmineNUM[3];/*顯示數(shù)字的字符串*/intKeystate;intMouseExist;intMouseButton;intMouseX;intMouseY;voidInit(void);/*圖形驅(qū)動*/voidMouseOn(void);/*鼠標(biāo)光標(biāo)顯示*/voidMouseOff(void);/*鼠標(biāo)光標(biāo)隱藏*/voidMouseSetXY(int,int);/*設(shè)置當(dāng)前位置*/intLe(void);/*左鍵按下*/intRightPress(void);/*鼠標(biāo)右鍵按下*/voidMouseGetXY(void);/*得到當(dāng)前位置*/voidControl(void);/*游戲開場,重新,關(guān)閉*/voidGameBegain(void);/*游戲開場畫面*/voidDrawSmile(void);/*畫笑臉*/voidDrawRedflag(int,int);/*顯示紅旗*/voidDrawEmpty(int,int,int,int);/*兩種空格子的顯示*/voidGameOver(void);/*游戲完畢*/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)/*鼠標(biāo)光標(biāo)顯示*/_AX=0x01;geninterrupt(0x33);voidMouseOff(void)/*鼠標(biāo)光標(biāo)隱藏*/_AX=0x02;geninterrupt(0x33);voidMouseSetXY(intx,inty)/*設(shè)置當(dāng)前位置*/_CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);intLe(void)/*鼠標(biāo)左鍵按下*/_AX=0x03;geninterrupt(0x33);return(_BX&1);intRightPress(void)/*鼠標(biāo)右鍵按下*/_AX=0x03;geninterrupt(0x33);return(_BX&2);voidMouseGetXY(void)/*得到當(dāng)前位置*/_AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;voidControl(void)/*游戲開場,重新,關(guān)閉*/intgameFLAG=1;/*游戲失敗后判斷是否重新開場的標(biāo)志*/while(1)if(gameFLAG)/*游戲失敗后沒判斷出重新開場或者退出游戲的話就繼續(xù)判斷*/ GameBegain();/*游戲初始畫面*/ GamePlay();/*具體游戲*/ if(gameAGAIN==1)/*游戲中重新開場*/ gameAGAIN=0; continue;MouseOn();gameFLAG=0;if(Le())/*判斷是否重新開場*/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);/*鼠標(biāo)一開場的位置,并作為它的初始坐標(biāo)*/MouseX=290;MouseY=70;gamePLAY=1;/*下次按重新開場的話鼠標(biāo)不重新初始化*/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個格子隨機(jī)賦值有沒有地雷*/for(j=0;j<10;j++) Mine[i][j].num=random(8);/*如果隨機(jī)數(shù)的結(jié)果是1表示這個格子有地雷*/ if(Mine[i][j].num==1) mineNUM++;/*現(xiàn)有雷數(shù)加1*/ else Mine[i][j].num=2; Mine[i][j].flag=0;/*表示沒紅旗標(biāo)志*/sprintf(randmineNUM,"%d",mineNUM);/*顯示這次總共有多少雷數(shù)*/setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*變量取空白格數(shù)量*/MouseOn();voidGameOver(void)/*游戲完畢畫面*/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++;else if(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++; else if(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) nNUM++; 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)/*如果有紅旗或該格處理過就不對該格進(jìn)展任何判斷*/return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當(dāng)所有格子都處理過了表示勝利*/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(Le())/*鼠標(biāo)左鍵盤按下*/ MouseGetXY(); if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/ 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)/*如果格子有紅旗那么左鍵無效*/ continue; if(Mine[i][j].num!=0)/*如果格子沒有處理過*/ if(Mine[i][j].num==1)/*鼠標(biāo)按下的格子是地雷*/ MouseOff(); GameOver();/*游戲失敗

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論