这周经过我艰辛的奋斗,完成了个扫雷的小代码,创建了两个棋盘,一个是放置雷(0/1),另一个棋盘存储信息,存储我输入坐标进行游戏扫雷存放的信息,同时每扫一个坐标会将坐标周围的8个位置是否有雷反馈到坐标上。当周围没有雷时,使用了递归函数,将周围8个坐标的周围8个坐标进行计算,反馈给他们有没有雷。本程序屏蔽了8段代码,那8段代码代表右边四个方位不会进行自动计算排除反馈,因为加上去有错误,还未解决。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//棋盘行
#define COL 9//棋盘列
#define ROWS ROW+2
#define COLS COL+2
#define s_count 10//布置雷的个数
void meau()
{
printf("************************\n");
printf("****1.plaay 0.exit ****\n");
printf("************************\n");
}
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
int i=0;
int j=0;
for(i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
board[i][j]=set;//初始化棋盘每个信息设置为'0'/'*'
}
}
}
void playboard(char board[ROWS][COLS],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<=col;i++)
{
printf("%d ",i);//打印出第一行坐标位置信息
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d ",i);//打印出第一列坐标位置信息
for(j=1;j<=col;j++)
{
printf("%c ",board[i][j]);//打印每列棋盘信息
}
printf("\n");
}
}
void setray(char board[ROWS][COLS],int row,int col)
{
int count=s_count;
while(count)
{
int a=rand()%row+1;//生成随机数a
int b=rand()%col+1;//生成随机数b
if(board[a][b]=='0')
{
board[a][b]='1';//布置雷'1'
count--;
}
}
}
int showboard(char mine[ROWS][COLS],int x,int y)
{
//'0'的ASCII值为48,'1'为49.所以周围8个的值减去8*'0'得到周围坐标的整数值
//将得到的值返回给x,y坐标
return mine[x-1][y]+
mine[x-1][y-1]+
mine[x][y-1]+
mine[x+1][y-1]+
mine[x+1][y]+
mine[x+1][y+1]+
mine[x][y+1]+
mine[x-1][y+1]-8*'0';
}
void getboard(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
//如果x,y坐标的值为'0',将x,y周围8个坐标各自的周围8个坐标的值计算出来放在各自的坐标里
int count1=showboard(mine,x-1,y);
int count2=showboard(mine,x-1,y-1);
int count3=showboard(mine,x,y-1);
int count4=showboard(mine,x+1,y-1);
int count5=showboard(mine,x+1,y);
int count6=showboard(mine,x+1,y+1);
int count7=showboard(mine,x,y+1);
int count8=showboard(mine,x-1,y+1);
show[x-1][y]=count1+'0';
if(show[x-1][y]=='0' && x-1>0 )//如过周围八个坐标的各自的坐标有的值为0
getboard(mine,show,x-1,y);//则继续调用此函数
show[x-1][y-1]=count2+'0';
if(show[x-1][y-1]=='0' && x-1>0 && y-1>0)
getboard(mine,show,x-1,y-1);
show[x][y-1]=count3+'0';
if(show[x][y-1]=='0' && y-1>0)
getboard(mine,show,x,y-1);
show[x+1][y-1]=count4+'0';
if(show[x+1][y-1]=='0' && x+1<ROW-1 && y-1>0)
getboard(mine,show,x+1,y-1);
show[x+1][y]=count5+'0';
//if(show[x+1][y]=='0' && x+1<ROW)
//getboard(mine,show,x+1,y);
show[x+1][y+1]=count6+'0';
//if(show[x+1][y+1]=='0' && x+1<ROW && y+1<COL)
//getboard(mine,show,x+1,y+1);
show[x][y+1]=count7+'0';
//if(show[x][y+1]=='0' && y<COL)
//getboard(mine,show,x,y+1);
show[x-1][y+1]=count8+'0';
//if(show[x-1][y+1]=='0' && x-1>1 && y+1<COL)
//getboard(mine,show,x-1,y+1);
}
void sweepboard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x=0;
int y=0;
int z=0;
int i=0;
int j=0;
int c=0;
while(z<ROW*COL-s_count)//当z小于棋盘总数减去雷的数量
{
printf("请开始输入坐标\n");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(mine[x][y]=='1')//当排雷排到'1'时,游戏失败
{
printf("恭喜你壮烈牺牲,你被雷炸死了,END\n");
playboard(mine,ROW,COL);
break;
}
else
{
int count=showboard(mine,x,y);//将x,y坐标附近的8个坐标里的字符相加的值放在x,y坐标里
show[x][y]=count+'0';//将x,y坐标的数值加'0'等于'x,y坐标值'
if(show[x][y]=='0')//如果x,y坐标的值为'0'
{
getboard(mine,show,x,y);
}
playboard(show,ROW,COL);
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
if(show[i][j]!='*')
c++;
}
}
z=c;
c=0;
if(ROW*COL-s_count==z)
printf("恭喜你,排雷成功");
}
}
else
printf("输入错误,请重新输入\n");
}
}
void game()
{
char mine[ROWS][COLS]={0};
char show[ROWS][COLS]={0};
InitBoard(mine,ROWS,COLS, '0');//初始化棋盘设置为'0'
InitBoard(show,ROWS,COLS, '*');//初始化棋盘设置为'*'
//playboard(mine,ROW,COL);//打印初始化棋盘
playboard(show,ROW,COL);//打印下载的棋盘
setray(mine,ROW,COL);//布置雷
playboard(mine,ROW,COL);//打印布置好雷的棋盘
sweepboard(mine,show,ROW,COL);//开始扫雷
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));//根据时间随机生成一个随机数
meau();//游戏界面
do//开始游戏前先循环一次
{
printf("开始游戏>:(1/0)");//游戏进入选择
scanf("%d",&input);//输入选择
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重试");
}
}
while(input);
return 0;
}
标签:show,int,mine,COLS,扫雷,坐标,printf From: https://blog.51cto.com/u_15801101/5826009