C语言扫雷算法,也可以别的语言,解释清楚算法就好

Python021

C语言扫雷算法,也可以别的语言,解释清楚算法就好,第1张

在这上面不好说明, 我有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=0i<10i++)

{

for(j=0j<10j++)

{

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=0i<10i++)

{

printf("%3d",i)

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | 

            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)  

for(i=0i<10i++)

{

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=0j<10j++)

{

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=0i<10i++)

{

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=0i<10i++)

{

for(j=0j<10j++)

{

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+1<10)

{

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+1<10)

{

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+1<10 && 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<10)

{

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<10 && y+1<10)

{

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=0x<lenx++)

{

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+1<10)

{

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

}

if(y-1>=0)

{

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

}

if(y+1<10)

{

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

}

if(x+1<10 && y-1>=0)

{

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

}

if(x+1<10)

{

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

}

if(x+1<10 && y+1<10)

{

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+1<10)

{

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+1<10)

{

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

}

if(x+1<10 && y-1>=0)

{

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

}

if(x+1<10)

{

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

}

if(x+1<10 && y+1<10)

{

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=0i<10i++)

{

for(j=0j<10j++)

{

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=0j<10j++)

{

     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=0i<10i++)

{

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 && i>0)

{

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=0i<10i++)

{

for(j=0j<10j++)

{

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(i<n)

{

x=rand()%10

y=rand()%10

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

{

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

i++

}

}

for(i=0i<10i++)

{

for(j=0j<10j++)

{

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+1<10)

{

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

}

}

if(i+1<10)

{

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+1<10)

{

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+1<10)

{

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=0x<10x++)

{

for(y=0y<10y++)

{

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

}

#include<stdio.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 < m&&plat[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 < m&&plat[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

}