在这上面不好说明, 我有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
}