#include<stdio.h>
#include<stdlib.h>
//#include"Global.h"
//#include"EmployeeManage.h"
typedef struct Node_T
{
int x;
int y;
}Node;
Node *head = NULL;
int a[9][9] = {0}; //初始化9*9地图
int iCount = 0;
void Preorder(Node *head)
{
Node *p = head;
Node *pt = NULL;
if(a[p->x-1][p->y-1] == 0 && (p->x)>0 && (p->y)>0)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x-1;
pt->y = p->y-1;
a[p->x-1][p->y-1] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x-1][p->y-1]>0 && a[p->x-1][p->y-1]<10 && (p->x)>0 && (p->y)>0)
{
iCount++;
a[p->x-1][p->y-1] += 10;
}
if(a[p->x][p->y-1] == 0 && (p->y)>0)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x;
pt->y = p->y-1;
a[p->x][p->y-1] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x][p->y-1]>0 && a[p->x][p->y-1]<10 && (p->y)>0)
{
iCount++;
a[p->x][p->y-1] += 10;
}
if(a[p->x+1][p->y-1] == 0 && (p->x)<8 && (p->y)>0)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x+1;
pt->y = p->y-1;
a[p->x+1][p->y-1] +=10;
Preorder(pt);
free(pt);
}
else if(a[p->x+1][p->y-1]>0 && a[p->x+1][p->y-1]<10 && (p->x)<8 && (p->y)>0)
{
iCount++;
a[p->x+1][p->y-1] += 10;
}
if(a[p->x-1][p->y] == 0 && (p->x)>0)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x-1;
pt->y = p->y;
a[p->x-1][p->y] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x-1][p->y]>0 && a[p->x-1][p->y]<10 && (p->x)>0)
{
iCount++;
a[p->x-1][p->y] += 10;
}
if(a[p->x+1][p->y] == 0 && (p->x)<8)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x+1;
pt->y = p->y;
a[p->x+1][p->y] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x+1][p->y]>0 && a[p->x+1][p->y]<10 && (p->x)<8)
{
iCount++;
a[p->x+1][p->y] += 10;
}
if(a[p->x-1][p->y+1] == 0 && (p->x)>0 &&(p->y)<8)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x-1;
pt->y = p->y+1;
a[p->x-1][p->y+1] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x-1][p->y+1]>0 && a[p->x-1][p->y+1]<10 && (p->x)>0 &&(p->y)<8)
{
iCount++;
a[p->x-1][p->y+1] += 10;
}
if(a[p->x][p->y-1] == 0 && (p->y)>0)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x;
pt->y = p->y-1;
a[p->x][p->y-1] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x][p->y-1]>0 && a[p->x][p->y-1]<10 && (p->y)>0)
{
iCount++;
a[p->x][p->y-1] += 10;
}
if(a[p->x+1][p->y+1] == 0 && (p->x)<8 &&(p->y)<8)
{
iCount++;
pt = (Node*)malloc(sizeof(Node));
pt->x = p->x+1;
pt->y = p->y+1;
a[p->x+1][p->y+1] += 10;
Preorder(pt);
free(pt);
}
else if(a[p->x+1][p->y+1]>0 && a[p->x+1][p->y+1]<10 && (p->x)<8 &&(p->y)<8)
{
iCount++;
a[p->x+1][p->y+1] += 10;
}
}
int main(void)
{
int iMineNum = 0; //表示雷的个数
int i = 0;
int j = 0;
int x = 0;
int y = 0;
iMineNum = rand()%11; //随机产生了雷数
for(i=0;i<iMineNum;i++) //根据雷的个数和随机产生的坐标布雷
{
x = rand()%9;
y = rand()%9;
if(a[x][y] == -1)
i--;
else
a[x][y] = -1;
}
for(i=0;i<9;i++) //对非雷区进行标记
{
for(j=0;j<9;j++)
{
if(a[i][j] != -1 )
{
if(a[i-1][j] == -1 && i>0)
a[i][j]++;
if(a[i-1][j-1] == -1 && i>0 && j>0)
a[i][j]++;
if(a[i][j-1] == -1 && j>0)
a[i][j]++;
if(a[i+1][j] == -1 && i<8)
a[i][j]++;
if(a[i+1][j+1] == -1 && i<8 && j<8)
a[i][j]++;
if(a[i][j+1] == -1 && j<8)
a[i][j]++;
if(a[i-1][j+1] == -1 && i>0 && j<8)
a[i][j]++;
if(a[i+1][j-1] == -1 && i<8 && j>0)
a[i][j]++;
}
}
}
for(i=0;i<9;i++) //初始化扫雷面板
{
for(j=0;j<9;j++)
printf("%+d\t",a[i][j]);
printf("\n");
}
for(i=0;i<9;i++) //初始化扫雷面板
{
for(j=0;j<9;j++)
printf("*\t");
printf("\n");
}
while(iCount < (81-iMineNum))
{
printf("请输入你选择的横坐标:");
scanf("%d",&x);
printf("请输入你选择的纵坐标:");
scanf("%d",&y);
if(a[x][y] == -1)
{
printf("you lost the game\n");
break;
}
else if(a[x][y]>0 && a[x][y]<8)
{
a[x][y] +=10;
iCount++;
}
else if(a[x][y] == 0)
{
head = (Node*)malloc(sizeof(Node));
iCount ++;
head->x = x;
head->y = y;
Preorder(head);
}
else
{
printf("不能重复选该点\n");
}
system("cls");
for(i=0;i<9;i++) //打印出已经标记的雷区
{
for(j=0;j<9;j++)
{
if(a[i][j] >= 10)
printf("%+d\t",a[i][j]%10);
else
printf("*\t");
}
printf("\n");
}
}
free(head);
return 0;
}
程序中随机数的获取有点问题,递归时候可能会存在内存泄漏,大家感兴趣的可以改改。因为课余写的像注释变量命名都不够得体,希望大家可以挑挑刺。