c語言小游戲代碼-掃雷代碼
《c語言小游戲代碼-掃雷代碼》由會員分享,可在線閱讀,更多相關(guān)《c語言小游戲代碼-掃雷代碼(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、#include
2、[10][10]; int gameAGAIN=0;/*是否重來的變量*/ int gamePLAY=0;/提否是第一次玩游戲的標(biāo)志*/ int mineNUM;/* 統(tǒng)計處理過的格子數(shù) */ char randmineNUM[3];/* 顯示數(shù)字的字符串 */ int Keystate; int MouseExist; int MouseButton; int MouseX; int MouseY; void Init(void);/* 圖形驅(qū)動 */ 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);/* 游戲開始 ,重新 ,關(guān)閉 */ void GameBegain(void);/*游戲開始畫面 */ void DrawSmile(void);/* 畫笑臉 */ void DrawRedflag(int,int);/* 顯示紅旗 */
4、void DrawEmpty(int,int,int,int);/* 兩種空格子的顯示 */ void GameOver(void);/*游戲結(jié)束 */ void GameWin(void);/* 顯示勝利 */ int MineStatistics(int,int);/* 統(tǒng)計每個格子周圍的雷數(shù) */ int ShowWhite(int,int);/* 顯示無雷區(qū)的空白部分 */ void GamePlay(void);/*游戲過程 */ void Close(void);/* 圖形關(guān)閉 */ void main(void){Init(); Control(); Close
5、();}void Init(void)/* 圖形開始 */{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)/*游戲開始,重新,關(guān)閉 */{int gameFLAG=1;/*游 戲失敗后判斷是否重新開始的標(biāo)志 */ while (1){if(gameFLAG)/*游戲失敗后沒判斷出重新開始或者退出游戲的話就繼續(xù)判 斷 */{ GameBegain(); /*游戲初始畫面 */ GamePlay();/*具體游戲 */ if(gameAGAIN==1)/慚戲中重新開始 */{gameAGAIN=0; continue;}} MouseOn(); gameFLAG=0; if(LeftPress())/* 判斷是否重新開始 */{MouseGetXY(); if(MouseX>2
8、80&&MouseX<300&&MouseY>65&&MouseY<85){gameFLAG=1; continue;}} if(kbhit())/* 判斷是否按鍵退出 */ break;}MouseOff();}void DrawSmile(void)/* 畫笑臉 */{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)/* 沒有單擊過的大格子 */ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8); else if(mode==1)/*單擊過后顯示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);}void GameBegain(void)/* 游戲開始畫面 */{int i,j; cleardevice(); if(gamePLAY!=1){
11、MouseSetXY(290,70); /鼠標(biāo)一開始的位置* ,并作為它的初始 坐標(biāo) */ MouseX=290; MouseY=70;}gamePLAY=1;/T次按重新開始的話鼠標(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<1
12、0;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*/ else Mine[i][j].num=2; Mine[i][j].flag=0;/* 表示沒紅旗標(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é)束畫面 */{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)計每個格子周 */{int nNUM=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++;} else if(i==0&&j
15、==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==
16、1) nNUM++; if(Mine[8][9].num==1) nNUM++; if(Mine[8][8].num==1) nNUM++;}else if(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++;}else if(j==9)/*右邊第一列格子
17、的統(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++; 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)計 */{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)計 */{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)計 */{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)計結(jié)果返回 */}int ShowWhite(int i,int j)/* 顯示無雷區(qū)的空白部分 */{if(Mine[i][j].flag==1||Mine[i][j].num==0)/* 如果有紅旗或該格處理過就不對該格 進行任何判斷 */ return; mineNUM--;/* 顯示過數(shù)字或者空格的格子就表示多處理了一個格子 ,當(dāng)所有 格子都處理過了表示勝利 */ 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)用過這個格子 */ return ;}/*8 個方向遞歸顯示所有的空白格子 */ 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)/*游戲過程 */{ int i,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
24、())/* 鼠標(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
25、; if(Mine[i][j].num!=0)/* 如果格子沒有處理過 */{if(Mine[i][j].num==1)/* 鼠標(biāo)按 下的格子是地雷 */{MouseOff(); GameOver();/* 游戲失敗 */ break;}else/* 鼠標(biāo)按下的格子不是地雷 */{MouseOff(); Num=MineStatistics(i,j); if(Num==0)/* 周圍沒地雷就用遞歸算法來顯示空白格子 */ 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;/* 點過的格子周圍雷數(shù)的數(shù)字變?yōu)?0表示這個格子已經(jīng)用 過*/ if(mineNUM<1)/* 勝利了 */{GameWin(); break;}}}}}if(RightPress())/*鼠標(biāo)右鍵鍵盤按下 */{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)/* 本來沒紅旗現(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: 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲成本核算與控制培訓(xùn)課件
- 新員工入職培訓(xùn)思想修養(yǎng)篇(ppt47)
- 同步電機的工作原理及結(jié)構(gòu)特點
- 電影敘事結(jié)構(gòu)模式完整版
- 南州六月荔枝丹課件分析說明方法
- 人教版小學(xué)音樂六下《愛我中華》課件
- &#215;&#215;空調(diào)設(shè)備有限公司整體發(fā)展戰(zhàn)略診斷(PPT 50頁)
- 《酒店培訓(xùn)體系建設(shè)》課件
- 細胞膜系統(tǒng)的結(jié)構(gòu)
- 觸發(fā)器及其應(yīng)用
- 柱體、錐體、臺體的表面積與體積
- 萬能險銷售流程和話術(shù)0
- 紅外光譜基本原理
- 3技術(shù)創(chuàng)新管理-(9)
- 函數(shù)的零點(精品)