c語言地雷,c語言地雷遊戲

本文目錄一覽:

C語言 掃雷

#includestdio.h

int main(void)

{

    char plat[100][100];  //雷的地圖

    char plat_new[100][100];  //數字映射圖

    int n, m;  //存儲行、列數

    int in, im;

    int mark = 0;  //記錄該點附近8個坐標雷的總數

    int j = 1;

 

    scanf(“%d %d”, n, m);

    getchar();  //消除回車符的影響

 

    do {

        if (n == 0  m == 0)

            break;

 

        for (in = 0; in  n; in++)

        {

            for (im = 0; im  m; im++)

            {

                scanf(“%c”, plat[in][im]);

            }

            getchar();

        }

 

        for (in = 0; in  n; in++)

            for (im = 0; im  m; im++)

            {

                if (plat[in][im] == ‘*’)  /*該點有雷,無需檢測*/

                {

                    plat_new[in][im]= plat[in][im];

                    continue;

                }

 

                if (in – 1 = 0)  //檢測上面3個點的雷數

                {

                    if (plat[in – 1][im] == ‘*’)

                        mark++;

 

                    if (im – 1 = 0  plat[in -1][im – 1] == ‘*’)

                        mark++;

 

                    if (im + 1  mplat[in -1][im + 1] == ‘*’)

                        mark++;

                }

 

                if (im – 1 = 0  plat[in][im- 1] == ‘*’)  //檢測左右兩個點的雷數

                    mark++;

                if (im + 1  m  plat[in][im+ 1] == ‘*’)

                    mark++;

 

                if (in + 1  n)  //檢測下面3個點的雷數

                {

                    if (plat[in + 1][im] == ‘*’)

                        mark++;

 

                    if (im – 1 = 0  plat[in +1][im – 1] == ‘*’)

                        mark++;

 

                    if (im + 1  mplat[in +1][im + 1] == ‘*’)

                        mark++;

                }

 

                switch (mark)

                {

                case 0:plat_new[in][im] = ‘0’; break;

                case 1:plat_new[in][im] = ‘1’; break;

                case 2:plat_new[in][im] = ‘2’; break;

                case 3:plat_new[in][im] = ‘3’; break;

                case 4:plat_new[in][im] = ‘4’; break;

                case 5:plat_new[in][im] = ‘5’; break;

                case 6:plat_new[in][im] = ‘6’; break;

                case 7:plat_new[in][im] = ‘7’; break;

                case 8:plat_new[in][im] = ‘8’; break;

                }

                mark = 0;  //重置雷數

            }

        if (j != 1)

            putchar(‘\n’);

        printf(“Field#%d:\n”, j);

 

        for (in = 0; in  n; in++)  //列印數字地圖

        {

            for (im = 0; im  m; im++)

            {

                printf(“%c”, plat_new[in][im]);

            }

            if(in!=n-1)

            putchar(‘\n’);

        }

        scanf(“%d %d”, n, m);

        getchar();

        j++;

    } while (1);

    return 0;

}

C語言掃雷演算法,也可以別的語言,解釋清楚演算法就好

在這上面不好說明, 我有C的代碼, 你看一下(DEVC++)

#include stdio.h

#include stdlib.h

#include time.h

#include windows.h

#define n 15

int restart=0;

int last_sel_x,last_sel_y;

char in[20];

struct POINT

{

int x;

int y;

} pt;

//設置CMD窗口游標位置

void setxy(int x, int y)

{

   COORD coord = {x, y};

   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

//獲取當前CMD當前游標所在位置

void getxy()

{

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    COORD coordScreen = {0, 0}; //游標位置

    CONSOLE_SCREEN_BUFFER_INFO csbi;

    if (GetConsoleScreenBufferInfo(hConsole, csbi))

    {

    //    printf(“游標坐標:(%d,%d)\n”,  csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);

     pt.x=csbi.dwCursorPosition.X;

     pt.y=csbi.dwCursorPosition.Y;

    }

}

struct A

{

int value; //-1為雷 

int state; //顯示狀態: 0為未打開, 1為已打開 

int lock;  //鎖定狀態 

int bomb;  //雷已標記: 0為未標記, 1為已標記 

};

struct A s[10][10];

int calc()

{

int i,j,count=0;

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

if(s[i][j].state==0) count++;

}

}

return count;

}

int prt()

{

system(“cls”);

int count=calc();

int i,j;

printf(“%3c”,’ ‘);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_GREEN);  

for(i=0;i10;i++)

{

printf(“%3d”,i);

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  

for(i=0;i10;i++)

{

printf(“\n”);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_GREEN);  

printf(“%3d”,i);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  

for(j=0;j10;j++)

{

if(s[i][j].bomb==1)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED);

printf(“%3c”,’*’);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  

}

else if(s[i][j].state==1)

{

if(s[i][j].value==0) printf(“%3c”,’ ‘);

else printf(“%3d”,s[i][j].value);

}

else

{

printf(“%3c”,’-‘);

}

/* if(s[i][j].value==-1) printf(“%3c”,’*’);

else printf(“%3d”,s[i][j].value);*/

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_GREEN);  

printf(“%3d”,i);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  

}

printf(“\n”);

printf(“%3c”,’ ‘);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_GREEN);  

for(i=0;i10;i++)

{

printf(“%3d”,i);

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  

printf(“\n”);

getxy();

setxy(45,0);

printf(“%d”,count);

setxy(40,5);

printf(“說明”); 

setxy(40,7);

printf(“1: 輸入 *xy(如:*55),則把第5行第5列”);

setxy(40,8);

printf(”   標記為地雷”); 

setxy(40,10);

printf(“2: 輸入 xy(如55),則把第5行第5列打開”); 

if(count==n)

{

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

if(s[i][j].value==-1  s[i][j].bomb==0) s[i][j].bomb=1;

if(s[i][j].value!=-1  s[i][j].state==0) s[i][j].state=1;

}

}

setxy(50,2);

printf(“success!”);

setxy(pt.x,pt.y);

fflush(stdin);

getchar();

return 1;

}

setxy(pt.x,pt.y);

return 0;

}

void space_process(int x,int y)

{

int i,j;

if(x-1=0  y-1=0)

{

if(s[x-1][y-1].value==0   s[x-1][y-1].lock==0) {s[x-1][y-1].state=1; s[x-1][y-1].lock=1; space_process(x-1,y-1);}

else if(s[x-1][y-1].value!=-1) s[x-1][y-1].state=1;

}

if(x-1=0)

{

if(s[x-1][y].value==0  s[x-1][y].lock==0) {s[x-1][y].state=1; s[x-1][y].lock=1; space_process(x-1,y);}

else if(s[x-1][y].value!=-1) s[x-1][y].state=1;

}

if(x-1=0  y+110)

{

if(s[x-1][y+1].value==0   s[x-1][y+1].lock==0) {s[x-1][y+1].state=1; s[x-1][y+1].lock=1; space_process(x-1,y+1);}

else if(s[x-1][y+1].value!=-1) s[x-1][y+1].state=1;

}

if(y-1=0)

{

if(s[x][y-1].value==0   s[x][y-1].lock==0) {s[x][y-1].state=1; s[x][y-1].lock=1; space_process(x,y-1);}

else if(s[x][y-1].value!=-1) s[x][y-1].state=1;

}

if(y+110)

{

if(s[x][y+1].value==0  s[x][y+1].lock==0) {s[x][y+1].state=1; s[x][y+1].lock=1; space_process(x,y+1);}

else if(s[x][y+1].value!=-1) s[x][y+1].state=1;

}

if(x+110  y-1=0)

{

if(s[x+1][y-1].value==0  s[x+1][y-1].lock==0) {s[x+1][y-1].state=1; s[x+1][y-1].lock=1; space_process(x+1,y-1);}

else if(s[x+1][y-1].value!=-1) s[x+1][y-1].state=1;

}

if(x+110)

{

if(s[x+1][y].value==0  s[x+1][y].lock==0) {s[x+1][y].state=1; s[x+1][y].lock=1; space_process(x+1,y);}

else if(s[x+1][y].value!=-1) s[x+1][y].state=1;

}

if(x+110  y+110)

{

if(s[x+1][y+1].value==0  s[x+1][y+1].lock==0) {s[x+1][y+1].state=1; s[x+1][y+1].lock=1; space_process(x+1,y+1);}

else if(s[x+1][y+1].value!=-1) s[x+1][y+1].state=1;

}

}

int process_char(char* t,int* i,int* j)

{

int len=strlen(t);

int x,y=0;

for(x=0;xlen;x++)

{

if(t[x]==’ ‘)

{

continue;

}

else

{

t[y++]=t[x];

}

}

t[y]=’\0′;

if(t[0]==’*’)

{

*i=t[1]-‘0’;

*j=t[2]-‘0’;

if(s[*i][*j].bomb==1)

{

s[*i][*j].bomb=0;

s[*i][*j].state=0;

}

else if(s[*i][*j].bomb==0   s[*i][*j].state==0)

{

s[*i][*j].bomb=1;

}

return 1;

}

else if(t[0]=’0′  t[0]=’9′)

{

*i=t[0]-‘0’;

*j=t[1]-‘0’;

return 0;

}

return 1;

}

int plus(int x, int y) //返回0為出錯,返回1為正確,返回-1為取消 

{

int count=s[x][y].value;

int bomb=0;

if(count==0 || count==-1) return -1;

if(x-1=0  y-1=0)

{

if(s[x-1][y-1].bomb==1) bomb++;

}

if(x-1=0)

{

if(s[x-1][y].bomb==1) bomb++;

}

if(x-1=0  y+110)

{

if(s[x-1][y+1].bomb==1) bomb++;

}

if(y-1=0)

{

if(s[x][y-1].bomb==1) bomb++;

}

if(y+110)

{

if(s[x][y+1].bomb==1) bomb++;

}

if(x+110  y-1=0)

{

if(s[x+1][y-1].bomb==1) bomb++;

}

if(x+110)

{

if(s[x+1][y].bomb==1) bomb++;

}

if(x+110  y+110)

{

if(s[x+1][y+1].bomb==1) bomb++;

}

if(bomb==s[x][y].value)

{

if(x-1=0  y-1=0)

{

if(s[x-1][y-1].value==-1  s[x-1][y-1].bomb==0) {return 0;}

}

if(x-1=0)

{

if(s[x-1][y].value==-1  s[x-1][y].bomb==0) return 0;

}

if(x-1=0  y+110)

{

if(s[x-1][y+1].value==-1  s[x-1][y+1].bomb==0) return 0;

}

if(y-1=0)

{

if(s[x][y-1].value==-1  s[x][y-1].bomb==0) return 0;

}

if(y+110)

{

if(s[x][y+1].value==-1  s[x][y+1].bomb==0) return 0;

}

if(x+110  y-1=0)

{

if(s[x+1][y-1].value==-1  s[x+1][y-1].bomb==0) return 0;

}

if(x+110)

{

if(s[x+1][y].value==-1  s[x+1][y].bomb==0) return 0;

}

if(x+110  y+110)

{

if(s[x+1][y+1].value==-1  s[x+1][y+1].bomb==0) return 0;

}

space_process(x,y);

int i,j;

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

s[i][j].lock=0;

}

}

return 1;

}

else

{

return -1;

}

}

void prt_selected(int x, int y, int flag)

{

if(flag==0)

{

if(x=0) x=last_sel_x;

if(y=0) y=last_sel_y;

}

int plus=2;

getxy();

if(x=0)

{

last_sel_x=x;

setxy(3,x+1);

int j;

if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);

else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

for(j=0;j10;j++)

{

     if(s[x][j].bomb==1)

{

if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |  

            FOREGROUND_RED | BACKGROUND_BLUE);

             else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

printf(“%3c”,’*’); 

}

else if(s[x][j].state==1)

{

if(s[x][j].value==0) printf(“%3c”,’ ‘);

else printf(“%3d”,s[x][j].value);

}

else

{

printf(“%3c”,’-‘);

}

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

}

if(y=0)

{

int i;

last_sel_y=y;

for(i=0;i10;i++)

{

if(last_sel_x==i) continue;

if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);

else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

setxy(3*y+3,i+1);

if(s[i][y].bomb==1)

{

if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |

            FOREGROUND_RED | BACKGROUND_BLUE);

           else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

printf(“%3c”,’*’);

}

else if(s[i][y].state==1)

{

if(s[i][y].value==0) printf(“%3c”,’ ‘);

else printf(“%3d”,s[i][y].value);

}

else

{

printf(“%3c”,’-‘);

}

}

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

setxy(pt.x,pt.y);

}

void input() //實時獲取鍵盤輸入 

{

int c;

int x=-1,y=-1;

int i=0;

int first_num=0; 

while(1)

{

fflush(stdin);

c=getch();

printf(“%c”,c);

if(c==10 || c==13) break;

if(c==8  i0)

{

in[i-1]=’\0′;

if(in[0]==’*’)

{

if(in[1]’0′ || in[1]’9′)

{

x=-1;

prt_selected(last_sel_x,-1,0);

}

if(in[2]’0′ || in[2]’9′)

{

y=-1;

prt_selected(-1,last_sel_y,0);

}

}

else

{

if(in[0]’0′ || in[0]’9′)

{

x=-1;

prt_selected(last_sel_x,-1,0);

}

if(in[1]’0′ || in[1]’9′)

{

y=-1;

prt_selected(-1,last_sel_y,0);

}

}

i–;

getxy();

setxy(pt.x,pt.y);

printf(” “);

setxy(pt.x,pt.y);

}

else if(c==’*’ || (c=’0′  c=’9′))

{

in[i++]=c;

if(in[0]==’*’)

{

if(in[1]!=’\0′  in[1]=’0′  in[1]=’9′)

{

x=in[1]-‘0’;

}

else

{

x=-1;

}

if(in[2]!=’\0′  in[2]=’0′  in[2]=’9′)

{

y=in[2]-‘0’;

}

else

{

y=-1;

}

}

else if(in[0]=’0′  in[0]=’9′)

{

x=in[0]-‘0’;

if(in[1]=’0′  in[1]=’9′)

{

y=in[1]-‘0’;

}

else

{

y=-1;

}

}

else x=-1;

if(x-1) prt_selected(x,-1,1);

if(y-1) prt_selected(-1,y,1);

}

}

}

int main()

{

int i=0,j,x,y;

while(1)

{

restart=0;

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

s[i][j].value=0;

s[i][j].state=0;

s[i][j].lock=0;

s[i][j].bomb=0;

}

}

srand((unsigned)time(0));

i=0;

while(in)

{

x=rand()%10;

y=rand()%10;

if(s[x][y].value!=-1)

{

s[x][y].value=-1;

i++;

}

}

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

if(s[i][j].value==-1) continue;

// n=0;

if(i-1=0)

{

if(s[i-1][j].value==-1) s[i][j].value++;

if(j-1=0)

{

if(s[i-1][j-1].value==-1) s[i][j].value++;

}

if(j+110)

{

if(s[i-1][j+1].value==-1) s[i][j].value++;

}

}

if(i+110)

{

if(s[i+1][j].value==-1) s[i][j].value++;

if(j-1=0)

{

if(s[i+1][j-1].value==-1) s[i][j].value++;

}

if(j+110)

{

if(s[i+1][j+1].value==-1) s[i][j].value++;

}

}

if(j-1=0)

{

if(s[i][j-1].value==-1) s[i][j].value++;

}

if(j+110)

{

if(s[i][j+1].value==-1) s[i][j].value++;

}

}

}

if(prt()==1)

{

restart=1;

continue;

}

while(1)

{

memset(in,’\0′,20);

fflush(stdin);

// scanf(“%[^\n]”,in);

input();

if(process_char(in,i,j)==1)

{

if(prt()==1)

{

restart=1;

break;

}

continue;

}

for(x=0;x10;x++)

{

for(y=0;y10;y++)

{

s[x][y].lock=0;

}

}

if(s[i][j].value==-1)

{

printf(“\nBomb”);

fflush(stdin);

getchar();

restart=1;

}

else if(s[i][j].value==0)

{

s[i][j].state=1;

space_process(i,j);

}

else if(s[i][j].state==1)

{

int re=plus(i,j);

{

switch(re)

{

case -1:

break;

case 0:

printf(“\nBomb”);

fflush(stdin);

getchar();

restart=1;

break;

case 1:break;

}

}

}

else

{

s[i][j].state=1;

}

if(prt()==1 || restart==1)

{

restart=0;

break;

}

}

}

return 0;

}

C語言掃雷源代碼 不用滑鼠 操作 急求!!!

#include stdio.h

#include stdlib.h

#include time.h

#include string.h

#include conio.h

#include windows.h

#define N 3

struct mine_box {

char type; // ‘*’代表地雷,n代表周圍有地雷的地雷數(n=0-8)

char bMarked; // 是否被標記

char bOpened; // 是否被打開

} mine_array[N][N];

int CurrentRow, CurrentCol; // 記錄當前游標的位置

int openedBlank = 0; // 記錄被掀開的格子數

/*將游標定位到屏幕上的某個指定位置的坐標上*/

void gotoxy(int x,int y)

{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

HANDLE hConsoleOut;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,csbiInfo);

csbiInfo.dwCursorPosition.X = x;

csbiInfo.dwCursorPosition.Y = y;

SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);

}

// 顯示一個格子的內容

void printBox(struct mine_box mb)

{

// 格子沒被掀開也沒做標記

if(mb.bOpened == 0 mb.bMarked == 0)

printf(“□”);

// 格子被標記一次

else if(mb.bMarked == 1)

printf(“√”);

// 格子被標記兩次

else if(mb.bMarked == 2)

printf(“?”);

// 格子被掀開,顯示格子中的內容

else

switch(mb.type) {

// 格子中有地雷

case ‘*’:

printf(“⊕”);

break;

// 格子沒有地雷並且四周也沒有地雷

case 0:

printf(“ ”);

break;

case 1:

printf(“1”);

break;

case 2:

printf(“2”);

break;

case 3:

printf(“3”);

break;

case 4:

printf(“4”);

break;

case 5:

printf(“5”);

break;

case 6:

printf(“6”);

break;

case 7:

printf(“7”);

break;

case 8:

printf(“8”);

break;

}

}

// 將游標移動到第row行第col列的格子上

void MoveTo(int row, int col)

{

CurrentRow = row;

CurrentCol = col;

gotoxy(CurrentCol*4+2,CurrentRow*2+1);

}

// 刷新屏幕

void refreshScreen(int state)

{

int i, j;

gotoxy(0, 0);

printf(“┏━”);

for(i = 1; i N; i++)

printf(“┳━”);

printf(“┓\n”);

for(i = 0; i N; i++) {

printf(“┃”);

for(j = 0; j N; j++) {

if(state == -1 mine_array[i][j].bMarked == 1 mine_array[i][j].type != ‘*’) {

printf(“¤”); // 標記錯了地雷

continue;

}

if(state != 0) { // 遊戲結束,將所有的盒子掀開顯示其中內容

mine_array[i][j].bOpened = 1;

mine_array[i][j].bMarked = 0;

}

printBox(mine_array[i][j]);

printf(“┃”);

}

if(i N-1) {

printf(“\n┣”);

for(j = 1; j N; j++) {

printf(“━╋”);

}

printf(“━┫\n”);

}

else {

printf(“\n┗”);

for(j = 1; j N; j++) {

printf(“━┻”);

}

printf(“━┛\n”);

}

}

printf(“按鍵指南:A左移,D右移,W上移,S下移,X翻開,C標記,Q退出\n”);

}

void MoveUp()

{

if(CurrentRow 0) {

CurrentRow –;

MoveTo(CurrentRow, CurrentCol);

}

}

void MoveDown()

{

if(CurrentRow N-1) {

CurrentRow ++;

MoveTo(CurrentRow, CurrentCol);;

}

}

void MoveLeft()

{

if(CurrentCol 0) {

CurrentCol –;

MoveTo(CurrentRow, CurrentCol);

}

}

void MoveRight()

{

if(CurrentCol N-1) {

CurrentCol ++;

MoveTo(CurrentRow, CurrentCol);

}

}

int openMine()

{

int saveRow = CurrentRow, saveCol = CurrentCol;

if(mine_array[CurrentRow][CurrentCol].bOpened)

return 0;

mine_array[CurrentRow][CurrentCol].bOpened = 1;

mine_array[CurrentRow][CurrentCol].bMarked = 0;

if(mine_array[CurrentRow][CurrentCol].type == ‘*’) {

refreshScreen(-1);

MoveTo(N+1, 0);

printf(“失敗!遊戲結束)\n”);

exit(2);

}

printBox(mine_array[CurrentRow][CurrentCol]);

MoveTo(CurrentRow, CurrentCol);

// 進一步要做的是當掀開一個type=0的空格子時,將其周圍沒有地雷的空格子自動掀開

return 1;

}

void markMine()

{

if(mine_array[CurrentRow][CurrentCol].bOpened == 1)

return;

if(mine_array[CurrentRow][CurrentCol].bMarked == 0)

mine_array[CurrentRow][CurrentCol].bMarked = 1;

else if(mine_array[CurrentRow][CurrentCol].bMarked == 1)

mine_array[CurrentRow][CurrentCol].bMarked = 2;

else if(mine_array[CurrentRow][CurrentCol].bMarked ==2)

mine_array[CurrentRow][CurrentCol].bMarked = 0;

printBox(mine_array[CurrentRow][CurrentCol]);

MoveTo(CurrentRow, CurrentCol);

}

main()

{

int num, i, j, row, col, count;

printf(“輸入地雷數: “);

scanf(“%u”, num);

if(num N*N) {

printf(“地雷數超限\n”);

return -1;

}

memset((void*)mine_array, 0, N*N*sizeof(struct mine_box));

//隨機設置num個地雷的位置

srand((unsigned)time(NULL));

for(i=0; inum; i++) {

row = rand()%N;

col = rand()%N;

if(mine_array[row][col].type == 0)

mine_array[row][col].type = ‘*’;

else // 已經有雷了,重新取下一個格子

i–;

}

// 計算每個非雷格子周圍的地雷數

for(row=0; rowN; row++)

{

for(col = 0; col N; col++) {

if(mine_array[row][col].type == ‘*’) {

for(i = row-1; i = row+1; i++) {

for(j = col-1; j = col+1; j++) {

if(i = 0 j = 0 i N j N mine_array[i][j].type != ‘*’)

mine_array[i][j].type ++;

}

}

}

}

}

refreshScreen(0);

MoveTo(N/2, N/2); // 將游標移到中央的位置

do {

switch(getch()) {

case ‘a’:

case ‘A’:

MoveLeft();

break;

case ‘s’:

case ‘S’:

MoveDown();

break;

case ‘d’:

case ‘D’:

MoveRight();

break;

case ‘w’:

case ‘W’:

MoveUp();

break;

case ‘x’:

case ‘X’:

if(openMine() == 1) {

if(++openedBlank == N*N-num) { //所有的空格都被掀開

refreshScreen(1);

MoveTo(N+1, 0);

printf(“成功!遊戲結束。\n”);

exit(0);

}

}

break;

case ‘c’:

case ‘C’:

markMine();

break;

case ‘q’:

case ‘Q’:

MoveTo(N+1, 0);

printf(“是否退出?(y/n)”);

if(getch() == ‘y’)

return 0;

}

} while(1);

}

C語言編簡單的掃雷

給你一個完整的掃雷源碼

#include conio.h

#include graphics.h

#include stdio.h

#include stdlib.h

#include time.h

#include ctype.h

#include “mouse.c”

#define YES 1

#define NO 0

#define XPX 15 /* X pixels by square */

#define YPX 15 /* Y pixels by square */

#define DEFCX 30 /* Default number of squares */

#define DEFCY 28

#define MINE 255-‘0’ /* So that when it prints, it prints char 0xff */

#define STSQUARE struct stsquare

STSQUARE {

unsigned char value; /* Number of mines in the surround squares */

unsigned char sqopen; /* Square is open */

unsigned char sqpress; /* Square is pressed */

unsigned char sqmark; /* Square is marked */

} *psquare;

#define value(x,y) (psquare+(x)*ncy+(y))-value

#define sqopen(x,y) (psquare+(x)*ncy+(y))-sqopen

#define sqpress(x,y) (psquare+(x)*ncy+(y))-sqpress

#define sqmark(x,y) (psquare+(x)*ncy+(y))-sqmark

int XST, /* Offset of first pixel X */

YST,

ncx, /* Number of squares in X */

ncy,

cmines, /* Mines discovered */

initmines, /* Number of initial mines */

sqclosed, /* Squares still closed */

maxy; /* Max. number of y pixels of the screen */

void Graph_init(void);

void Read_param(int argc, char *argv[]);

void Set_mines(int nminas);

void Set_square(int x, int y, int status);

void Mouse_set(void);

void Draw_squares(void);

int Do_all(void);

void Blow_up(void);

void Open_square(int x, int y);

int Open_near_squares(int x, int y);

/************************************************************************/

void main(int argc, char *argv[])

{

if (!mouse_reset()) {

cputs(” ERROR: I can’t find a mouse driver\r\n”);

exit(2);

}

Graph_init();

Read_param(argc, argv);

Mouse_set();

do {

randomize();

cleardevice();

Set_mines(cmines=initmines);

mouse_enable();

Draw_squares();

}

while (Do_all() != ‘\x1b’);

closegraph();

}

/*************************************************************************

* *

* F U N C T I O N S *

* *

*************************************************************************/

/*———————————————————————-*/

void Graph_init(void)

{

int graphdriver=DETECT, graphmode, errorcode;

if(errorcode 0) {

cprintf(“\n\rGraphics System Error: %s\n”,grapherrormsg(errorcode));

exit(98);

}

initgraph(graphdriver, graphmode, “”);

errorcode=graphresult();

if(errorcode!=grOk) {

printf(” Graphics System Error: %s\n”,grapherrormsg(errorcode));

exit(98);

}

maxy=getmaxy();

} /* Graph_init */

/*———————————————————————-*/

void Read_param(int argc, char *argv[])

{

int x, y, m;

x=y=m=0;

if (argc!=1) {

if (!isdigit(*argv[1])) {

closegraph();

cprintf(“Usage is: %s [x] [y] [m]\r\n\n”

“Where x is the horizontal size\r\n”

” y is the vertical size\r\n”

” m is the number of mines\r\n\n”

” Left mouse button: Open the square\r\n”

“Right mouse button: Mark the square\r\n”

” -The first time puts a ‘mine’ mark\r\n”

” -The second time puts a ‘possible ”

“mine’ mark\r\n”

” -The third time unmarks the square\r\n”

“Left+Right buttons: Open the surrounded squares only if ”

“the count of mines\r\n”

” is equal to the number in the square”,argv[0]);

exit (1);

}

switch (argc) {

case 4: m=atoi(argv[3]);

case 3: y=atoi(argv[2]);

case 2: x=atoi(argv[1]);

}

}

XST=100;

ncx=DEFCX;

if (maxy==479) {

YST=30;

ncy=DEFCY;

}

else {

YST=25;

ncy=20;

}

if (x0 xncx)

ncx=x;

if (y0 yncy) {

YST+=((ncy-y)*YPX)1;

ncy=y;

}

initmines= m ? m : ncx*ncy*4/25; /* There are about 16% of mines */

if (((void near*)psquare=calloc(ncx*ncy, sizeof(STSQUARE)))==NULL) {

closegraph();

cputs(“ERROR: Not enought memory”);

exit(3);

}

} /* Read_param */

/*———————————————————————-*/

void Set_mines(int nminas)

{

原創文章,作者:XDGW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/148581.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XDGW的頭像XDGW
上一篇 2024-11-03 15:16
下一篇 2024-11-03 15:16

相關推薦

  • 為什麼不用Python開發遊戲

    Python是一種高級編程語言,擁有簡單易學、代碼簡潔等優點。同時,Python也是一種多用途的語言,可以用於Web開發、數據分析以及機器學習等領域。然而,對於遊戲開發領域,Pyt…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • 使用Python製作遊戲代碼

    Python是一種高級編程語言,因其簡潔明了的代碼風格、易於學習和使用而備受青睞。Python已經成為遊戲製作的熱門選擇之一,可以通過Pygame、Panda3D等工具來實現遊戲制…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論