當前位置:編程學習大全網 - 源碼下載 - 2048遊戲源代碼講解大全

2048遊戲源代碼講解大全

掃雷遊戲(C語言版)

運行確認已編譯:

# include & ltgraphics.h & gt

# include & ltstdlib.h & gt

# include & ltdos.h & gt

#定義LEFTPRESS 0xff01

#定義左鍵單擊0xff10

#定義左拖動0xff19

#定義鼠標移動0xff08

結構體

{

int num/*網格的當前狀態是什麽?1有雷,0已經顯示數字或者空白格子*/

int roundnum/*數壹數網格周圍有多少雷*/

int標誌;/*右鍵單擊顯示紅旗的標誌,0沒有紅旗標誌,1有紅旗標誌*/

}礦[10][10];

int game again = 0;/*是否重新開始的變量*/

int gamePLAY = 0;/*是不是第壹次玩遊戲的標誌*/

int mineNUM/*計算已處理網格的數量*/

char randmineNUM[3];/*顯示壹串數字*/

int Keystate

int MouseExist

int MouseButton

int MouseX

int MouseY

void Init(void);/*圖形驅動程序*/

void MouseOn(void);/*鼠標光標顯示*/

void MouseOff(void);/*鼠標光標隱藏*/

void MouseSetXY(int,int);/*設置當前位置*/

int left press(void);/*左按*/

int right press(void);/*按下鼠標右鍵*/

void mouse getxy(void);/*獲取當前位置*/

無效控制(void);/*遊戲開始、重啟和關閉*/

void GameBegain(void);/*遊戲開始屏幕*/

void DrawSmile(無效);/*畫壹張笑臉*/

void DrawRedflag(int,int);/*顯示紅旗*/

void DrawEmpty(int,int,int,int);/*顯示兩個空格*/

void game over(void);/*遊戲結束*/

void GameWin(無效);/*展示勝利*/

int MineStatistics(int,int);/*計算每個網格周圍的雷數*/

int ShowWhite(int,int);/*顯示無雷區的空白部分*/

void玩法(void);/*遊戲過程*/

void Close(無效);/*圖形關閉*/

無效總管(無效)

{

init();

control();

close();

}

Void Init(void)/*圖形開始*/

{

int gd=DETECT,GM;

init graph(& amp;gd,& ampgm," c:\ \ TC ");

}

Void Close(void)/*圖形關閉*/

{

closegraph();

}

Void MouseOn(void)/*鼠標光標顯示*/

{

_ AX = 0x 01;

gen interrupt(0x 33);

}

Void MouseOff(void)/*鼠標光標隱藏*/

{

_ AX = 0x02

gen interrupt(0x 33);

}

Void MouseSetXY(int x,int y)/*設置當前位置*/

{

_ CX = x;

_ DX = y;

_ AX = 0x04

gen interrupt(0x 33);

}

Int LeftPress(void)/*按下鼠標左鍵*/

{

_ AX = 0x03

gen interrupt(0x 33);

回歸(_ BX & amp;1);

}

Int RightPress(void)/*按下鼠標右鍵*/

{

_ AX = 0x03

gen interrupt(0x 33);

回歸(_ BX & amp;2);

}

Voidmousetxy (void)/*獲取當前位置*/

{

_ AX = 0x03

gen interrupt(0x 33);

MouseX = _ CX;

MouseY = _ DX

}

Void Control(void)/*遊戲開始、重啟和關閉*/

{

int game flag = 1;/*遊戲失敗後判斷是否重啟的標誌*/

while(1)

{

If(gameFLAG)/*如果遊戲失敗後沒有決定重啟或退出遊戲,繼續判斷*/

{

GameBegain();/*遊戲初始屏幕*/

遊戲性();/*特定遊戲*/

If(gameAGAIN==1)/*在遊戲中重啟*/

{

game again = 0;

繼續;

}

}

MouseOn();

game flag = 0;

If(LeftPress())/*判斷是否重新開始*/

{

mouse getxy();

if(MouseX & gt;280 & amp& ampMouseX & lt300 & amp& ampMouseY & gt65 & amp& amp老鼠& lt85)

{

game flag = 1;

繼續;

}

}

If(kbhit())/*判斷是否按鍵退出*/

打破;

}

MouseOff();

}

Void DrawSmile(void)/*畫壹個笑臉*/

{

setfillstyle(SOLID_FILL,黃色);

filllellipse(290,75,10,10);

setcolor(黃色);

setfillstyle(SOLID_FILL,黑色);/*眼睛*/

filllellipse(285,75,2,2);

filllellipse(295,75,2,2);

setcolor(黑色);/*嘴*/

bar(287,80,293,81);

}

Void draw dflag (int i,int j)/*顯示紅色標誌*/

{

set color(7);

setfillstyle(SOLID_FILL,紅色);

bar(198+j*20,95+i*20,198+j*20+5,95+I * 20+5);

setcolor(黑色);

line(198+j*20,95+i*20,198+j*20,95+I * 20+10);

}

Void draw empty (int i,int j,int mode,int color)/*顯示兩種空白*/

{

setcolor(顏色);

setfillstyle(SOLID_FILL,color);

If(mode==0)/*未被點擊的大網格*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+I * 20+8);

其他

If(mode==1)/*單擊空白小網格*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+I * 20+7);

}

無效遊戲增益(void)/*遊戲開始屏幕*/

{

int i,j;

clear device();

如果(玩法!=1)

{

MouseSetXY(290,70);/*鼠標的初始位置作為其初始坐標*/

MouseX = 290

MouseY = 70

}

遊戲性= 1;/*下次按重新啟動時,鼠標將不會被重新初始化*/

mineNUM = 0;

setfillstyle(SOLID_FILL,7);

吧(190,60,390,290);

for(I = 0;我& lt10;I++)/*畫壹個網格*/

for(j = 0;j & lt10;j++)

DrawEmpty(i,j,0,8);

set color(7);

draw smile();/*畫壹張臉*/

randomize();__page_break__

for(I = 0;我& lt10;I++)/*100方格隨機分配是否有地雷*/

for(j = 0;j & lt10;j++)

{

我的[我][j]。num = random(8);/*如果隨機數的結果是1,說明這個格子裏有地雷*/

if(我的[i][j]。num==1)

minenum++;/*現有礦井數加1*/

其他

我的[我][j]。num = 2;

我的[我][j]。flag = 0;/*表示沒有紅旗標誌*/

}

sprintf(randmineNUM,“%d”,mineNUM);/*顯示了這次的雷總數* * * *

set color(1);

settextstyle(0,0,2);

outtextxy(210,70,randmineNUM);

mineNUM = 100-mineNUM;/*變量的空白單元格數*/

MouseOn();

}

Void GameOver(void)/*遊戲結束畫面*/

{

int i,j;

set color(0);

for(I = 0;我& lt10;i++)

for(j = 0;j & lt10;j++)

If(我的[i][j]。num==1)/*顯示所有地雷*/

{

DrawEmpty(i,j,0,RED);

setfillstyle(SOLID_FILL,黑色);

filllellipse(200+j * 20,100+i*20,7,7);

}

}

Void GameWin(void)/*顯示勝利*/

{

set color(11);

settextstyle(0,0,2);

outtextxy(230,30,“妳贏了!”);

}

Int MineStatistics(int i,int j)/*統計每個網格周圍的雷數*/

{

int nNUM = 0;

if(I = = 0 & amp;& ampJ==0)/*左上網格的統計*/

{

if(我的[0][1])。num==1)

nnum++;

if(我的[1][0])。num==1)

nnum++;

if(我的[1][1]。num==1)

nnum++;

}

其他

if(I = = 0 & amp;& ampJ==9)/*右上網格的統計*/

{

if(我的[0][8])。num==1)

nnum++;

if(我的[1][9])。num==1)

nnum++;

if(我的[1][8])。num==1)

nnum++;

}

其他

if(I = = 9 & amp;& ampJ==0)/*左下角網格的統計*/

{

if(我的[8][0])。num==1)

nnum++;

if(我的[9][1])。num==1)

nnum++;

if(我的[8][1])。num==1)

nnum++;

}

其他

if(I = = 9 & amp;& ampJ==9)/*右下角網格的統計*/

{

如果(我的[9][8])。num==1)

nnum++;

如果(我的[8][9])。num==1)

nnum++;

如果(我的[8][8])。num==1)

nnum++;

}

Else if(j==0)/*左邊第壹列網格的統計*/

{

if(我的[i][j+1])。num==1)

nnum++;

if(我的[i+1][j]。num==1)

nnum++;

if(我的[i-1][j]。num==1)

nnum++;

if(我的[i-1][j+1])。num==1)

nnum++;

if(我的[i+1][j+1])。num==1)

nnum++;

}

Else if(j==9)/*右邊第壹列網格的統計*/

{

if(我的[i][j-1])。num==1)

nnum++;

if(我的[i+1][j]。num==1)

nnum++;

if(我的[i-1][j]。num==1)

nnum++;

if(我的[i-1][j-1])。num==1)

nnum++;

if(我的[i+1][j-1])。num==1)

nnum++;

}

Else if(i==0)/*第壹個網格的統計*/

{

if(我的[i+1][j]。num==1)

nnum++;

if(我的[i][j-1])。num==1)

nnum++;

if(我的[i][j+1])。num==1)

nnum++;

if(我的[i+1][j-1])。num==1)

nnum++;

if(我的[i+1][j+1])。num==1)

nnum++;

}

Else if(i==9)/*最後壹個網格的統計*/

{

if(我的[i-1][j]。num==1)

nnum++;

if(我的[i][j-1])。num==1)

nnum++;

if(我的[i][j+1])。num==1)

nnum++;

if(我的[i-1][j-1])。num==1)

nnum++;

if(我的[i-1][j+1])。num==1)

nnum++;

}

Else/*普通格的統計*/

{

if(我的[i-1][j]。num==1)

nnum++;

if(我的[i-1][j+1])。num==1)

nnum++;

if(我的[i][j+1])。num==1)

nnum++;

if(我的[i+1][j+1])。num==1)

nnum++;

if(我的[i+1][j]。num==1)

nnum++;

if(我的[i+1][j-1])。num==1)

nnum++;

if(我的[i][j-1])。num==1)

nnum++;

if(我的[i-1][j-1])。num==1)

nnum++;

}__page_break__

返回(nNUM);/*返回網格周圍有多少雷電的統計結果* * * *

}

Int ShowWhite(int i,int j)/*顯示沒有雷區的空白部分*/

{

If(我的[I] [j]。flag = = 1 ||礦[I] [j]。num = = 0)/*如果有紅旗或者網格已經處理過,則不判*/

返回;

mineNUM-;/*顯示數字或空格的格子表示又處理了壹個格子,當所有格子都處理完後,表示勝利*/

if(我的[i][j]。roundnum==0。& amp我的[我][j]。num!=1)/*顯示空間*/

{

DrawEmpty(i,j,1,7);

我的[我][j]。num = 0;

}

其他

if(我的[i][j]。roundnum!=0)/*輸出閃電數*/

{

DrawEmpty(i,j,0,8);

sprintf(randmineNUM," %d ",Mine[i][j]。round num);

setcolor(紅色);

outtextxy(195+j*20,95+i*20,randmineNUM);

我的[我][j]。num = 0;/*已經輸出閃電數的網格表示該網格已經與0壹起使用*/

返回;

}

/*遞歸顯示8個方向的所有空白網格*/

如果(我!= 0 & amp& amp我的[i-1][j]。num!=1)

ShowWhite(i-1,j);

如果(我!= 0 & amp& ampj!= 9 & amp& amp我的[i-1][j+1]。num!=1)

ShowWhite(i-1,j+1);

如果(j!= 9 & amp& amp我的[i][j+1]。num!=1)

ShowWhite(i,j+1);

如果(j!= 9 & amp& amp我!= 9 & amp& amp我的[i+1][j+1]。num!=1)

ShowWhite(i+1,j+1);

如果(我!= 9 & amp& amp我的[i+1][j]。num!=1)

ShowWhite(i+1,j);

如果(我!= 9 & amp& ampj!= 0 & amp& amp我的[i+1][j-1]。num!=1)

ShowWhite(i+1,j-1);

如果(j!= 0 & amp& amp我的[i][j-1]。num!=1)

ShowWhite(i,j-1);

如果(我!= 0 & amp& ampj!= 0 & amp& amp我的[i-1][j-1]。num!=1)

ShowWhite(i-1,j-1);

}

Void遊戲玩法(void)/*遊戲過程*/

{

int i,j,Num/*Num用於接收統計函數並返回壹個網格周圍有多少個地雷*/

for(I = 0;我& lt10;i++)

for(j = 0;j & lt10;j++)

我的[我][j]。roundnum=MineStatistics(i,j);/*計算每個網格周圍有多少地雷*/

而(!kbhit())

{

If(LeftPress())/*按鼠標左鍵*/

{

mouse getxy();

if(MouseX & gt;280 & amp& ampMouseX & lt300 & amp& ampMouseY & gt65 & amp& amp老鼠& lt85)/*重新開始*/

{

MouseOff();

game again = 1;

打破;

}

if(MouseX & gt;190。& ampMouseX & lt390 & amp& ampMouseY & gt90 & amp& amp老鼠& lt290)/*當前鼠標位置在網格內*/

{

j =(MouseX-190)/20;/*x坐標*/

I =(MouseY-90)/20;/*y坐標*/

If(我的[i][j]。flag==1)/*如果網格有紅色標誌,則左鍵無效*/

繼續;

if(我的[i][j]。num!=0)/*如果網格沒有被處理*/

{

If(我的[i][j]。num==1)/*鼠標點擊的格子是地雷*/

{

MouseOff();

game over();/*遊戲失敗*/

打破;

}

Else/*鼠標按下的格子不是地雷*/

{

MouseOff();

Num=MineStatistics(i,j);

If(Num==0)/*如果周圍沒有地雷,使用遞歸算法顯示空白網格*/

ShowWhite(i,j);

Else/*按網格。周圍有地雷*/

{

sprintf(randmineNUM," %d ",Num);/*輸出當前網格周圍的雷數*/

setcolor(紅色);

outtextxy(195+j*20,95+i*20,randmineNUM);

mineNUM-;

}

MouseOn();

我的[我][j]。num = 0;/*選中網格周圍的雷數變為0,表示該網格已被使用*/

if(mineNUM & lt;1)/*勝利*/

{

GameWin();

打破;

}

}

}

}

}

If(RightPress())/*鼠標右鍵鍵盤按*/

{

mouse getxy();

if(MouseX & gt;190。& ampMouseX & lt390 & amp& ampMouseY & gt90 & amp& amp老鼠& lt290)/*當前鼠標位置在網格內*/

{

j =(MouseX-190)/20;/*x坐標*/

I =(MouseY-90)/20;/*y坐標*/

MouseOff();

if(我的[i][j]。flag = = 0 & amp& amp我的[我][j]。num!=0)/*本來沒有紅旗,現在顯示出來了*/

{

DrawRedflag(i,j);

我的[我][j]。flag = 1;

}

其他

If(我的[i][j]。flag==1)/*如果有紅旗標誌,按右按鈕,紅旗消失*/

{

DrawEmpty(i,j,0,8);

我的[我][j]。flag = 0;

}

}

MouseOn();

睡眠(1);

}

}

}

  • 上一篇:華為正式版推送升級鴻蒙OS系統,那麽鴻蒙OS到底是套娃呢?
  • 下一篇:陌生交友APP開發如何打破聊天尷尬問題?
  • copyright 2024編程學習大全網