c語(yǔ)言小游戲代碼-掃雷代碼
《c語(yǔ)言小游戲代碼-掃雷代碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《c語(yǔ)言小游戲代碼-掃雷代碼(13頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、#include
2、[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) */ 1 / 13 void MouseOn(void);/* 鼠標(biāo)光標(biāo)顯示 */ void MouseOff(vo
3、id);/* 鼠標(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);/* 顯示紅旗 */
4、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
5、();}void Init(void)/* 圖形開(kāi)始 */{int gd=DETECT,gm; initgraph(&gd,&gm,"c: \\tc");}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=
6、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)/*得至U當(dāng)前位置 */{_AX=0x03; geninterrupt(0x33); MouseX=_CX; MouseY=_DX;}void Control(voi
7、d)/*游戲開(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>2
8、80&&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,
9、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)/* 兩種空
10、格子的顯示 */{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){
11、MouseSetXY(290,70); /鼠標(biāo)一開(kāi)始的位置* ,并作為它的初始 坐標(biāo) */ MouseX=290; MouseY=70;}gamePLAY=1;/T次按重新開(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<1
12、0;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); ou
13、ttextxy(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);}}
14、 void GameWin(void)/* 顯示勝利 */{setcolor (11); settextstyle(0,0,2); outtextxy(230,30,"YOU WIN!");}int MineStatistics(int i,int j)/* 統(tǒng)計(jì)每個(gè)格子周 */{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
15、==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==
16、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)/*右邊第一列格子
17、的統(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++; 8 / 13 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]
18、.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/*普通格
19、子的統(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)g nNUM++; if(Mine[i-1][j-1].num==1) nNUM++;}return(nNUM)
20、;/* 把格子周圍一共有多少雷數(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
21、].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
22、(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&&M
23、ine[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
24、())/* 鼠標(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
25、; 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)前格 子周圍的
26、雷數(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)?0表示這個(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
27、=(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);}}} 13 / 13
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融工具之原生金融工具
- 藥品不良反應(yīng)及其監(jiān)測(cè)的意義課件
- 采煤工藝設(shè)計(jì)
- 一年級(jí)交通安全教育
- 賬戶體系與分類
- 藍(lán)莓酒營(yíng)銷合作方案
- 菜單設(shè)計(jì)-菜單重要性和分類
- 天津某地產(chǎn)水晶城推廣案方案(PPT31頁(yè))
- 食品安全事故流行病學(xué)調(diào)查規(guī)范
- 報(bào)關(guān)業(yè)務(wù)資料(精品)
- 學(xué)前班拼音測(cè)試題_幼兒讀物_幼兒教導(dǎo)_教導(dǎo)專區(qū)
- 食品安全問(wèn)題分析
- 稅法小知識(shí):房屋贈(zèng)予稅郭治
- 解答-運(yùn)籌學(xué)-第一章-線性規(guī)劃及其單純形法習(xí)題
- 面顱創(chuàng)傷的CT表現(xiàn)-課件